diff options
81 files changed, 8589 insertions, 451 deletions
diff --git a/.gitignore b/.gitignore index aa715b2b1..1f7c61063 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ +.bundle .sass-cache/ _site/ node_modules/ - +vendor/bundle diff --git a/Gemfile.lock b/Gemfile.lock index cbcdf8550..75fe2bdf3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,90 +2,120 @@ GEM remote: https://rubygems.org/ specs: RedCloth (4.2.9) - activesupport (4.1.1) - i18n (~> 0.6, >= 0.6.9) + activesupport (4.2.0) + i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) - thread_safe (~> 0.1) + thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) blankslate (2.1.2.4) - classifier (1.3.4) - fast-stemmer (>= 1.0.0) + celluloid (0.16.0) + timers (~> 4.0.0) + classifier-reborn (2.0.3) + fast-stemmer (~> 1.0) + coffee-script (2.3.0) + coffee-script-source + execjs + coffee-script-source (1.8.0) colorator (0.1) - commander (4.1.6) - highline (~> 1.6.11) + execjs (2.2.2) fast-stemmer (1.0.2) - ffi (1.9.3) - gemoji (1.5.0) - github-pages (19) + ffi (1.9.6) + gemoji (2.1.0) + github-pages (31) RedCloth (= 4.2.9) - jekyll (= 1.5.1) - jekyll-mentions (= 0.0.6) - jekyll-redirect-from (= 0.3.1) - jekyll-sitemap (= 0.3.0) - jemoji (= 0.1.0) + github-pages-health-check (~> 0.2) + jekyll (= 2.4.0) + jekyll-coffeescript (= 1.0.1) + jekyll-mentions (= 0.2.1) + jekyll-redirect-from (= 0.6.2) + jekyll-sass-converter (= 1.2.0) + jekyll-sitemap (= 0.6.3) + jemoji (= 0.4.0) kramdown (= 1.3.1) - liquid (= 2.5.5) + liquid (= 2.6.1) maruku (= 0.7.0) + mercenary (~> 0.3) + pygments.rb (= 0.6.0) rdiscount (= 2.1.7) - redcarpet (= 2.3.0) - highline (1.6.21) - html-pipeline (1.5.0) + redcarpet (= 3.1.2) + terminal-table (~> 1.4) + github-pages-health-check (0.2.1) + net-dns (~> 0.6) + public_suffix (~> 1.4) + hitimes (1.2.2) + html-pipeline (1.9.0) activesupport (>= 2) nokogiri (~> 1.4) - i18n (0.6.9) - jekyll (1.5.1) - classifier (~> 1.3) + i18n (0.7.0) + jekyll (2.4.0) + classifier-reborn (~> 2.0) colorator (~> 0.1) - commander (~> 4.1.3) - liquid (~> 2.5.5) - listen (~> 1.3) - maruku (= 0.7.0) - pygments.rb (~> 0.5.0) - redcarpet (~> 2.3.0) + jekyll-coffeescript (~> 1.0) + jekyll-gist (~> 1.0) + jekyll-paginate (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.3) + liquid (~> 2.6.1) + mercenary (~> 0.3.3) + pygments.rb (~> 0.6.0) + redcarpet (~> 3.1) safe_yaml (~> 1.0) toml (~> 0.1.0) - jekyll-mentions (0.0.6) - html-pipeline (~> 1.5.0) - jekyll (~> 1.4) - jekyll-redirect-from (0.3.1) - jekyll (~> 1.4) - jekyll-sitemap (0.3.0) - jekyll (~> 1.4) - jemoji (0.1.0) - gemoji (~> 1.5.0) - html-pipeline (~> 1.5.0) - jekyll (~> 1.4) - json (1.8.1) + jekyll-coffeescript (1.0.1) + coffee-script (~> 2.2) + jekyll-gist (1.1.0) + jekyll-mentions (0.2.1) + html-pipeline (~> 1.9.0) + jekyll (~> 2.0) + jekyll-paginate (1.1.0) + jekyll-redirect-from (0.6.2) + jekyll (~> 2.0) + jekyll-sass-converter (1.2.0) + sass (~> 3.2) + jekyll-sitemap (0.6.3) + jekyll-watch (1.2.0) + listen (~> 2.7) + jemoji (0.4.0) + gemoji (~> 2.0) + html-pipeline (~> 1.9) + jekyll (~> 2.0) + json (1.8.2) kramdown (1.3.1) - liquid (2.5.5) - listen (1.3.1) + liquid (2.6.1) + listen (2.8.5) + celluloid (>= 0.15.2) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) maruku (0.7.0) - mini_portile (0.6.0) - minitest (5.3.4) - nokogiri (1.6.2.1) - mini_portile (= 0.6.0) + mercenary (0.3.5) + mini_portile (0.6.2) + minitest (5.5.0) + net-dns (0.8.0) + nokogiri (1.6.5) + mini_portile (~> 0.6.0) parslet (1.5.0) blankslate (~> 2.0) - posix-spawn (0.3.8) - pygments.rb (0.5.4) + posix-spawn (0.3.9) + public_suffix (1.4.6) + pygments.rb (0.6.0) posix-spawn (~> 0.3.6) yajl-ruby (~> 1.1.0) rb-fsevent (0.9.4) - rb-inotify (0.9.4) - ffi (>= 0.5.0) - rb-kqueue (0.2.2) + rb-inotify (0.9.5) ffi (>= 0.5.0) rdiscount (2.1.7) - redcarpet (2.3.0) - safe_yaml (1.0.3) - thread_safe (0.3.3) - toml (0.1.1) + redcarpet (3.1.2) + safe_yaml (1.0.4) + sass (3.4.9) + terminal-table (1.4.5) + thread_safe (0.3.4) + timers (4.0.1) + hitimes + toml (0.1.2) parslet (~> 1.5.0) - tzinfo (1.1.0) + tzinfo (1.2.2) thread_safe (~> 0.1) yajl-ruby (1.1.0) @@ -1,7 +1,7 @@ # Alaveteli documentation (github pages) The `gh-branch` contains the Alaveteli documentation that is hosted -as GitHub Pages, and available at <http://www.alaveteli.org/docs> +as GitHub Pages, and available at <http://www.alaveteli.org> The mySociety documentation "github pages" sites share the same styling. It comes from the @@ -18,6 +18,7 @@ There's also an Alaveteli-specific stylesheet, so do: sass --update --style=compressed assets/sass/alaveteli-org.scss:assets/css/alaveteli-org.css +You can use `--watch` instead of `--update` to continually monitor for changes. ## Viewing locally manually @@ -75,3 +76,18 @@ node_modules/.bin/bower install Then use bower to install a new library and add it to the `Gruntfile.js`. +## Linking to other pages + +Use `page.baseurl` to link to another page inside the repository. + + <a href="{{ page.baseurl }}/english/path/to/page">Some Page</a> + +`page.baseurl` captures the current locale and inserts it in to the path if the +user is not in the default locale (`EN`). Only use `site.baseurl` for linking +to pages or assets that do not have a translation. + +_NOTE:_ `page.baseurl` does not include a trailing slash, so you must add this +after the liquid tags (`}}/`). On the other hand, `site.baseurl` _is_ a slash, +which is why you see the next part of the path hard up against the liquid tags +(`}}assets`). + diff --git a/_config.yml b/_config.yml index 6ee6be0e1..90e81c767 100644 --- a/_config.yml +++ b/_config.yml @@ -1,11 +1,29 @@ safe: true -pygments: true +highlighter: pygments baseurl: / permalink: pretty markdown: kramdown url: http://code.alaveteli.org +defaults: + - + scope: + path: . + values: + baseurl: / + - + scope: + path: es + values: + baseurl: /es exclude: + - Gemfile + - Gemfile.lock + - Gruntfile.js + - README.md + - alaveteli-doc-master.txt - node_modules + - package.json - script + - vendor gems: - jekyll-redirect-from diff --git a/_includes/es/feedback_form.html b/_includes/es/feedback_form.html new file mode 100644 index 000000000..5e0d2db4b --- /dev/null +++ b/_includes/es/feedback_form.html @@ -0,0 +1,32 @@ + <meta charset="utf-8"> +<form id="feedback_form"> + <h3>Miniencuesta</h3> + <div id="form_elements"> + <p>¿Ha encontrado lo que buscaba en esta página?</p> + <ul> + <li> + <label> + <input id="found_yes" name="found" type="radio" class="field radio" value="Yes" tabindex="1" onclick="$('#feedback-further-details').hide()"/>Sí + </label> + </li> + <li> + <label> + <input id="found_no" name="found" type="radio" class="field radio" value="No" tabindex="2" onclick="$('#feedback-further-details').show()"/>No + </label> + </li> + </ul> + <div id="feedback-further-details" hidden> + <p> + <label for="looking_for">¿Qué estaba buscando?</label><br/> + <input id="id_looking_for" name="looking_for" /> + </p> + </div> + <input id="url" name="url" type="hidden" /> + <input type="hidden" name="question_no" value="1"> + </div> + + <p id="result"></p> + <input type="submit" value="Enviar"/> + <a href="" id="hide_survey">ocultar</a> + +</form> diff --git a/_includes/es/image.html b/_includes/es/image.html new file mode 100644 index 000000000..46d187982 --- /dev/null +++ b/_includes/es/image.html @@ -0,0 +1,4 @@ +<figure> +<img src="{{ include.url }}" alt="{{ include.description }}" width="{{ include.width }}"/> +<figcaption>{{ include.description }}</figcaption> +</figure> diff --git a/_layouts/default.html b/_layouts/default.html index 0e72fcf6f..539169ae5 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -48,7 +48,16 @@ <header class="site-header"> <div class="container"> - <a href="{{ site.baseurl }}" class="site-title"><h1>Alaveteli</h1></a> + <a href="{{ page.baseurl }}" class="site-title"><h1>Alaveteli</h1></a> + + <div id="lang-switcher" class="ui-dropdown-list"> + <p class="ui-dropdown-list-trigger en"> + <strong class="current-locale">EN</strong> + </p> + <ul class="available-languages"> + <li><a href="/es{{ page.url }}" title="" class="es">ES</a></li> + </ul> + </div> <div class="nav-position"> <nav role="navigation" class="site-nav nav-collapse"> <ul> @@ -57,7 +66,7 @@ <li><a href="{{ site.baseurl }}deployments/">Sites</a></li> <li><a href="{{ site.baseurl }}docs/">Documentation</a></li> <li><a href="https://www.mysociety.org/category/alaveteli/">Blog</a></li> - <li><a href="{{ site.baseurl }}community/">Contact</a></li> + <li><a href="{{ page.baseurl }}/community/">Contact</a></li> </ul> </nav> </div> @@ -174,5 +183,12 @@ }); </script> <script src="{{ site.baseurl }}assets/scripts/how-it-works-slides.js"></script> + <script> + jQuery('#lang-switcher').find('.ui-dropdown-list-trigger').each(function() { + jQuery(this).click(function(){ + jQuery(this).parent().toggleClass('active'); + }); + }); + </script> </body> </html> diff --git a/_layouts/es/default.html b/_layouts/es/default.html new file mode 100644 index 000000000..541d607ce --- /dev/null +++ b/_layouts/es/default.html @@ -0,0 +1,193 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <title>{{ page.title }} | Alaveteli | mySociety</title> + <link rel="stylesheet" href="{{ site.baseurl }}assets/css/global.css"> + <link rel="stylesheet" href="{{ site.baseurl }}assets/css/alaveteli-org.css"> + <link href="/atom.xml" rel="alternate" title="Alaveteli" type="application/atom+xml"> + <link rel="icon" type="image/png" href="{{ site.baseurl }}assets/img/favicon.png" /> + <meta name="viewport" content="initial-scale=1"> + <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700,900,400italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'> + <script src="{{ site.baseurl }}assets/scripts/modernizr.min.js"></script> + <!--[if lt IE 9]> + <script src="{{ site.baseurl }}assets/scripts/respond.js"></script> + <![endif]--> + <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> + <script src="{{ site.baseurl }}assets/scripts/jquery.cookie.js"></script> + <script src="{{ site.baseurl }}assets/scripts/feedback-form.js"></script> + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-24633320-1', 'alaveteli.org'); + ga('send', 'pageview'); + + (function() { + var cx = '017774751021845757815:coockvcxkjm'; + var gcse = document.createElement('script'); + gcse.type = 'text/javascript'; + gcse.async = true; + gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + + '//www.google.com/cse/cse.js?cx=' + cx; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(gcse, s); + })(); + + + </script> + </head> + <body> + + <div class="ms-header"> + <nav class="ms-header__row"> + <a class="ms-header__logo" href="https://www.mysociety.org">mySociety</a> + </nav> + </div> + + <header class="site-header"> + <div class="container"> + <a href="{{ page.baseurl }}" class="site-title"><h1>Alaveteli</h1></a> + <div id="lang-switcher" class="ui-dropdown-list"> + <p class="ui-dropdown-list-trigger es"> + <strong class="current-locale">ES</strong> + </p> + <ul class="available-languages"> + <li><a href="{{ page.url | remove: "/es" }}" title="" class="en">EN</a></li> + </ul> + </div> + <div class="nav-position"> + <nav role="navigation" class="site-nav nav-collapse"> + <ul> + <li><a href="{{ page.baseurl }}/about/">Información</a></li> + <li><a href="{{ page.baseurl }}/docs/getting_started/">Primeros pasos</a></li> + <li><a href="{{ page.baseurl }}/docs/">Documentación</a></li> + <li><a href="https://www.mysociety.org/category/alaveteli/">Blog</a></li> + <li><a href="{{ page.baseurl }}/community/">Contacto</a></li> + </ul> + </nav> + </div> + </div> + </header> + + {{ content }} + + <footer class="site-footer"> + <div class="container"> + <div class="column"> + <h3>mySociety</h3> + <ul> + <li><a href="http://www.mysociety.org/helpus/">Colabore con nosotros</a></li> + <li><a href="http://www.mysociety.org/about/">Nosotros</a></li> + <li><a href="https://www.mysociety.org/projects/">Nuestros proyectos</a> + <li><a href="http://www.mysociety.org/about/team/">Nuestro equipo</a></li> + <li><a href="http://www.mysociety.org/contact/">Contacto</a></li> + <li><a href="http://www.mysociety.org/donate/">Donaciones</a></li> + </ul> + </div> + <div class="column central"> + <h3>Nuestras aplicaciones</h3> + <ul> + <li><a href="http://www.fixmystreet.com/">FixMyStreet</a></li> + <li><a href="https://www.writetothem.com/">WriteToThem</a></li> + <li><a href="https://www.whatdotheyknow.com/">WhatDoTheyKnow</a></li> + <li><a href="http://www.theyworkforyou.com/">TheyWorkForYou</a></li> + <li><a href="http://www.fixmytransport.com/">FixMyTransport</a></li> + <li><a href="http://www.alaveteli.org/">Alaveteli</a></li> + <li><a href="http://www.pombola.org/">Pombola</a></li> + <li><a href="http://popit.poplus.org/">PopIt</a></li> + <li><a href="http://sayit.mysociety.org/">SayIt</a></li> + <li><a href="http://mapit.poplus.org/">MapIt</a></li> + </ul> + </div> + <div class="column"> + <h3>Conexiones</h3> + <ul> + <li><a href="https://groups.google.com/group/alaveteli-users">Lista de correo</a></li> + <li><a href="https://groups.google.com/group/alaveteli-dev">Lista de correo para desarrolladores</a></li> + <li><a href="https://github.com/mysociety/alaveteli">GitHub</a></li> + <li><a href="http://www.irc.mysociety.org/">IRC</a></li> + <li><a href="https://twitter.com/alaveteli">Twitter</a></li> + </ul> + </div> + </div> + </footer> + + <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> + <script src="{{ site.baseurl }}assets/scripts/responsive-nav.min.js"></script> + <script> + var nav = responsiveNav(".nav-collapse"); + </script> + <script src="{{ site.baseurl }}assets/scripts/svgeezy.js"></script> + <script> + svgeezy.init('nocheck', 'png'); // this will tell the plugin to not check images with a class of 'nocheck' + </script> + <script> + function replace_str(base, replacement) { + return base + replacement; // FIXME TODO should replace %s + } + + $(function(){ + + $('.reveal-on-click dd').hide(); + $('.reveal-on-click dt').on('click', function(){ + // $(this).find('+ dd').toggle(); + var $dd = $(this).find('+ dd'); + if ($dd.is(':visible')) { + $(this).removeClass('revealed'); + $dd.slideUp(); + } else { + $(this).addClass('revealed'); + $dd.slideDown(); + } + }); + + var reveal_all_text = {'reveal': 'Show all ', 'hide': 'Collapse all '}; // TODO add %s + + $('dl.reveal-on-click').each(function(){ + $(this).before("<div class='reveal-all revealed'> </div>"); + }); + $('.reveal-all').on('click', function(){ + console.log("reveal all clicked"); + var $dl = $(this).find('+ dl.reveal-on-click'); + var noun = $dl.data('reveal-noun'); + if ($(this).hasClass('revealed')) { + console.log("hiding all"); + $dl.find('dt').removeClass('revealed'); + $dl.find('dd').slideUp(); + $(this).removeClass('revealed'); + $(this).text(replace_str(reveal_all_text['reveal'], noun)); + } else { + console.log("showing all"); + $dl.find('dt').addClass('revealed'); + $dl.find('dd').slideDown(); + $(this).addClass('revealed'); + $(this).text(replace_str(reveal_all_text['hide'], noun)); + } + }); + $('.reveal-all').trigger('click'); + }); + // Anchor links for the headings + $(function() { + return $("h1, h2, h3, h4, h5, h6").each(function(i, el) { + var $el, icon, id; + $el = $(el); + id = $el.attr('id'); + if (id) { + return $el.append($("<a />").addClass("header-link").attr("href", "#" + id).html('#')); + } + }); + }); + </script> + <script src="{{ site.baseurl }}assets/scripts/how-it-works-slides.js"></script> + <script> + jQuery('#lang-switcher').find('.ui-dropdown-list-trigger').each(function() { + jQuery(this).click(function(){ + jQuery(this).parent().toggleClass('active'); + }); + }); + </script> + </body> +</html> diff --git a/_layouts/es/fullwidth.html b/_layouts/es/fullwidth.html new file mode 100644 index 000000000..925147cc7 --- /dev/null +++ b/_layouts/es/fullwidth.html @@ -0,0 +1,30 @@ +--- +layout: es/default +--- +<div class="page-wrapper"> +<div class="page"> +{% capture url_parts %} {{ page.url | remove: "/index.html" | remove: "/es" | replace:'/'," " }}{% endcapture %} + {% capture num_parts %}{{ url_parts | number_of_words | minus: 1 }}{% endcapture %} + {% assign previous="" %} + <ul class="breadcrumb"> + {% if num_parts == "-1" %} + {% elsif num_parts == "0" %} + <li><a href="/">Inicio</a></li> + {% else %} + <li><a href="/">Inicio</a></li> + {% for unused in page.content limit:num_parts %} + {% capture first_word %}{{ url_parts | truncatewords:1 | remove:"..."}}{% endcapture %} + {% capture previous %}{{ previous }}/{{ first_word }}{% endcapture %} + <li><a href="{{ previous }}/">{{ first_word | capitalize }}</a></li> + {% capture url_parts %}{{ url_parts | remove_first:first_word }}{% endcapture %} + {% endfor %} + {% endif %} + </ul> + <div class="main-content-column-full-width"> + <main role="main" class="main-content"> + {{ content }} + </main> + </div> + + </div> + </div> diff --git a/_layouts/es/landing.html b/_layouts/es/landing.html new file mode 100644 index 000000000..e0b735ce9 --- /dev/null +++ b/_layouts/es/landing.html @@ -0,0 +1,8 @@ +--- +layout: es/default +--- + + +<div class="page-wrapper--white"> + {{ content }} +</div> diff --git a/_layouts/es/page.html b/_layouts/es/page.html new file mode 100644 index 000000000..c9d19c397 --- /dev/null +++ b/_layouts/es/page.html @@ -0,0 +1,100 @@ +--- +layout: es/default +--- + <meta charset="utf-8"> + +<div class="page-wrapper"> +<div class="page"> + {% capture url_parts %} {{ page.url | remove: "/index.html" | remove: "/es" | replace:'/'," " }}{% endcapture %} + {% assign parts = url_parts | split: ' ' %} + {% assign previous="" %} + <ul class="breadcrumb"> + {% if num_parts == "-1" %} + {% elsif num_parts == "0" %} + <li><a href="/">Inicio</a></li> + {% else %} + <li><a href="/">Inicio</a></li> + {% if page.slug == null %} + {% for part in parts %} + {% capture previous %}{{ previous }}/{{ part }}{% endcapture %} + <li><a href="{{ previous }}/">{{ part | capitalize | replace:'_'," " }}</a></li> + {% capture url_parts %}{{ url_parts | remove_first:part }}{% endcapture %} + {% endfor %} + {% else %} + <li><a href="/blog/">Blog</a></li> + {% endif %} + {% endif %} + </ul> + + <div class="main-content-column"> + <main role="main" class="main-content"> + <div class="attention-box"> + <p> + <strong>Esta página se está traducido el 2014-12-08.</strong><br /> + Es posible que la versión inglés se actualizaba desde luego. + </p> + </div> + + {{ content }} + </main> + </div> + <div class="secondary-content-column"> + <nav class="sidebar"> + <ul> + <li>{% include es/feedback_form.html %}</li> + <li> + <gcse:searchbox-only></gcse:searchbox-only> + + </li> + <li><a href="{{ page.baseurl }}/about/">Información</a></li> + <li><a href="{{ page.baseurl }}/docs/">Documentación</a> + <ul> + <li><a href="{{ page.baseurl }}/docs/glossary/">Glosario</a></li> + </uL> + </li> + <li><a href="{{ page.baseurl }}/docs/getting_started/">Primeros pasos</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/">Instalación</a> + <ul> + <li><a href="{{ page.baseurl }}/docs/installing/script/">Script de instalación</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/vagrant/">Vagrant</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/ami/">AMI de Alaveteli para EC2</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/manual_install/">Instalación manual</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/deploy/">Implementación</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/email/">MTA (servidor de correo)</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/next_steps/">Próximos pasos</a></li> + </ul> + </li> + <li><a href="{{ page.baseurl }}/docs/customising/">Personalización</a> + <ul> + <li><a href="{{ page.baseurl }}/docs/customising/config/">Configuración</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/themes/">Temas</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/translation/">Traducción</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/states/">Estados de solicitud</a></li> + </ul> + </li> + <li><a href="{{ page.baseurl }}/docs/running/">Ejecución</a> + <ul> + <li><a href="{{ page.baseurl }}/docs/running/admin_manual/">Manual de administración</a></li> + <li><a href="{{ page.baseurl }}/docs/running/redaction">Redacción</a></li> + <li><a href="{{ page.baseurl }}/docs/running/security/">Seguridad y mantenimiento</a></li> + <li><a href="{{ page.baseurl }}/docs/running/server/">Requisitos del servidor</a></li> + <li><a href="{{ page.baseurl }}/docs/running/upgrading/">Actualización</a></li> + </ul> + </li> + <li><a href="{{ page.baseurl }}/docs/developers/">Para desarrolladores</a> + <ul> + <li><a href="{{ page.baseurl }}/docs/developers/overview/">Vista general de alto nivel</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/directory_structure/">Estructura de directorios</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/i18n/">Internacionalización</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/api/">API</a></li> + </ul> + </li> + <li><a href="{{ page.baseurl }}/community/">Comunidad</a> + </li> + <li><a href="https://www.mysociety.org/category/alaveteli/">Blog</a></li> + </ul> + </nav> + </div> + + </div> +</div> diff --git a/_layouts/page.html b/_layouts/page.html index d868a951d..e81965b09 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -37,56 +37,56 @@ layout: default <gcse:searchbox-only></gcse:searchbox-only> </li> - <li><a href="{{ site.baseurl }}about/">About</a></li> - <li><a href="{{ site.baseurl }}docs/">Documentation</a> + <li><a href="{{ page.baseurl }}/about/">About</a></li> + <li><a href="{{ page.baseurl }}/docs/">Documentation</a> <ul> - <li><a href="{{ site.baseurl }}docs/glossary/">Glossary</a></li> + <li><a href="{{ page.baseurl }}/docs/glossary/">Glossary</a></li> </uL> </li> - <li><a href="{{ site.baseurl }}docs/getting_started/">Getting Started</a></li> - <li><a href="{{ site.baseurl }}docs/installing/">Installing</a> + <li><a href="{{ page.baseurl }}/docs/getting_started/">Getting Started</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/">Installing</a> <ul> - <li><a href="{{ site.baseurl }}docs/installing/script/">Install script</a></li> - <li><a href="{{ site.baseurl }}docs/installing/vagrant/">Vagrant</a></li> - <li><a href="{{ site.baseurl }}docs/installing/ami/">Alaveteli AMI for EC2</a></li> - <li><a href="{{ site.baseurl }}docs/installing/manual_install/">Manual Install</a></li> - <li><a href="{{ site.baseurl }}docs/installing/deploy/">Deploying</a></li> - <li><a href="{{ site.baseurl }}docs/installing/email/">MTA (email)</a></li> - <li><a href="{{ site.baseurl }}docs/installing/next_steps/">Next steps</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/script/">Install script</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/vagrant/">Vagrant</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/ami/">Alaveteli AMI for EC2</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/manual_install/">Manual Install</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/deploy/">Deploying</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/email/">MTA (email)</a></li> + <li><a href="{{ page.baseurl }}/docs/installing/next_steps/">Next steps</a></li> </ul> </li> - <li><a href="{{ site.baseurl }}docs/customising/">Customising</a> + <li><a href="{{ page.baseurl }}/docs/customising/">Customising</a> <ul> - <li><a href="{{ site.baseurl }}docs/customising/config/">Configuration</a></li> - <li><a href="{{ site.baseurl }}docs/customising/themes/">Themes</a></li> - <li><a href="{{ site.baseurl }}docs/customising/translation/">Translation</a></li> - <li><a href="{{ site.baseurl }}docs/customising/states/">Request states</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/">Configuration</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/themes/">Themes</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/translation/">Translation</a></li> + <li><a href="{{ page.baseurl }}/docs/customising/states/">Request states</a></li> </ul> </li> - <li><a href="{{ site.baseurl }}docs/running/">Running</a> + <li><a href="{{ page.baseurl }}/docs/running/">Running</a> <ul> - <li><a href="{{ site.baseurl }}docs/running/admin_manual/">Admin manual</a></li> - <li><a href="{{ site.baseurl }}docs/running/requests/">Managing requests</a></li> - <li><a href="{{ site.baseurl }}docs/running/holding_pen/">The holding pen</a></li> - <li><a href="{{ site.baseurl }}docs/running/categories_and_tags/">Categories & tags</a></li> - <li><a href="{{ site.baseurl }}docs/running/redaction">Redaction</a></li> - <li><a href="{{ site.baseurl }}docs/running/security/">Security & Maintenance</a></li> - <li><a href="{{ site.baseurl }}docs/running/server/">Server checklist</a></li> - <li><a href="{{ site.baseurl }}docs/running/upgrading/">Upgrading</a></li> + <li><a href="{{ page.baseurl }}docs/running/admin_manual/">Admin manual</a></li> + <li><a href="{{ page.baseurl }}docs/running/requests/">Managing requests</a></li> + <li><a href="{{ page.baseurl }}docs/running/holding_pen/">The holding pen</a></li> + <li><a href="{{ page.baseurl }}docs/running/categories_and_tags/">Categories & tags</a></li> + <li><a href="{{ page.baseurl }}docs/running/redaction">Redaction</a></li> + <li><a href="{{ page.baseurl }}docs/running/security/">Security & Maintenance</a></li> + <li><a href="{{ page.baseurl }}docs/running/server/">Server checklist</a></li> + <li><a href="{{ page.baseurl }}docs/running/upgrading/">Upgrading</a></li> </ul> </li> - <li><a href="{{ site.baseurl }}docs/developers/">For developers</a> + <li><a href="{{ page.baseurl }}/docs/developers/">For developers</a> <ul> - <li><a href="{{ site.baseurl }}docs/developers/overview/">High-level overview</a></li> - <li><a href="{{ site.baseurl }}docs/developers/directory_structure/">Directory structure</a></li> - <li><a href="{{ site.baseurl }}docs/developers/i18n/">Internationalisation</a></li> - <li><a href="{{ site.baseurl }}docs/developers/api/">API</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/overview/">High-level overview</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/directory_structure/">Directory structure</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/i18n/">Internationalisation</a></li> + <li><a href="{{ page.baseurl }}/docs/developers/api/">API</a></li> </ul> </li> - <li><a href="{{ site.baseurl }}community/">Community</a> + <li><a href="{{ page.baseurl }}/community/">Community</a> <ul> <li> - <a href="{{ site.baseurl }}community/conferences/2012/">AlaveteliCon 2012</a> + <a href="{{ page.baseurl }}/community/conferences/2012/">AlaveteliCon 2012</a> </li> </ul> </li> @@ -16,10 +16,10 @@ title: About </div> <div class="container clearfix"> <h2>What next?</h2> - <h3>Take a look at <a href="{{ site.baseurl }}docs/">our documentation</a></h3> + <h3>Take a look at <a href="{{ page.baseurl }}/docs/">our documentation</a></h3> <div class="grid-row content-in-columns"> <div class="about__column"> - <p>Non-technical audiences should start with our <a href="{{ site.baseurl }}docs/getting_started/">Getting Started guide</a>. Developers might want to start with <a href="{{ site.baseurl }}docs/developers/">the technical overview</a>.</p> + <p>Non-technical audiences should start with our <a href="{{ page.baseurl }}/docs/getting_started/">Getting Started guide</a>. Developers might want to start with <a href="{{ page.baseurl }}/docs/developers/">the technical overview</a>.</p> <p>If you are an organisation who wants to use Alaveteli in your jurisdiction, join our <a href="http://groups.google.com/group/alaveteli-users">Google group for users of Alaveteli</a> and introduce yourself. If you’re a developer who is interested in collaborating on the software, please send a message to our <a href="https://groups.google.com/group/alaveteli-dev">dev mailing list</a>.</p> <p>Currently, customising a new site using Alaveteli requires technical know-how. We are working to change this over the next few months. We also have resources to support a small number of new websites as hosted services.</p> </div> diff --git a/assets/css/alaveteli-org.css b/assets/css/alaveteli-org.css index bd4cf8634..4115b6b37 100644 --- a/assets/css/alaveteli-org.css +++ b/assets/css/alaveteli-org.css @@ -1 +1,27 @@ -.image-replacement{text-indent:-1000%;white-space:nowrap;overflow:hidden}.container{max-width:63.333333333em;padding:0 1em;margin:0 auto;position:relative}.unstyled-list,.unstyled,.site-nav ul{margin-left:0;padding-left:0;list-style:none outside none}.inline-list{margin-left:-0.5em;margin-bottom:0}.inline-list li{display:inline-block;margin-left:0.5em}.text--center{text-align:center}html{background-color:#333;height:100%;min-height:100%}body{background-color:transparent}.no-svg .site-title{background-image:url("../img/alaveteli-logo.png")}.hero,.what-is-alaveteli,.how-does-it-work,.features,.get-started,.about__intro,.deployments__intro{padding:2em 0}@media (min-width: 40em){.hero,.what-is-alaveteli,.how-does-it-work,.features,.get-started,.about__intro,.deployments__intro{padding:3.5em 0}}.hero,.how-does-it-work,.get-started,.about__intro,.deployments__intro{background-color:#333;color:#fff}.hero a,.how-does-it-work a,.get-started a,.about__intro a,.deployments__intro a{color:#fff;border-bottom:1px dotted rgba(255,255,255,0.3)}.hero a:hover,.how-does-it-work a:hover,.get-started a:hover,.about__intro a:hover,.deployments__intro a:hover,.hero a:active,.how-does-it-work a:active,.get-started a:active,.about__intro a:active,.deployments__intro a:active,.hero a:focus,.how-does-it-work a:focus,.get-started a:focus,.about__intro a:focus,.deployments__intro a:focus{border-color:rgba(255,255,255,0.6);background-color:#863c83;text-decoration:none}.hero .button,.how-does-it-work .button,.get-started .button,.about__intro .button,.deployments__intro .button{color:#fff;border:1px solid rgba(255,255,255,0.3);width:100%;margin-bottom:1em}@media (min-width: 30em){.hero .button,.how-does-it-work .button,.get-started .button,.about__intro .button,.deployments__intro .button{width:auto;margin-bottom:0}}.hero .button:hover,.how-does-it-work .button:hover,.get-started .button:hover,.about__intro .button:hover,.deployments__intro .button:hover,.hero .button:active,.how-does-it-work .button:active,.get-started .button:active,.about__intro .button:active,.deployments__intro .button:active,.hero .button:focus,.how-does-it-work .button:focus,.get-started .button:focus,.about__intro .button:focus,.deployments__intro .button:focus{background-color:rgba(0,0,0,0.1);border-color:rgba(0,0,0,0.1)}.what-is-alaveteli__grid-unit,.features__grid-unit,.get-started__grid-unit{display:inline-block;vertical-align:top}.grid-row:before,.grid-row:after{content:" ";display:table}.grid-row:after{clear:both}.grid-row{*zoom:1}h1,h2,h4,h5,h6{font-weight:700}h3{font-weight:600}.button{display:inline-block;padding:0.4em 2.4em;border:1px solid #e4e3dd;vertical-align:middle;border-radius:7px;text-align:center}.button:hover,.button:active,.button:focus{background-color:#3a3a3a;border-color:rgba(255,255,255,0.2);text-decoration:none}@media (min-width: 47.5em){.nav-position{position:absolute;top:0.4em;left:180px}}@media (min-width: 56.88889em){.nav-position{left:240px;top:0.35em}}.site-nav ul{margin-top:0;margin-bottom:0}@media (min-width: 47.5em){.site-nav li{display:inline-block}}.site-nav a{color:#fff;margin-right:0.33em;display:block;padding:0.33em;border-bottom:1px solid rgba(255,255,255,0.1)}@media (min-width: 47.5em){.site-nav a{display:inline-block;border-bottom:none}}@media (min-width: 56.88889em){.site-nav a{font-size:1.125em;margin-right:0.66em}}/*! responsive-nav.js 1.0.32 by @viljamis */.js .nav-collapse{clip:rect(0 0 0 0);max-height:0;position:absolute;display:block;overflow:hidden;zoom:1}.nav-collapse.opened{max-height:9999px}.disable-pointer-events{pointer-events:none !important}.nav-toggle{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;position:absolute;top:0.4em;right:5em;display:inline-block;padding:0.3em 0.75em;border:1px solid rgba(255,255,255,0.1);border-radius:5px;color:#fff;font-size:0.875em}@media (min-width: 30em){.nav-toggle{right:10em}}@media screen and (min-width: 47.5em){.js .nav-collapse{position:relative}.js .nav-collapse.closed{max-height:none}.nav-toggle{display:none}}.hero{background-color:#974495}.hero h1{display:inline-block;font-weight:600;width:auto;border-bottom:1px solid rgba(255,255,255,0.2);padding-bottom:0.5em;margin-bottom:0.25em;text-shadow:0px 2px 1px rgba(0,0,0,0.3)}@media (min-width: 56.88889em){.hero h1{font-size:4em}}.hero span{opacity:0.7;display:block}.hero p{font-size:1.125em;max-width:25em}.action-buttons{margin-top:2em}.action-buttons .button{font-weight:600;margin-right:1em}.what-is-alaveteli{position:relative}@media (min-width: 56.88889em){.what-is-alaveteli__items-grid{width:66.666%}}@media (min-width: 30em){.what-is-alaveteli__grid-unit{width:46%;margin-right:4%}}.what-is-alaveteli__item{padding-left:3.625em;background-position:top left;background-size:50px 50px;background-repeat:no-repeat}.what-is-alaveteli__item--foi{background-image:url("../img/scales.svg")}.no-svg .what-is-alaveteli__item--foi{background-image:url("../img/scales.png")}.what-is-alaveteli__item--help{background-image:url("../img/pointer.svg")}.no-svg .what-is-alaveteli__item--help{background-image:url("../img/pointer.png")}.what-is-alaveteli__item--published{background-image:url("../img/binoculars.svg")}.no-svg .what-is-alaveteli__item--published{background-image:url("../img/binoculars.png")}.what-is-alaveteli__item--open{background-image:url("../img/open.svg")}.no-svg .what-is-alaveteli__item--open{background-image:url("../img/open.png")}@media (min-width: 56.88889em){.what-is-alaveteli__international-reach-position{width:33.3333%;position:absolute;top:-13em;right:0}}.what-is-alaveteli__international-reach{background-color:#f3f1eb;background-image:url("../img/worldmap.svg");background-position:center 1.5em;background-repeat:no-repeat;background-size:280px 158px;padding:10em 1.25em 1em}@media (min-width: 30em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:11.5em 2em 1em}}@media (min-width: 40em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:1em 2em 1em 22em;background-position:left center}}@media (min-width: 56.88889em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:12.5em 2em 1em;background-position:center 1.5em}}.what-is-alaveteli__international-reach .message{font-size:1.4em}.what-is-alaveteli__international-reach strong{color:#a94ca6}.what-is-alaveteli__international-reach a{color:#787774;border-bottom:1px dotted #e4e3dd}.what-is-alaveteli__international-reach a:hover,.what-is-alaveteli__international-reach a:active,.what-is-alaveteli__international-reach a:focus{text-decoration:none;border-color:#2b8cdb;color:#2b8cdb}.no-svg .what-is-alaveteli__international-reach{background-image:url("../img/worldmap.png")}.how-does-it-work{background-color:#974495;overflow:hidden}.how-does-it-work img{position:relative}@media (min-width: 56.88889em){.how-does-it-work img{bottom:-1px}}@media (min-width: 30em){.how-does-it-work{padding-top:0;padding-bottom:0}.how-does-it-work .how-does-it-work__slide{border-top:4em solid #fff;padding-top:4.7em}.how-does-it-work h2,.how-does-it-work p{width:50%}.how-does-it-work img{float:right;width:30em;margin-right:-15em;margin-top:-13em}}@media (min-width: 43.5em){.how-does-it-work .how-does-it-work__slide{border-top:4em solid #fff;padding-top:4.7em}.how-does-it-work h2,.how-does-it-work p{width:33.333%}.how-does-it-work img{margin-right:-5em;margin-top:-15em}}@media (min-width: 56.88889em){.how-does-it-work h2,.how-does-it-work p,.how-does-it-work .how-does-it-work__slide__nav{width:33.333%;margin-left:66.666%}.how-does-it-work img{float:left;width:63.666%;margin-top:-15em}}.how-does-it-work__slide:before,.how-does-it-work__slide:after{content:" ";display:table}.how-does-it-work__slide:after{clear:both}.how-does-it-work__slide{*zoom:1}.how-does-it-work__slide__nav{margin-top:0.5em;text-align:center}@media (min-width: 30em){.how-does-it-work__slide__nav{text-align:left}}.how-does-it-work__slide__skip{display:inline-block;padding:0.3em;cursor:pointer}.how-does-it-work__slide__skip span{display:block;border-radius:1em;width:0.8em;height:0.8em;background-color:rgba(0,0,0,0.3)}.how-does-it-work__slide__skip.active span{background-color:rgba(255,255,255,0.3)}.how-does-it-work__slide__skip:hover span,.how-does-it-work__slide__skip:focus span,.how-does-it-work__slide__skip:active span{background-color:rgba(0,0,0,0.3)}@media (min-width: 40em){.features__grid-unit{width:48.5%}.features__grid-unit:nth-child(n){margin-right:3%}.features__grid-unit:nth-child(2n){margin-right:0}}@media (min-width: 56.88889em){.features__grid-unit{width:22.75%}.features__grid-unit:nth-child(n){margin-right:3%}.features__grid-unit:nth-child(4n){margin-right:0}}@media (min-width: 40em){.features__grid-unit--wide{width:48.5%}.features__grid-unit--wide:nth-child(n){margin-right:3%}.features__grid-unit--wide:last-child{margin-right:0}}.features__item{margin-top:1em;margin-bottom:1em}.features__item--primary{background-position:center top;background-repeat:no-repeat;padding-top:11.5em}@media (min-width: 56.88889em){.features__item--primary{background-position:left center;padding:1em 0}.features__item--primary h3,.features__item--primary p{padding-left:63%}}@media (min-width: 65em){.features__item--primary h3,.features__item--primary p{padding-left:53%}}.features__item--primary h3{font-size:1.4em}.features__item--devices{background-image:url("../img/devices.svg");background-size:258px 188px}.no-svg .features__item--devices{background-image:url("../img/devices.png")}.features__item--messaging{background-image:url("../img/signs.svg");background-size:200px 166px}@media (min-width: 56.88889em){.features__item--messaging{background-position:3em center}}.no-svg .features__item--messaging{background-image:url("../img/signs.png")}.get-started{border-bottom:1px solid rgba(255,255,255,0.1)}@media (min-width: 30em){.get-started__grid-unit{width:48.5%;margin-right:3%}.get-started__grid-unit:last-child{margin-right:0}}@media (min-width: 56.88889em){.get-started__grid-unit{width:23.5%;margin-right:3%}.get-started__grid-unit:last-child{margin-right:0}}.get-started__grid-unit--wide{width:100%;margin-right:0}@media (min-width: 56.88889em){.get-started__grid-unit--wide{width:47%;margin-right:3%}}.get-started__item--primary p{margin-top:0;font-size:1.25em;margin-bottom:1.9em}@media (min-width: 56.88889em){.push-top{margin-top:2.4em}}.delegate-bio{clear:left;padding-bottom:1em;border-top:1px solid #e4e3dd;padding-top:1.2em}.about__intro{background-color:#974495;margin-bottom:4em}.about__intro h1{font-weight:600;color:#fff;text-shadow:0px 2px 1px rgba(0,0,0,0.3);margin-bottom:0.25em}@media (min-width: 56.88889em){.about__intro h1{font-size:4em}}.about__intro p{color:#fff}@media (min-width: 40em){.about__intro p{font-size:1.25em}}@media (min-width: 40em){.about__column{float:left;padding-left:1.5%;padding-right:1.5%;width:50%;padding:0 3%}.about__column:nth-child(odd),.about__column:first-child{padding-left:0}.about__column:nth-child(even),.about__column:last-child{padding-right:0}}.content-in-columns{margin-bottom:1.5em;border-top:3px dashed #f3f1eb;padding-top:1.5em}.content-in-columns:first-of-type{border-top:none;padding-top:0}.stamp-graphic{position:absolute;width:24%;right:2em;-webkit-transform:rotate(9deg);-moz-transform:rotate(9deg);-o-transform:rotate(9deg);transform:rotate(9deg)}@media (min-width: 45.4375em){.stamp-graphic{top:20em}}@media (min-width: 50.6875em){.stamp-graphic{top:19em}}@media (min-width: 66.875em){.stamp-graphic{top:9em}}@media (min-width: 50.6875em){.about__intro p{max-width:27em}}@media (min-width: 66.875em){.about__intro p{max-width:34em}}.deployments__intro{background-color:#974495;margin-bottom:4em;color:#fff;text-align:center;background-image:url("../img/worldmap-pale.svg");background-position:center center;background-repeat:no-repeat;background-size:600px 325px}@media (min-width: 30em){.deployments__intro{padding:8.1em 0;background-size:1000px 541px}}.deployments__intro h1{font-size:1.2em;font-weight:600;text-shadow:0px 2px 1px rgba(0,0,0,0.3);margin-bottom:1em}@media (min-width: 30em){.deployments__intro h1{font-size:1.666666667em}}.deployments__intro h1 span{display:block;font-size:1.5em;margin-top:0.25em;font-weight:700;line-height:1em}@media (min-width: 30em){.deployments__intro h1 span{margin-top:0.15em;font-size:1.8em}}@media (min-width: 56.88889em){.deployments__intro h1 span{font-size:2.4em}}.deployments__intro p{font-size:1em;max-width:23em;margin:0 auto}@media (min-width: 30em){.deployments__intro p{font-size:1.666666667em}}.no-svg .deployments__intro{background-image:url("../img/worldmap-pale.png")}.deployments__content h2{margin-bottom:1.5em}.deployments__list--minor{margin-bottom:2em}@media (min-width: 30em){.deployments__list--minor{margin-bottom:4em}}@media (min-width: 40em){.deployments__unit--major{display:inline-block;width:48.5%;margin-right:3%;vertical-align:top}}.deployments__unit--major:nth-child(even){margin-right:0}.deployments__unit--minor{display:inline-block;width:47.5%;vertical-align:top}.deployments__unit--minor:nth-child(n){margin-right:5%}.deployments__unit--minor:nth-child(even){margin-right:0}@media (min-width: 37.22222em){.deployments__unit--minor{width:30%}.deployments__unit--minor:nth-child(n){margin-right:5%}.deployments__unit--minor:nth-child(3n+3){margin-right:0}}@media (min-width: 56.88889em){.deployments__unit--minor{width:22.25%}.deployments__unit--minor:nth-child(n){margin-right:3%}.deployments__unit--minor:nth-child(4n+4){margin-right:0}}@media (min-width: 77.77778em){.deployments__unit--minor{width:14.166666667%}.deployments__unit--minor:nth-child(n){margin-right:3%}.deployments__unit--minor:nth-child(6n+6){margin-right:0}}.deployment,.deployment--minor,.deployment--major{margin-bottom:2em}@media (min-width: 40em){.deployment,.deployment--minor,.deployment--major{margin-bottom:3em}}.deployment__title{font-weight:600;font-size:1.3em;margin-bottom:0.1em;padding-top:0.2em}@media (min-width: 56.88889em){.deployment__title{font-size:1.5em}}.deployment__country{font-weight:600;font-size:1em;color:#787774;margin-top:0;margin-bottom:0.1em}@media (min-width: 56.88889em){.deployment__country{font-size:1.1em}}.deployment__link{margin-top:0;margin-bottom:0.5em;font-size:0.888888889em}.deployment__link a{display:block;text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@media (min-width: 56.88889em){.deployment__link{font-size:1em}}.deployment__description{font-size:0.888888889em;clear:both}.deployment__screenshot{border:1px solid #e4e3dd}.deployment--minor .deployment__title{padding-top:0;font-size:1.1em}.deployment--minor .deployment__country{font-size:1em}.deployment--minor .deployment__link{font-size:0.777777778em}.deployment--major .deployment__screenshot{width:33%;float:left;margin-bottom:1em}.deployment--major .deployment__title,.deployment--major .deployment__country,.deployment--major .deployment__link{margin-left:37%}.blog-title{line-height:1.3em}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}.header-link{padding-left:0.2em;opacity:0;-webkit-transition:opacity 0.2s ease-in-out 0.1s;-moz-transition:opacity 0.2s ease-in-out 0.1s;-ms-transition:opacity 0.2s ease-in-out 0.1s}h2:hover .header-link,h3:hover .header-link,h4:hover .header-link,h5:hover .header-link,h6:hover .header-link{opacity:1}#feedback_form{display:none;border:1px solid #ccc;padding:0.5em;font-size:0.85em;text-align:center}#feedback_form input{margin-right:4px} +.image-replacement{text-indent:-1000%;white-space:nowrap;overflow:hidden}.container{max-width:63.333333333em;padding:0 1em;margin:0 auto;position:relative}.unstyled-list,.unstyled,.site-nav ul{margin-left:0;padding-left:0;list-style:none outside none}.inline-list{margin-left:-0.5em;margin-bottom:0}.inline-list li{display:inline-block;margin-left:0.5em}.text--center{text-align:center}html{background-color:#333;height:100%;min-height:100%}body{background-color:transparent}.no-svg .site-title{background-image:url("../img/alaveteli-logo.png")}.hero,.what-is-alaveteli,.how-does-it-work,.features,.get-started,.about__intro,.deployments__intro{padding:2em 0}@media (min-width: 40em){.hero,.what-is-alaveteli,.how-does-it-work,.features,.get-started,.about__intro,.deployments__intro{padding:3.5em 0}} +.hero,.how-does-it-work,.get-started,.about__intro,.deployments__intro{background-color:#333;color:#fff}.hero a,.how-does-it-work a,.get-started a,.about__intro a,.deployments__intro a{color:#fff;border-bottom:1px dotted rgba(255,255,255,0.3)}.hero a:hover,.how-does-it-work a:hover,.get-started a:hover,.about__intro a:hover,.deployments__intro a:hover,.hero a:active,.how-does-it-work a:active,.get-started a:active,.about__intro a:active,.deployments__intro a:active,.hero a:focus,.how-does-it-work a:focus,.get-started a:focus,.about__intro a:focus,.deployments__intro a:focus{border-color:rgba(255,255,255,0.6);background-color:#863c83;text-decoration:none}.hero .button,.how-does-it-work .button,.get-started .button,.about__intro .button,.deployments__intro .button{color:#fff;border:1px solid rgba(255,255,255,0.3);width:100%;margin-bottom:1em}@media (min-width: 30em){.hero .button,.how-does-it-work .button,.get-started .button,.about__intro .button,.deployments__intro .button{width:auto;margin-bottom:0}}.hero .button:hover,.how-does-it-work .button:hover,.get-started .button:hover,.about__intro .button:hover,.deployments__intro .button:hover,.hero .button:active,.how-does-it-work .button:active,.get-started .button:active,.about__intro .button:active,.deployments__intro .button:active,.hero .button:focus,.how-does-it-work .button:focus,.get-started .button:focus,.about__intro .button:focus,.deployments__intro .button:focus{background-color:rgba(0,0,0,0.1);border-color:rgba(0,0,0,0.1)}.what-is-alaveteli__grid-unit,.features__grid-unit,.get-started__grid-unit{display:inline-block;vertical-align:top}.grid-row:before,.grid-row:after{content:" ";display:table}.grid-row:after{clear:both}.grid-row{*zoom:1}h1,h2,h4,h5,h6{font-weight:700}h3{font-weight:600}.button{display:inline-block;padding:0.4em 2.4em;border:1px solid #e4e3dd;vertical-align:middle;border-radius:7px;text-align:center}.button:hover,.button:active,.button:focus{background-color:#3a3a3a;border-color:rgba(255,255,255,0.2);text-decoration:none}@media (min-width: 47.5em){.nav-position{position:absolute;top:0.4em;right:80px}}@media (min-width: 52.5em){.nav-position{right:160px}}@media (min-width: 56.88889em){.nav-position{top:0}} +.site-nav ul{margin-top:0;margin-bottom:0}@media (min-width: 47.5em){.site-nav li{display:inline-block}}.site-nav a{color:#fff;margin-right:0.33em;display:block;padding:0.33em;border-bottom:1px solid rgba(255,255,255,0.1)}@media (min-width: 47.5em){.site-nav a{display:inline-block;border-bottom:none}}@media (min-width: 56.88889em){.site-nav a{font-size:1.125em;margin-right:0.66em}} +/*! responsive-nav.js 1.0.32 by @viljamis */.js .nav-collapse{clip:rect(0 0 0 0);max-height:0;position:absolute;display:block;overflow:hidden;zoom:1}.nav-collapse.opened{max-height:9999px}.disable-pointer-events{pointer-events:none !important}.nav-toggle{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;position:absolute;top:0.4em;right:5em;display:inline-block;padding:0.3em 0.75em;border:1px solid rgba(255,255,255,0.1);border-radius:5px;color:#fff;font-size:0.875em}@media (min-width: 30em){.nav-toggle{right:10em}} +@media screen and (min-width: 47.5em){.js .nav-collapse{position:relative}.js .nav-collapse.closed{max-height:none}.nav-toggle{display:none}}.hero{background-color:#974495}.hero h1{display:inline-block;font-weight:600;width:auto;border-bottom:1px solid rgba(255,255,255,0.2);padding-bottom:0.5em;margin-bottom:0.25em;text-shadow:0px 2px 1px rgba(0,0,0,0.3)}@media (min-width: 56.88889em){.hero h1{font-size:4em}}.hero span{opacity:0.7;display:block}.hero p{font-size:1.125em;max-width:25em}.action-buttons{margin-top:2em}.action-buttons .button{font-weight:600;margin-right:1em}.hero .action-buttons{max-width:28em}.what-is-alaveteli{position:relative}@media (min-width: 56.88889em){.what-is-alaveteli__items-grid{width:66.666%}} +@media (min-width: 30em){.what-is-alaveteli__grid-unit{width:46%;margin-right:4%}} +.what-is-alaveteli__item{padding-left:3.625em;background-position:top left;background-size:50px 50px;background-repeat:no-repeat}.what-is-alaveteli__item--foi{background-image:url("../img/scales.svg")}.no-svg .what-is-alaveteli__item--foi{background-image:url("../img/scales.png")}.what-is-alaveteli__item--help{background-image:url("../img/pointer.svg")}.no-svg .what-is-alaveteli__item--help{background-image:url("../img/pointer.png")}.what-is-alaveteli__item--published{background-image:url("../img/binoculars.svg")}.no-svg .what-is-alaveteli__item--published{background-image:url("../img/binoculars.png")}.what-is-alaveteli__item--open{background-image:url("../img/open.svg")}.no-svg .what-is-alaveteli__item--open{background-image:url("../img/open.png")}@media (min-width: 56.88889em){.what-is-alaveteli__international-reach-position{width:33.3333%;position:absolute;top:-13em;right:0}} +.what-is-alaveteli__international-reach{background-color:#f3f1eb;background-image:url("../img/worldmap.svg");background-position:center 1.5em;background-repeat:no-repeat;background-size:280px 158px;padding:10em 1.25em 1em}@media (min-width: 30em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:11.5em 2em 1em}}@media (min-width: 40em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:1em 2em 1em 22em;background-position:left center}}@media (min-width: 56.88889em){.what-is-alaveteli__international-reach{background-size:360px 204px;padding:12.5em 2em 1em;background-position:center 1.5em}}.what-is-alaveteli__international-reach .message{font-size:1.4em}.what-is-alaveteli__international-reach strong{color:#a94ca6}.what-is-alaveteli__international-reach a{color:#787774;border-bottom:1px dotted #e4e3dd}.what-is-alaveteli__international-reach a:hover,.what-is-alaveteli__international-reach a:active,.what-is-alaveteli__international-reach a:focus{text-decoration:none;border-color:#2b8cdb;color:#2b8cdb}.no-svg .what-is-alaveteli__international-reach{background-image:url("../img/worldmap.png")}.how-does-it-work{background-color:#974495;overflow:hidden}.how-does-it-work img{position:relative}@media (min-width: 56.88889em){.how-does-it-work img{bottom:-1px}}@media (min-width: 30em){.how-does-it-work{padding-top:0;padding-bottom:0}.how-does-it-work .how-does-it-work__slide{border-top:4em solid #fff;padding-top:4.7em}.how-does-it-work h2,.how-does-it-work p{width:50%}.how-does-it-work img{float:right;width:30em;margin-right:-15em;margin-top:-13em}}@media (min-width: 43.5em){.how-does-it-work .how-does-it-work__slide{border-top:4em solid #fff;padding-top:4.7em}.how-does-it-work h2,.how-does-it-work p{width:33.333%}.how-does-it-work img{margin-right:-5em;margin-top:-15em}}@media (min-width: 56.88889em){.how-does-it-work h2,.how-does-it-work p,.how-does-it-work .how-does-it-work__slide__nav{width:33.333%;margin-left:66.666%}.how-does-it-work img{float:left;width:63.666%;margin-top:-15em}} +.how-does-it-work__slide:before,.how-does-it-work__slide:after{content:" ";display:table}.how-does-it-work__slide:after{clear:both}.how-does-it-work__slide{*zoom:1}.how-does-it-work__slide__nav{margin-top:0.5em;text-align:center}@media (min-width: 30em){.how-does-it-work__slide__nav{text-align:left}} +.how-does-it-work__slide__skip{display:inline-block;padding:0.3em;cursor:pointer}.how-does-it-work__slide__skip span{display:block;border-radius:1em;width:0.8em;height:0.8em;background-color:rgba(0,0,0,0.3)}.how-does-it-work__slide__skip.active span{background-color:rgba(255,255,255,0.3)}.how-does-it-work__slide__skip:hover span,.how-does-it-work__slide__skip:focus span,.how-does-it-work__slide__skip:active span{background-color:rgba(0,0,0,0.3)}@media (min-width: 40em){.features__grid-unit{width:48.5%}.features__grid-unit:nth-child(n){margin-right:3%}.features__grid-unit:nth-child(2n){margin-right:0}}@media (min-width: 56.88889em){.features__grid-unit{width:22.75%}.features__grid-unit:nth-child(n){margin-right:3%}.features__grid-unit:nth-child(4n){margin-right:0}} +@media (min-width: 40em){.features__grid-unit--wide{width:48.5%}.features__grid-unit--wide:nth-child(n){margin-right:3%}.features__grid-unit--wide:last-child{margin-right:0}} +.features__item{margin-top:1em;margin-bottom:1em}.features__item--primary{background-position:center top;background-repeat:no-repeat;padding-top:11.5em}@media (min-width: 56.88889em){.features__item--primary{background-position:left center;padding:1em 0}.features__item--primary h3,.features__item--primary p{padding-left:63%}}@media (min-width: 65em){.features__item--primary h3,.features__item--primary p{padding-left:53%}}.features__item--primary h3{font-size:1.4em}.features__item--devices{background-image:url("../img/devices.svg");background-size:258px 188px}.no-svg .features__item--devices{background-image:url("../img/devices.png")}.features__item--messaging{background-image:url("../img/signs.svg");background-size:200px 166px}@media (min-width: 56.88889em){.features__item--messaging{background-position:3em center}} +.no-svg .features__item--messaging{background-image:url("../img/signs.png")}.get-started{border-bottom:1px solid rgba(255,255,255,0.1)}@media (min-width: 30em){.get-started__grid-unit{width:48.5%;margin-right:3%}.get-started__grid-unit:last-child{margin-right:0}}@media (min-width: 56.88889em){.get-started__grid-unit{width:23.5%;margin-right:3%}.get-started__grid-unit:last-child{margin-right:0}} +.get-started__grid-unit--wide{width:100%;margin-right:0}@media (min-width: 56.88889em){.get-started__grid-unit--wide{width:47%;margin-right:3%}} +.get-started__item--primary p{margin-top:0;font-size:1.25em;margin-bottom:1.9em}@media (min-width: 56.88889em){.push-top{margin-top:2.4em}} +.delegate-bio{clear:left;padding-bottom:1em;border-top:1px solid #e4e3dd;padding-top:1.2em}.about__intro{background-color:#974495;margin-bottom:4em}.about__intro h1{font-weight:600;color:#fff;text-shadow:0px 2px 1px rgba(0,0,0,0.3);margin-bottom:0.25em}@media (min-width: 56.88889em){.about__intro h1{font-size:4em}}.about__intro p{color:#fff}@media (min-width: 40em){.about__intro p{font-size:1.25em}} +@media (min-width: 40em){.about__column{float:left;padding-left:1.5%;padding-right:1.5%;width:50%;padding:0 3%}.about__column:nth-child(odd),.about__column:first-child{padding-left:0}.about__column:nth-child(even),.about__column:last-child{padding-right:0}} +.content-in-columns{margin-bottom:1.5em;border-top:3px dashed #f3f1eb;padding-top:1.5em}.content-in-columns:first-of-type{border-top:none;padding-top:0}.stamp-graphic{position:absolute;width:24%;right:2em;-webkit-transform:rotate(9deg);-moz-transform:rotate(9deg);-o-transform:rotate(9deg);transform:rotate(9deg)}@media (min-width: 45.4375em){.stamp-graphic{top:20em}}@media (min-width: 50.6875em){.stamp-graphic{top:19em}}@media (min-width: 66.875em){.stamp-graphic{top:9em}} +@media (min-width: 50.6875em){.about__intro p{max-width:27em}}@media (min-width: 66.875em){.about__intro p{max-width:34em}} +.deployments__intro{background-color:#974495;margin-bottom:4em;color:#fff;text-align:center;background-image:url("../img/worldmap-pale.svg");background-position:center center;background-repeat:no-repeat;background-size:600px 325px}@media (min-width: 30em){.deployments__intro{padding:8.1em 0;background-size:1000px 541px}}.deployments__intro h1{font-size:1.2em;font-weight:600;text-shadow:0px 2px 1px rgba(0,0,0,0.3);margin-bottom:1em}@media (min-width: 30em){.deployments__intro h1{font-size:1.666666667em}}.deployments__intro h1 span{display:block;font-size:1.5em;margin-top:0.25em;font-weight:700;line-height:1em}@media (min-width: 30em){.deployments__intro h1 span{margin-top:0.15em;font-size:1.8em}}@media (min-width: 56.88889em){.deployments__intro h1 span{font-size:2.4em}}.deployments__intro p{font-size:1em;max-width:23em;margin:0 auto}@media (min-width: 30em){.deployments__intro p{font-size:1.666666667em}} +.no-svg .deployments__intro{background-image:url("../img/worldmap-pale.png")}.deployments__content h2{margin-bottom:1.5em}.deployments__list--minor{margin-bottom:2em}@media (min-width: 30em){.deployments__list--minor{margin-bottom:4em}} +@media (min-width: 40em){.deployments__unit--major{display:inline-block;width:48.5%;margin-right:3%;vertical-align:top}}.deployments__unit--major:nth-child(even){margin-right:0}.deployments__unit--minor{display:inline-block;width:47.5%;vertical-align:top}.deployments__unit--minor:nth-child(n){margin-right:5%}.deployments__unit--minor:nth-child(even){margin-right:0}@media (min-width: 37.22222em){.deployments__unit--minor{width:30%}.deployments__unit--minor:nth-child(n){margin-right:5%}.deployments__unit--minor:nth-child(3n+3){margin-right:0}}@media (min-width: 56.88889em){.deployments__unit--minor{width:22.25%}.deployments__unit--minor:nth-child(n){margin-right:3%}.deployments__unit--minor:nth-child(4n+4){margin-right:0}}@media (min-width: 77.77778em){.deployments__unit--minor{width:14.166666667%}.deployments__unit--minor:nth-child(n){margin-right:3%}.deployments__unit--minor:nth-child(6n+6){margin-right:0}} +.deployment,.deployment--minor,.deployment--major{margin-bottom:2em}@media (min-width: 40em){.deployment,.deployment--minor,.deployment--major{margin-bottom:3em}} +.deployment__title{font-weight:600;font-size:1.3em;margin-bottom:0.1em;padding-top:0.2em}@media (min-width: 56.88889em){.deployment__title{font-size:1.5em}} +.deployment__country{font-weight:600;font-size:1em;color:#787774;margin-top:0;margin-bottom:0.1em}@media (min-width: 56.88889em){.deployment__country{font-size:1.1em}} +.deployment__link{margin-top:0;margin-bottom:0.5em;font-size:0.888888889em}.deployment__link a{display:block;text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@media (min-width: 56.88889em){.deployment__link{font-size:1em}} +.deployment__description{font-size:0.888888889em;clear:both}.deployment__screenshot{border:1px solid #e4e3dd}.deployment--minor .deployment__title{padding-top:0;font-size:1.1em}.deployment--minor .deployment__country{font-size:1em}.deployment--minor .deployment__link{font-size:0.777777778em}.deployment--major .deployment__screenshot{width:33%;float:left;margin-bottom:1em}.deployment--major .deployment__title,.deployment--major .deployment__country,.deployment--major .deployment__link{margin-left:37%}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}.header-link{padding-left:0.2em;opacity:0;-webkit-transition:opacity 0.2s ease-in-out 0.1s;-moz-transition:opacity 0.2s ease-in-out 0.1s;-ms-transition:opacity 0.2s ease-in-out 0.1s}h2:hover .header-link,h3:hover .header-link,h4:hover .header-link,h5:hover .header-link,h6:hover .header-link{opacity:1}#feedback_form{display:none;border:1px solid #ccc;padding:0.5em;font-size:0.85em;text-align:center}#feedback_form input{margin-right:4px}.ui-dropdown-list{position:absolute;left:175px;top:0.55em}p.ui-dropdown-list-trigger{margin-top:0}.ui-dropdown-list-trigger .current-locale{border:1px solid rgba(255,255,255,0.3);border-radius:3.5px;position:relative;z-index:999}.ui-dropdown-list-trigger .current-locale:after{color:#fff;display:block;position:absolute;content:'';right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #fff}.ui-dropdown-list-trigger .current-locale,.ui-dropdown-list .available-languages a{display:block;width:46px;cursor:pointer;padding:5px 8px;font-size:13px;line-height:13px;color:#fff;font-weight:normal}.ui-dropdown-list .available-languages{display:none;position:absolute;top:25px;margin-top:0;padding:0;z-index:1000}.ui-dropdown-list li{list-style-type:none}.ui-dropdown-list .available-languages a,.ui-dropdown-list .available-languages a:link,.ui-dropdown-list .available-languages a:visited{display:block;background-color:#333}.ui-dropdown-list .available-languages a:hover,.ui-dropdown-list .available-languages a:focus{border-bottom:none;color:#fff}.no-js .ui-dropdown-list .available-languages,.ui-dropdown-list.active .available-languages{display:block}.ui-dropdown-list.active .current-locale{background-color:#863c83;border-color:#632c61;border-bottom-left-radius:0;border-bottom-right-radius:0;color:#fff}.ui-dropdown-list.active .current-locale:after{border-top-color:#fff} diff --git a/assets/sass/alaveteli-org.scss b/assets/sass/alaveteli-org.scss index 01ec01a88..aa895957a 100644 --- a/assets/sass/alaveteli-org.scss +++ b/assets/sass/alaveteli-org.scss @@ -98,11 +98,13 @@ h3 { @media (min-width: 47.5em) { position: absolute; top: 0.4em; - left: 180px; + right: 80px; + } + @media (min-width: 52.5em) { + right: 160px; } @media (min-width: $large-screen) { - left: 240px; - top: 0.35em; + top: 0; } } @@ -222,6 +224,10 @@ h3 { } } +.hero .action-buttons { + max-width: 28em; +} + .what-is-alaveteli { @extend %full-width-section; position: relative; @@ -892,3 +898,91 @@ h6:hover .header-link { margin-right: 4px; } } + +/* LANGUAGE SWITCHER */ +/* ui-dropdown-list */ +.ui-dropdown-list { + position: absolute; + left: 175px; + top: 0.55em; +} + +p.ui-dropdown-list-trigger { + margin-top: 0; +} + +.ui-dropdown-list-trigger .current-locale { + border: 1px solid rgba(255,255,255,0.3); + border-radius: 3.5px; + position: relative; + z-index: 999; +} + +.ui-dropdown-list-trigger .current-locale:after { + color: #fff; + display: block; + position: absolute; + content: ''; + right: 5px; + top: 10px; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #fff; +} + +.ui-dropdown-list-trigger .current-locale, +.ui-dropdown-list .available-languages a { + display: block; + width: 46px; + cursor: pointer; + padding: 5px 8px; + font-size: 13px; + line-height: 13px; + color: #fff; + font-weight: normal; +} + +.ui-dropdown-list .available-languages { + display: none; + position: absolute; + top: 25px; + margin-top: 0; + padding: 0; + z-index: 1000; +} + +.ui-dropdown-list li { + list-style-type: none; +} + +.ui-dropdown-list .available-languages a, +.ui-dropdown-list .available-languages a:link, +.ui-dropdown-list .available-languages a:visited { + display: block; + background-color: $colour_black; +} + +.ui-dropdown-list .available-languages a:hover, +.ui-dropdown-list .available-languages a:focus { + border-bottom: none; + color: #fff; +} + +.no-js .ui-dropdown-list .available-languages, +.ui-dropdown-list.active .available-languages { + display: block; +} + +.ui-dropdown-list.active .current-locale { + background-color: darken($colour_brand, 10%); + border-color: darken($colour_brand, 20%); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + color: #fff; +} + +.ui-dropdown-list.active .current-locale:after { + border-top-color: #fff; +} diff --git a/community/conferences/index.md b/community/conferences/index.md index d6f84ca60..8ad092817 100644 --- a/community/conferences/index.md +++ b/community/conferences/index.md @@ -4,4 +4,4 @@ title: Conferences --- Conferences ==================== -The first Alaveteli Conference, [AlaveteliCon 2012]({{ site.baseurl }}community/conferences/2012/), was a great success, and we hope to hold another soon. Watch this space! +The first Alaveteli Conference, [AlaveteliCon 2012]({{ page.baseurl }}/community/conferences/2012/), was a great success, and we hope to hold another soon. Watch this space! diff --git a/community/index.md b/community/index.md index 75ea435dd..f98a04226 100644 --- a/community/index.md +++ b/community/index.md @@ -13,7 +13,7 @@ The Alaveteli Community We actively help people set up and run Alaveteli instances all around the world. Alaveteli is more than just software, it's also a community of people -who care enough about <a href="{{ site.baseurl}}docs/glossary/#foi" +who care enough about <a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">Freedom of Information</a> to build and run sites to benefit the public. @@ -64,6 +64,6 @@ The [Alaveteli software is on github](https://github.com/mysociety/alaveteli) an Although asking a human is great, often what you want to know can be found in the documentation: -* [this documentation]({{ site.baseurl }}docs/) — always the first place to look +* [this documentation]({{ page.baseurl }}/docs/) — always the first place to look * [the dev wiki](https://github.com/mysociety/alaveteli/wiki) — informal or specific notes * [docs in the repo](https://github.com/mysociety/alaveteli/tree/rails-3-develop/doc) (although we're slowly phasing these out in favour of the docs you're reading now) diff --git a/docs/customising/config.md b/docs/customising/config.md index c03e0fc9e..a20a9f7df 100644 --- a/docs/customising/config.md +++ b/docs/customising/config.md @@ -14,7 +14,7 @@ title: Configuration The alaveteli code ships with an example configuration file: `config/general.yml-example`. -As part of the [installation process]({{ site.baseurl }}docs/installing/ ), the +As part of the [installation process]({{ page.baseurl }}/docs/installing/ ), the example file gets copied to `config/general.yml`. You **must** edit this file to suit your needs. @@ -208,7 +208,7 @@ indentation correct. If in doubt, look at the examples already in the file, and <a name="theme_urls"><code>THEME_URLS</code></a> </dt> <dd> - URLs of <a href="{{ site.baseurl }}docs/customising/themes/">themes</a> to download and use + URLs of <a href="{{ page.baseurl }}/docs/customising/themes/">themes</a> to download and use (when running the <code>rails-post-deploy</code> script). The earlier in the list means the templates have a higher priority. <div class="more-info"> @@ -228,7 +228,7 @@ THEME_URLS: <a name="theme_branch"><code>THEME_BRANCH</code></a> </dt> <dd> - When <code>rails-post-deploy</code> installs the <a href="{{ site.baseurl }}docs/customising/themes/">themes</a>, + When <code>rails-post-deploy</code> installs the <a href="{{ page.baseurl }}/docs/customising/themes/">themes</a>, it will try the theme branch first, but only if you've set <code>THEME_BRANCH</code> to be true. If the branch doesn't exist it will fall back to using a tagged version specific to your installed alaveteli version, and if that doesn't exist it will @@ -353,9 +353,9 @@ THEME_URLS: </dt> <dd> Is this a - <a href="{{site.baseurl}}docs/glossary/#staging" class="glossary__link">staging</a> or - <a href="{{site.baseurl}}docs/glossary/#development" class="glossary__link">development</a> site? - If not, it's a live <a href="{{site.baseurl}}docs/glossary/#production" class="glossary__link">production</a> + <a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">staging</a> or + <a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development</a> site? + If not, it's a live <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production</a> site. This setting controls whether or not the <code>rails-post-deploy</code> script will create the file <code>config/rails_env.rb</code> file to force Rails into production environment. @@ -506,7 +506,7 @@ THEME_URLS: </dt> <dd> Details for the - <a href="{{site.baseurl}}docs/glossary/#emergency" class="glossary__link">emergency user</a>. + <a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">emergency user</a>. <p> This is useful for creating the initial admin users for your site: <ul> @@ -518,7 +518,7 @@ THEME_URLS: </p> <p> For details of this process, see - <a href="{{site.baseurl}}docs/installing/next_steps/#create-a-superuser-admin-account">creating + <a href="{{ page.baseurl }}/docs/installing/next_steps/#create-a-superuser-admin-account">creating a superuser account</a>. </p> <div class="more-info"> @@ -557,7 +557,7 @@ THEME_URLS: <a name="incoming_email_domain"><code>INCOMING_EMAIL_DOMAIN</code></a> </dt> <dd> - Your email domain for incoming mail. See also <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. + Your email domain for incoming mail. See also <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. <div class="more-info"> <p>Example:</p> <ul class="examples"> @@ -575,7 +575,7 @@ THEME_URLS: <a name="incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> </dt> <dd> - An optional prefix to help you distinguish FOI requests. See also <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. + An optional prefix to help you distinguish FOI requests. See also <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. <div class="more-info"> <p>Example:</p> <ul class="examples"> @@ -625,7 +625,7 @@ THEME_URLS: <a name="contact_name"><code>CONTACT_NAME</code></a> </dt> <dd> - Email "from" details. See also <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. + Email "from" details. See also <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. <div class="more-info"> <p>Examples:</p> <ul class="examples"> @@ -644,7 +644,7 @@ THEME_URLS: <a name="track_sender_name"><code>TRACK_SENDER_NAME</code></a> </dt> <dd> - Email "from" details for track messages. See also <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. + Email "from" details for track messages. See also <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. <div class="more-info"> <p>Examples:</p> <ul class="examples"> @@ -700,7 +700,7 @@ EXCEPTION_NOTIFICATIONS_TO: <a name="forward_nonbounce_responses_to"><code>FORWARD_NONBOUNCE_RESPONSES_TO</code></a> </dt> <dd> - The email address to which non-bounce responses should be forwarded. See also <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. + The email address to which non-bounce responses should be forwarded. See also <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a>. <div class="more-info"> <p>Example:</p> <ul class="examples"> diff --git a/docs/customising/index.md b/docs/customising/index.md index 19100ad20..bd1247894 100644 --- a/docs/customising/index.md +++ b/docs/customising/index.md @@ -15,7 +15,7 @@ title: Customising ## Configuration settings You can customise much of Alaveteli's behaviour just by editing the configuration -file. This [complete list of Alaveteli's config settings]({{ site.baseurl }}docs/customising/config/) +file. This [complete list of Alaveteli's config settings]({{ page.baseurl }}/docs/customising/config/) shows the sort of things you can control in this way. <!-- TODO key settings --> @@ -24,7 +24,7 @@ shows the sort of things you can control in this way. It's common to want to change the basic appearance of the site. Although you can simply edit the default templates and CSS to do this, we **strongly -recommend** that you [create a theme]({{ site.baseurl }}docs/customising/themes/). +recommend** that you [create a theme]({{ page.baseurl }}/docs/customising/themes/). Themes do not need to be especially complex, but they allow your changes to work alongside the core code, which you can then update (when new releases or @@ -32,13 +32,13 @@ updates become available). ## Need Alaveteli in a different language? -No problem! See the [information about translating Alaveteli]({{ site.baseurl }}docs/customising/translation/). +No problem! See the [information about translating Alaveteli]({{ page.baseurl }}/docs/customising/translation/). ## Complex changes If you are a developer (or you have a team of programmers available) you can add any customisation that you want. But it's important to do this without breaking the core code, so that you can accept new releases with updates. -There's more detail in the [page about themes]({{ site.baseurl }}docs/customising/themes/). +There's more detail in the [page about themes]({{ page.baseurl }}/docs/customising/themes/). -See also the [documentation for developers]({{ site.baseurl }}docs/developers/). +See also the [documentation for developers]({{ page.baseurl }}/docs/developers/). diff --git a/docs/customising/states.md b/docs/customising/states.md index 7b89ef45d..0bc934082 100644 --- a/docs/customising/states.md +++ b/docs/customising/states.md @@ -6,16 +6,16 @@ title: States of requests # Request states <p class="lead"> - A <a href="{{site.baseurl}}docs/glossary/#request" class="glossary__link">request</a> + A <a href="{{ page.baseurl }}/docs/glossary/#request" class="glossary__link">request</a> passes through different <strong>states</strong> as it is processed. These may vary from one jurisdiction to another. </p> The request states are defined in the Alaveteli code, and we recommend you use -them (provided they match the <a href="{{ site.baseurl }}docs/glossary/#foi" +them (provided they match the <a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">FOI law</a> in your own jurisdiction). But if you do need to customise them, you can — see -<a href="{{ site.baseurl }}docs/customising/themes/#customising-the-request-states">Customising the request states</a> for details. +<a href="{{ page.baseurl }}/docs/customising/themes/#customising-the-request-states">Customising the request states</a> for details. ## WhatDoTheyKnow example @@ -24,7 +24,7 @@ may be in any of the states described below. Note that your site doesn't need to use the same states as WhatDoTheyKnow does. For example, Kosovo's instance uses slightly different states: see -[this comparison of their differences]({{ site.baseurl }}docs/customising/states_informatazyrtare/). +[this comparison of their differences]({{ page.baseurl }}/docs/customising/states_informatazyrtare/). ### States diff --git a/docs/customising/states_informatazyrtare.md b/docs/customising/states_informatazyrtare.md index e94f96588..a68e47e99 100644 --- a/docs/customising/states_informatazyrtare.md +++ b/docs/customising/states_informatazyrtare.md @@ -13,7 +13,7 @@ title: States of requests (InformataZyrtare) </p> The request states are defined in the Alaveteli code, and we recommend you use -them (provided they match the <a href="{{ site.baseurl }}docs/glossary/#foi" +them (provided they match the <a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">FOI law</a> in your own jurisdiction). ## InformataZyrtare.org (Kosovo) example @@ -29,7 +29,7 @@ facilitates this by allowing you to customise the states that are used. This example is to show clearly that you can use different states depending on your local requirements, and how that might look. See [Customising the request -states]({{ site.baseurl }}docs/customising/themes/) for details on how to do this. +states]({{ page.baseurl }}/docs/customising/themes/) for details on how to do this. ### States used by InformataZyrtare but not WDTK @@ -39,13 +39,13 @@ states]({{ site.baseurl }}docs/customising/themes/) for details on how to do thi ### States used by WDTK but not InformataZyrtare - * <a href="{{ site.baseurl }}docs/customising/states/#awaiting_description">awaiting_description</a> - * <a href="{{ site.baseurl }}docs/customising/states/#gone_postal">gone_postal</a> - * <a href="{{ site.baseurl }}docs/customising/states/#internal_review">internal_review</a> - * <a href="{{ site.baseurl }}docs/customising/states/#user_withdrawn">user_withdrawn</a> - * <a href="{{ site.baseurl }}docs/customising/states/#waiting_response_very_overdue">waiting_response_very_overdue</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#awaiting_description">awaiting_description</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#gone_postal">gone_postal</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#internal_review">internal_review</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#user_withdrawn">user_withdrawn</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#waiting_response_very_overdue">waiting_response_very_overdue</a> -For more details, see all the [states used by WhatDoTheyKnow]({{site.baseurl}}docs/customising/states/) for details. +For more details, see all the [states used by WhatDoTheyKnow]({{ page.baseurl }}/docs/customising/states/) for details. --- @@ -54,7 +54,7 @@ For more details, see all the [states used by WhatDoTheyKnow]({{site.baseurl}}do ### Details of InformataZytare states -The states which aren't represented on [WDTK's states]({{ site.baseurl }}docs/customising/states/) are described +The states which aren't represented on [WDTK's states]({{ page.baseurl }}/docs/customising/states/) are described in a little more detail here: <ul class="definitions"> diff --git a/docs/customising/themes.md b/docs/customising/themes.md index a2b498084..152277b3f 100644 --- a/docs/customising/themes.md +++ b/docs/customising/themes.md @@ -13,7 +13,7 @@ title: Themes </p> When you customise your Alaveteli site, there is a lot you can change just -by editing the [config settings]({{ site.baseurl }}docs/customising/config/). +by editing the [config settings]({{ page.baseurl }}/docs/customising/config/). But if you want to change the way the site looks, or add more specific behaviour, you'll need to make a **theme**. @@ -46,23 +46,23 @@ about this, [ask for help](/community/)! We use -<a href="{{ site.baseurl }}docs/glossary/#git" class="glossary__link">git</a> +<a href="{{ page.baseurl }}/docs/glossary/#git" class="glossary__link">git</a> to manage Alaveteli's source code, and Alaveteli expects your theme to be in a git repository of its own. Although you *can* start customising your site on your -<a href="{{ site.baseurl }}docs/glossary/#development" class="glossary__link">development server</a> +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development server</a> by playing with the `alavetelitheme` theme that Alaveteli ships with, we recommend you make it into your own repo as soon as you can. If you're seriously customising — and certainly before you can deploy to a -<a href="{{ site.baseurl }}docs/glossary/#production" class="glossary__link">production server</a> — +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production server</a> — you must do this. Make sure you choose a unique name for your theme (and hence its repo). If your site is `abcexample.com`, we suggest you call your theme something like `abcexample-theme`. Alaveteli's `themes:install` rake task, which installs themes, works by getting the git repo from the URL specified in the config setting -[`THEME_URLS`]({{ site.baseurl }}docs/customising/config/#theme_urls). This is +[`THEME_URLS`]({{ page.baseurl }}/docs/customising/config/#theme_urls). This is why your theme must be in its own git repo. One way to create your own theme is to fork the `alavetelitheme` theme from @@ -75,7 +75,7 @@ you can duplicate `alivetelitheme` (in `lib/themes/`) and change its name. Here's an example of a complex theme in action: see the theme repo at <a href="https://github.com/mysociety/whatdotheyknow-theme">https://github.com/mysociety/whatdotheyknow-theme</a>. This is the theme for UK's Alaveteli instance - <a href="{{ site.baseurl}}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>. + <a href="{{ page.baseurl }}/docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>. You can see it <a href="https://www.whatdotheyknow.com">deployed on the WhatDoTheyKnow website</a>. This happens because the WhatDoTheyKnow server has this setting in <code>config/general.yml</code>: @@ -92,7 +92,7 @@ The most common requirement is to brand the site: at a minimum, [add the categories](#adding-your-own-categories-for-authorities) that authorities can appear in (you can see these as groupings on the left-hand side of the [View authorities](https://www.whatdotheyknow.com/body/list/all) page -on <a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>). +on <a href="{{ page.baseurl }}/docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>). You may also want to [tweak the different states](#customising-the-request-states) that a request can go through. @@ -116,15 +116,15 @@ We try to encapsulate all site-specific functionality in one of these places: * **site configuration**<br> - use the [config settings]({{ site.baseurl }}docs/customising/config/) + use the [config settings]({{ page.baseurl }}/docs/customising/config/) for example, the name of your site, the available languages, and so on. You change these by editing `config/general.yml`. * **data**<br> for example, the public authorities to whom requests should be addressed, and the tags and categories for grouping them. You control all this through the - <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin - interface</a>: see the [admin manual]({{ site.baseurl }}docs/running/admin_manual). + <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin + interface</a>: see the [admin manual]({{ page.baseurl }}/docs/running/admin_manual). * **a theme**<br> installed in `lib/themes`. The page you're reading now is all about what you can do in a theme. @@ -140,7 +140,7 @@ You can also install the theme by hand, by running: bundle exec rake themes:install This installs whichever theme is specified by the -[`THEME_URLS`]({{ site.baseurl }}docs/customising/config/#theme_urls) +[`THEME_URLS`]({{ page.baseurl }}/docs/customising/config/#theme_urls) setting. The sample theme contains examples for nearly everything you might @@ -149,7 +149,7 @@ use that as the basis for your own theme. <div class="attention-box info"> The - <code><a href="{{ site.baseurl }}docs/customising/config/#theme_urls">THEME_URLS</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#theme_urls">THEME_URLS</a></code> setting allows you to specifiy more than one theme — but normally you only need one. </div> @@ -180,7 +180,7 @@ own, for your own users. The core templates define the layout and user interface of an Alaveteli site. They are in `app/views/` and use -<a href="{{ site.baseurl }}" class="glossary__link">Rails</a>' +<a href="{{ page.baseurl }}/" class="glossary__link">Rails</a>' ERB syntax. For example, the template for the home page lives at `app/views/general/frontpage.html.erb`, and the template for the "about us" page is at `app/views/help/about.html.erb`. @@ -198,7 +198,7 @@ then that will appear instead of the core "about us" file. Alaveteli uses Rails' [asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html) to convert and compress stylesheets written in -<a href="{{ site.baseurl }}docs/glossary/#sass" class="glossary__link">Sass</a> +<a href="{{ page.baseurl }}/docs/glossary/#sass" class="glossary__link">Sass</a> into minified concatenated CSS. Assets are stored in core Alaveteli under `app/assets` -- in `fonts`, `images`, `javascripts` and `stylesheets`. The default theme has corresponding asset directories in `alavetelitheme/assets` @@ -210,7 +210,7 @@ site instead of the logo from `app/assets/images/logo.png`. ### Changing the colour scheme Alaveteli uses a set of basic -<a href="{{ site.baseurl }}docs/glossary/#sass" class="glossary__link">Sass</a> +<a href="{{ page.baseurl }}/docs/glossary/#sass" class="glossary__link">Sass</a> modules to define the layout for the site on different device sizes, and some basic styling. These modules are in `app/assets/stylesheets/responsive`. The colours and fonts are added in the theme -- `alavetelitheme` defines them in @@ -238,26 +238,26 @@ You can load extra stylesheets and javascript files by adding them to ## Adding your own categories for authorities You should add -<a href="{{ site.baseurl }}docs/glossary/#category" class="glossary__link">categories</a> +<a href="{{ page.baseurl }}/docs/glossary/#category" class="glossary__link">categories</a> for the authorities on your site -- Alaveteli will display the authorities grouped by categories if you have set any up. Alaveteli uses -<a href="{{ site.baseurl }}docs/glossary/#tag" class="glossary__link">tags</a> +<a href="{{ page.baseurl }}/docs/glossary/#tag" class="glossary__link">tags</a> to assign authorities to the right categories, but you should add tags anyway because they are also used by the site's search facility. Together, categories and tags help your users find the right authority for their request. You can set all this up using the -<a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>. -See [more about categories and tags]({{ site.baseurl }}docs/running/categories_and_tags/) +<a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>. +See [more about categories and tags]({{ page.baseurl }}/docs/running/categories_and_tags/) for details. ## Customising the request states As mentioned above, if you can possibly live with the -[default Alaveteli request statuses]({{ site.baseurl }}docs/customising/states/), +[default Alaveteli request statuses]({{ page.baseurl }}/docs/customising/states/), it would be good to do so. You can set how many days must pass before a request is considered "overdue" in the main site config file — -see [`REPLY_LATE_AFTER_DAYS`]({{ site.baseurl }}docs/customising/config/#reply_late_after_days). +see [`REPLY_LATE_AFTER_DAYS`]({{ page.baseurl }}/docs/customising/config/#reply_late_after_days). If you can't live with the states as they are, there's a very basic way to add to them (we're working on this, so it will be improved over time). Currently, @@ -313,24 +313,24 @@ The important pages to customise and translate are listed here. We note where Al * [contact](https://github.com/mysociety/alaveteli/blob/master/app/views/help/contact.html.erb): how to get in touch -* [credits](https://github.com/mysociety/alaveteli/blob/master/app/views/help/credits.html.erb): who is involved in the site. Importantly, includes [a section](https://github.com/mysociety/alaveteli/blob/master/app/views/help/credits.html.erb#L71) on how users can help the project. Users are referred to this section if they categorise all the requests in the [categorisation game]({{ site.baseurl }}docs/glossary/#categorisation-game). +* [credits](https://github.com/mysociety/alaveteli/blob/master/app/views/help/credits.html.erb): who is involved in the site. Importantly, includes [a section](https://github.com/mysociety/alaveteli/blob/master/app/views/help/credits.html.erb#L71) on how users can help the project. Users are referred to this section if they categorise all the requests in the [categorisation game]({{ page.baseurl }}/docs/glossary/#categorisation-game). * [officers](https://github.com/mysociety/alaveteli/blob/master/app/views/help/officers.html.erb): information for the officers who deal with FOI at authorities. They get a link to this page in emails that the site sends them. -* [privacy](https://github.com/mysociety/alaveteli/blob/master/app/views/help/privacy.html.erb): privacy policy, plus information making it clear that requests are going to appear on the internet. Let users know if they are allowed to use pseudonyms in your jurisdiction. Users are referred to the [section on this page](https://github.com/mysociety/alaveteli/blob/master/app/views/help/privacy.html.erb#L114) about what to do if the authority says they only have a paper copy of the information requested if the user classifies their request as ['gone postal']({{ site.baseurl }}docs/customising/states/#gone_postal). +* [privacy](https://github.com/mysociety/alaveteli/blob/master/app/views/help/privacy.html.erb): privacy policy, plus information making it clear that requests are going to appear on the internet. Let users know if they are allowed to use pseudonyms in your jurisdiction. Users are referred to the [section on this page](https://github.com/mysociety/alaveteli/blob/master/app/views/help/privacy.html.erb#L114) about what to do if the authority says they only have a paper copy of the information requested if the user classifies their request as ['gone postal']({{ page.baseurl }}/docs/customising/states/#gone_postal). * [requesting](https://github.com/mysociety/alaveteli/blob/master/app/views/help/requesting.html.erb): the main help page about making requests. How it works, how to decide who to write to, what they can expect in terms of responses, how to make appeals, etc. Users are referred to the [section on how quickly a response to their request should arrive](https://github.com/mysociety/alaveteli/blob/master/app/views/help/requesting.html.erb#L125) when their request is overdue for a response. They are referred to the [section on what to do if the Alaveteli site isn't showing the authority they want to request information](https://github.com/mysociety/alaveteli/blob/master/app/views/help/requesting.html.erb#L30) from the page that allows them to list and search authorities. * [unhappy](https://github.com/mysociety/alaveteli/blob/master/app/views/help/unhappy.html.erb): users are taken to this page after a request that has been somehow unsuccessful (e.g. the request has been refused, or the authority is insisting on a postal request). The page should encourage them to keep going, e.g. by starting a new request or addressing it to a different body. In particular users are referred to the [section on using other means](https://github.com/mysociety/alaveteli/blob/master/app/views/help/unhappy.html.erb#L83) to get their question answered. If the user has requested an internal review of their request, they are referred to [the section on this page](https://github.com/mysociety/alaveteli/blob/master/app/views/help/unhappy.html.erb#L28) that describes the law relating to how long a review should take. -* [why email](https://github.com/mysociety/alaveteli/blob/master/app/views/help/_why_they_should_reply_by_email.html.erb): a snippet of information that explains why users should insist on replies by email. This is displayed next to requests that have ["gone postal"]({{ site.baseurl }}docs/customising/states/#gone_postal) - where the authority has asked for the user's physical address so that they can reply with a paper response. +* [why email](https://github.com/mysociety/alaveteli/blob/master/app/views/help/_why_they_should_reply_by_email.html.erb): a snippet of information that explains why users should insist on replies by email. This is displayed next to requests that have ["gone postal"]({{ page.baseurl }}/docs/customising/states/#gone_postal) - where the authority has asked for the user's physical address so that they can reply with a paper response. * [sidebar](https://github.com/mysociety/alaveteli/blob/master/app/views/help/_sidebar.html.erb): a menu for the help pages with a link to each one. You should customise this so that it includes any extra help pages you add, and doesn't include any you remove. You can add your own help pages to your site by replacing the default pages in your theme with your own versions, using a locale suffix for each page to indicate what language the page is written in. No locale -suffix is needed for pages written for the [default locale]({{ site.baseurl }}docs/customising/config/#default_locale) for the site. +suffix is needed for pages written for the [default locale]({{ page.baseurl }}/docs/customising/config/#default_locale) for the site. For example, [alavetelitheme contains help pages](https://github.com/mysociety/alavetelitheme/tree/master/lib/views/help) for the default 'en' locale and an example Spanish 'about' page. If no @@ -355,7 +355,7 @@ level, see `alavetelitheme/lib/controller_patches.rb` and ## Quickly switching between themes On your -<a href="{{ site.baseurl }}docs/glossary/#development" class="glossary__link">development server</a>, +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development server</a>, you can use [`script/switch-theme.rb`](https://github.com/mysociety/alaveteli/blob/master/script/switch-theme.rb) to set the current theme if you are working with multiple themes. This can be diff --git a/docs/customising/translation.md b/docs/customising/translation.md index bc0b52b6e..28d5c76e7 100644 --- a/docs/customising/translation.md +++ b/docs/customising/translation.md @@ -17,7 +17,7 @@ title: Translation Alaveteli ships ready to run in a number of different languages. If Alaveteli has already been translated into the language (or languages) you need, you just need to configure it -- see -[`AVAILABLE_LOCALES`]({{ site.baseurl }}docs/customising/config/#available_locales). +[`AVAILABLE_LOCALES`]({{ page.baseurl }}/docs/customising/config/#available_locales). [Look in the `locale/` directory](https://github.com/mysociety/alaveteli/tree/master/locale) to see what translations are already available. Some are complete @@ -40,7 +40,7 @@ There are two reasons the translations may need more work before you can use the current translation and what state it's in. Translators are members of the Alaveteli -[community]({{site.baseurl}}community/), and often work separately from the +[community]({{ page.baseurl }}/community/), and often work separately from the developers. This means translations can lag a little behind the code. However, our release process includes a "translation freeze", which gives the translators a chance to catch up -- read the rest of this page for details. @@ -48,7 +48,7 @@ translators a chance to catch up -- read the rest of this page for details. ## Alaveteli's translations You don't need to be a programmer to translate Alaveteli -- we use an external -website called <a href="{{ site.baseurl }}docs/glossary/#transifex" class="glossary__link">Transifex</a> to help manage translations. This makes it easy for +website called <a href="{{ page.baseurl }}/docs/glossary/#transifex" class="glossary__link">Transifex</a> to help manage translations. This makes it easy for translators to get to work, but it does mean you (or your technical team) need to do a little extra work to get those translations back into Alaveteli when they are ready. @@ -59,9 +59,9 @@ The Transifex project is at fairly easy-to-use interface for contributing translations. Alaveteli localises strings using GNU gettext and -<a href="{{site.baseurl}}docs/glossary/#po" class="glossary__link"><code>.pot</code> & <code>.po</code> files</a>. +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link"><code>.pot</code> & <code>.po</code> files</a>. If you're a developer, you should read -[internationalising Alaveteli]({{ site.baseurl }}docs/developers/i18n/). +[internationalising Alaveteli]({{ page.baseurl }}/docs/developers/i18n/). ## What a translator needs to do @@ -79,10 +79,10 @@ use some code to mark sentences or words ("strings") that they think will need to be translated. When the Alaveteli -<a href="{{site.baseurl}}docs/glossary/#release" class="glossary__link">release manager</a> +<a href="{{ page.baseurl }}/docs/glossary/#release" class="glossary__link">release manager</a> is planning a release, they will upload a template containing all the strings to be translated (called a -<a href="{{site.baseurl}}docs/glossary/#po" class="glossary__link"><code>.pot</code> file</a>) +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link"><code>.pot</code> file</a>) to Transifex. This causes your own translations in Transifex to be updated with the latest strings. @@ -156,7 +156,7 @@ translate the text that comes *after* the `|`. ## How the translations get into Alaveteli In order to get the translated strings from Transifex into Alaveteli, follow -the instructions in these [deployment notes]({{ site.baseurl }}docs/developers/i18n/#deployment-notes). +the instructions in these [deployment notes]({{ page.baseurl }}/docs/developers/i18n/#deployment-notes). This will be the job of the technical people on your team (or even mySociety's release manager). If translators aren't technical, they can use Transifex without needing to worry about this. @@ -166,7 +166,7 @@ use Transifex without needing to worry about this. As the help pages for Alaveteli contain lots of text, they're translated outside Transifex, by translating each whole help page and replacing it in the theme that Alaveteli is using, so that it overrides the default -page. See the [guide to Alaveteli's themes]({{ site.baseurl }}docs/customising/themes/#customising-the-help-pages) for more +page. See the [guide to Alaveteli's themes]({{ page.baseurl }}/docs/customising/themes/#customising-the-help-pages) for more information on this. ## Developers and internationalisation @@ -174,7 +174,7 @@ information on this. If you're writing new code for Alaveteli, then you're a developer, and you need to understand how to make any text you add easy for translators to work with -- see the page about -[internationalising Alaveteli]({{site.baseurl}}docs/developers/i18n/). +[internationalising Alaveteli]({{ page.baseurl }}/docs/developers/i18n/). If you are a developer or translator actively working on internationalising Alaveteli code, you should talk to us to find out when the next release is due, diff --git a/docs/developers/i18n.md b/docs/developers/i18n.md index fb7f2930b..c10ebeab8 100644 --- a/docs/developers/i18n.md +++ b/docs/developers/i18n.md @@ -7,11 +7,11 @@ title: Internationalisation (for devs) <p class="lead"> This page describes some technical aspects of - <a href="{{ site.baseurl }}docs/glossary/#i18n" class="glossary__link">internationalising</a> + <a href="{{ page.baseurl }}/docs/glossary/#i18n" class="glossary__link">internationalising</a> the Alaveteli code. It's mostly aimed at devs who are working on the codebase — if you just want to translate Alaveteli into your own language, see - <a href="{{ site.baseurl }}docs/customising/translation">translating Alaveteli</a> + <a href="{{ page.baseurl }}/docs/customising/translation">translating Alaveteli</a> instead. </p> @@ -19,9 +19,9 @@ title: Internationalisation (for devs) Deployed translations for the project live in ``locale/``. -We encourage translations to be done on <a href="{{ site.baseurl }}docs/glossary/#transifex" class="glossary__link">Transifex</a> +We encourage translations to be done on <a href="{{ page.baseurl }}/docs/glossary/#transifex" class="glossary__link">Transifex</a> because translators can work through its web interface rather than needing to edit the -<a href="{{ site.baseurl }}docs/glossary/#po" class="glossary__link">`.po` and `.pot` files</a> +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">`.po` and `.pot` files</a> directly. Ultimately, Transifex just captures translators' work and turns it into the files that Alaveteli needs (using gettext). @@ -31,7 +31,7 @@ For example, to deploy English and Spanish translations at once: * Ensure their `.po` files are at ```locale/en/app.po``` and ```locale/es/app.po``` (for example, by downloading them from Transifex) - * Set <code><a href="{{ site.baseurl }}docs/customising/config/#available_locales">AVAILABLE_LOCALES</a></code> + * Set <code><a href="{{ page.baseurl }}/docs/customising/config/#available_locales">AVAILABLE_LOCALES</a></code> to <code>en es</code> ### What to do if you don't have complete translations for an older release of Alaveteli @@ -56,7 +56,7 @@ You need to do this if you've added any new strings to the code that need translations (or if you change an existing one). To update the -<a href="{{ site.baseurl }}docs/glossary/#po" class="glossary__link">`.po` or `.pot` files</a> +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">`.po` or `.pot` files</a> for each language, run: bundle exec rake gettext:store_model_attributes @@ -69,7 +69,7 @@ If `gettext:find` only creates the file `locale/im-config.pot` then you need to unset the `TEXTDOMAIN` environment variable and try again. For more details about the translations, see the page about -[translating Alaveteli]({{ site.baseurl }}docs/customising/translation/). +[translating Alaveteli]({{ page.baseurl }}/docs/customising/translation/). ## Technical implementation details @@ -173,5 +173,5 @@ The release manager will enforce a translation freeze just before a new release is cut. During such time, you must not introduce new strings to the code if your work is due for inclusion in this release. This is necessary to allow translators time to complete and check their translations against all the known -strings. See more about [translating Alaveteli]({{ site.baseurl }}docs/customising/translation/). +strings. See more about [translating Alaveteli]({{ page.baseurl }}/docs/customising/translation/). diff --git a/docs/developers/index.md b/docs/developers/index.md index f1167a22b..bcf74be16 100644 --- a/docs/developers/index.md +++ b/docs/developers/index.md @@ -16,10 +16,10 @@ title: For developers reasons, we recommend the use of [Varnish](https://www.varnish-cache.org). * To help you understand what the code is doing, read this [high-level - overview]({{ site.baseurl }}docs/developers/overview/), which includes a diagram of + overview]({{ page.baseurl }}/docs/developers/overview/), which includes a diagram of the models and how they are related. -* See the [API documentation]({{ site.baseurl }}docs/developers/api/) for how to get +* See the [API documentation]({{ page.baseurl }}/docs/developers/api/) for how to get data into or out of Alaveteli. * If you need to change or add strings in the interface, see our [guidelines @@ -40,23 +40,23 @@ title: For developers * Installing the software is a little involved, though it's getting easier. If you stick to Debian or Ubuntu, it should be possible to get a running version within a few hours. If you've got your own server, run the - [installation script]({{ site.baseurl }}docs/installing/script/), or follow the + [installation script]({{ page.baseurl }}/docs/installing/script/), or follow the instructions for a - [manual installation]({{ site.baseurl }}docs/installing/manual_install/). - Alternatively, there's an [Alaveteli EC2 AMI]({{ site.baseurl }}docs/installing/ami/) + [manual installation]({{ page.baseurl }}/docs/installing/manual_install/). + Alternatively, there's an [Alaveteli EC2 AMI]({{ page.baseurl }}/docs/installing/ami/) that might help you get up and running quickly. - [Get in touch]({{ site.baseurl }}community/) on the project mailing list or IRC + [Get in touch]({{ page.baseurl }}/community/) on the project mailing list or IRC for help. * A standard initial step for customising your deployment is [writing a - theme]({{ site.baseurl }}docs/customising/themes/). **If you only read one thing, + theme]({{ page.baseurl }}/docs/customising/themes/). **If you only read one thing, it should be this!** * Like many Ruby on Rails sites, the software is not hugely performant (see [these notes about performance issues](https://github.com/mysociety/alaveteli/wiki/Performance-issues) gathered over time with WhatDoTheyKnow). The site will run on a server with 512MB RAM but at least 2GB is recommended. Deployment behind [Varnish](https://www.varnish-cache.org) is also fairly essential. See - [production server best practices]({{site.baseurl}}docs/running/server/) for more. + [production server best practices]({{ page.baseurl }}/docs/running/server/) for more. * There's a number of [proposals for enhancements](https://github.com/mysociety/alaveteli/wiki/Proposals-for-enhancements), such as more user-focused features, but see also... @@ -76,7 +76,7 @@ title: For developers used in the past](https://www.mysociety.org/2009/09/17/whatdotheyknow-growing-pains-and-ruby-memory-leaks/) might be useful. -* If you're coding on a mac, see these [MacOS X installation notes]({{ site.baseurl }}docs/installing/macos/). <!-- [[OS X Quickstart]] --> +* If you're coding on a mac, see these [MacOS X installation notes]({{ page.baseurl }}/docs/installing/macos/). <!-- [[OS X Quickstart]] --> * We try to adhere to similar good practice across all our projects: see [mysociety.github.io](http://mysociety.github.io/) for things like our diff --git a/docs/getting_started.md b/docs/getting_started.md index 3ea67c818..bd8788ff3 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -114,11 +114,11 @@ help with this. The minimum spec for running a low traffic website is latest Debian Wheezy (7) or Squeeze (6) 64-bit or Ubuntu precise (12.04) as the operating system. Rackspace offer suitable cloud servers, which start out at around $25 / month. Then your tech person should follow the -[installation documentation]({{ site.baseurl }}docs/installing/). +[installation documentation]({{ page.baseurl }}/docs/installing/). Alternatively, you could use Amazon Web Services. This has the added advantage that you can use our preconfigured [Alaveteli EC2 -AMI]({{ site.baseurl }}docs/installing/ami/) to get you +AMI]({{ page.baseurl }}/docs/installing/ami/) to get you started almost instantly. However, it's more expensive than Rackspace, especially if you want more RAM. @@ -189,7 +189,7 @@ custom homepage, different fonts, etc; however, the more you customise the site, the harder it is to upgrade in the future; and you'll need a developer and/or designer to help do these customisations. We call the custom set of colours, fonts, logos etc a "theme"; there are some notes for developers about -[writing a theme]({{ site.baseurl }}docs/customising/themes/). You +[writing a theme]({{ page.baseurl }}/docs/customising/themes/). You might spend anywhere between 1 and 15 days on this. ### Legislative differences @@ -216,7 +216,7 @@ often less. But complicated workflows might take a bit longer. The default help pages in Alaveteli are taken from WhatDoTheyKnow, and are therefore relevant only to the UK. You should take these pages as inspiration, -but review their content with a view to your jurisdiction. See [the documentation on Alaveteli's themes]({{ site.baseurl }}docs/customising/themes/#customising-the-help-pages) for details +but review their content with a view to your jurisdiction. See [the documentation on Alaveteli's themes]({{ page.baseurl }}/docs/customising/themes/#customising-the-help-pages) for details on which pages are important, and what content they need to have. The help pages contain some HTML. Your tech person should be able to advise on @@ -229,7 +229,7 @@ that you'll be sending out in response to common user queries and administrative tasks -- for example, an email that you send to IT departments asking them to whitelist emails from your Alaveteli website (if your emails are being marked as spam). See the -[Administrator's Manual]({{ site.baseurl }}docs/running/admin_manual/) for details +[Administrator's Manual]({{ page.baseurl }}/docs/running/admin_manual/) for details on some of the common administrative tasks. There is a list of the standard emails used by WhatDoTheyKnow on the [FOI Wiki](http://foiwiki.com/foiwiki/index.php/Common_WhatDoTheyKnow_support_responses). @@ -276,7 +276,7 @@ spreadsheet. The help pages need to have one copy saved for each language; your tech person will put them in the right place. The web interface translations are managed and collaborated via a website -called <a href="{{ site.baseurl }}docs/glossary/#transifex" class="glossary__link">Transifex</a>. This website allows teams of translators to collaborate in +called <a href="{{ page.baseurl }}/docs/glossary/#transifex" class="glossary__link">Transifex</a>. This website allows teams of translators to collaborate in one place, using a fairly easy interface. The Alaveteli page on Transifex is at @@ -303,7 +303,7 @@ review the untranslated strings. ## Step five: Test drive the site For launch, the tech person should review the [Production Server Best -Practices]({{ site.baseurl }}docs/running/server/). +Practices]({{ page.baseurl }}/docs/running/server/). A low-key launch, where you tell just a few trusted people about the site, is a very good idea. You can then track how things work, and gauge the responses of diff --git a/docs/glossary.md b/docs/glossary.md index d0e03b41d..94b29648c 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -66,14 +66,14 @@ Definitions </dt> <dd> The <strong>admin interface</strong> allows users who have - <a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">super</a> + <a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">super</a> administrator privilege to manage some aspects of how your Alaveteli site runs. <div class="more-info"> <p>More information:</p> <ul> <li> - You can access your installation's <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a> + You can access your installation's <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a> at <code>/admin</code>. </li> <li> @@ -83,13 +83,12 @@ Definitions </li> <li> On a newly-installed Alaveteli system, you can grant yourself - admin privilege by using the - <a href="{{ site.baseurl }}docs/glossary/#emergency" class="glossary__link">emergency + <a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">emergency user</a>. </li> <li> For lots more about running an Alaveteli site, see the - <a href="{{ site.baseurl }}running/admin_manual">adminstrator's guide</a>. + <a href="{{ page.baseurl }}/running/admin_manual">adminstrator's guide</a>. </li> </ul> </div> @@ -193,7 +192,7 @@ Definitions </li> <li> You can organise your authorities using - <a href="{{ site.baseurl }}docs/running/categories_and_tags/">categories and tags</a>. + <a href="{{ page.baseurl }}/docs/running/categories_and_tags/">categories and tags</a>. </li> </ul> </div> @@ -212,12 +211,12 @@ Definitions <ul> <li> Use the config setting - <code><a href="{{site.baseurl}}docs/customising/config/#blackhole_prefix">BLACKHOLE_PREFIX</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#blackhole_prefix">BLACKHOLE_PREFIX</a></code> to specify what this email address looks like. </li> <li> Conversely, see - <code><a href="{{site.baseurl}}docs/customising/config/#contact_email">CONTACT_EMAIL</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a></code> to specify the email address to which users' emails (such as support enquiries) will be delivered. </li> @@ -235,7 +234,7 @@ Definitions <p>More information:</p> <ul> <li> - <a href="{{ site.baseurl }}docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a> + <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">How Alaveteli handles email</a> </li> <li>The wikipedia page on <a href="http://en.wikipedia.org/wiki/Bounce_message">bounce messages</a> </li> @@ -253,7 +252,7 @@ Definitions <p>More information:</p> <ul> <li> - how to <a href="{{ site.baseurl }}docs/installing/deploy/">deploy Alaveteli</a> (and why it's + how to <a href="{{ page.baseurl }}/docs/installing/deploy/">deploy Alaveteli</a> (and why it's a good idea) </li> <li> @@ -282,7 +281,7 @@ Definitions authorities with specific categories. </p> More about - <a href="{{ site.baseurl }}docs/running/categories_and_tags/">categories and tags</a> + <a href="{{ page.baseurl }}/docs/running/categories_and_tags/">categories and tags</a> </dd> <dt> <a name="categorisation-game">categorisation game</a> @@ -312,7 +311,7 @@ Definitions <ul> <li> see the - <a href="{{ site.baseurl }}docs/running/admin_manual/">admin manual</a> + <a href="{{ page.baseurl }}/docs/running/admin_manual/">admin manual</a> for more about censor rules </li> <li> @@ -329,7 +328,7 @@ Definitions </dt> <dd> A <strong>dev server</strong> is one that is running your Alaveteli site - so you can <a href="{{ site.baseurl }}docs/customising/">customise it</a>, experiment + so you can <a href="{{ page.baseurl }}/docs/customising/">customise it</a>, experiment with different settings, and test that it does what you expect. This is different from a <a href="#production" class="glossary__link">production server</a>, which is the one your @@ -338,7 +337,7 @@ Definitions which is used for testing code before it goes live. <p> On your dev server, you should set - <code><a href="{{site.baseurl}}docs/customising/config/#staging_site">STAGING_SITE</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> to <code>1</code>. </p> </dd> @@ -357,7 +356,7 @@ Definitions <ul> <li> You can add a disclosure log URL by - <a href="{{ site.baseurl }}docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">updating authority data</a> in the admin. + <a href="{{ page.baseurl }}/docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">updating authority data</a> in the admin. </li> </ul> </div> @@ -380,18 +379,18 @@ Definitions <ul> <li> The username and password are defined by the configuration settings - <code><a href="{{site.baseurl}}docs/customising/config/#admin_username">ADMIN_USERNAME</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#admin_username">ADMIN_USERNAME</a></code> and - <code><a href="{{site.baseurl}}docs/customising/config/#admin_password">ADMIN_PASSWORD</a></code>. + <code><a href="{{ page.baseurl }}/docs/customising/config/#admin_password">ADMIN_PASSWORD</a></code>. </li> <li> For an example of using the emergency user, see - <a href="{{site.baseurl}}docs/installing/next_steps/#create-a-superuser-account-for-yourself">creating + <a href="{{ page.baseurl }}/docs/installing/next_steps/#create-a-superuser-account-for-yourself">creating a superuser account</a>. </li> <li> Disable the emergency user by setting - <code><a href="{{site.baseurl}}docs/customising/config/#disable_emergency_user">DISABLE_EMERGENCY_USER:</a> true</code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#disable_emergency_user">DISABLE_EMERGENCY_USER:</a> true</code> </li> </ul> </div> @@ -441,7 +440,7 @@ Definitions <p>More information:</p> <ul> <li> - See the <a href="{{ site.baseurl }}docs/installing/">installation instructions</a> which will + See the <a href="{{ page.baseurl }}/docs/installing/">installation instructions</a> which will clone the Alaveteli repo. </li> <li> @@ -473,7 +472,7 @@ Definitions <p>More information:</p> <ul> <li> - See more <a href="{{ site.baseurl }}docs/running/holding_pen">about + See more <a href="{{ page.baseurl }}/docs/running/holding_pen">about the holding pen</a>, including why messages end up there, and instructions on what to do with them. </li> @@ -521,12 +520,12 @@ Definitions <p> Often you don't need to worry about the details of how this is done because once you've configured your site's - <code><a href="{{ site.baseurl }}docs/customising/config/#default_locale">DEFAULT_LOCALE</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#default_locale">DEFAULT_LOCALE</a></code> Alaveteli takes care of it for you. But when you do need to work on i18n (for example, if you're customising your site by - <a href="{{ site.baseurl }}docs/customising/translation/">translating</a> it, or - <a href="{{ site.baseurl }}docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">uploading names</a> + <a href="{{ page.baseurl }}/docs/customising/translation/">translating</a> it, or + <a href="{{ page.baseurl }}/docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">uploading names</a> of the public bodies in more than one language) at the very least you may need to know the language codes you're site is using. </p> @@ -534,7 +533,7 @@ Definitions <p>More information:</p> <ul> <li> - More about <a href="{{ site.baseurl }}docs/developers/i18n/">internationalising Alaveteli</a> + More about <a href="{{ page.baseurl }}/docs/developers/i18n/">internationalising Alaveteli</a> </li> <li> See mySociety's @@ -563,7 +562,7 @@ Definitions <p>More information:</p> <ul> <li> - see these instructions for <a href="{{ site.baseurl }}docs/installing/email/">configuring your MTA</a> + see these instructions for <a href="{{ page.baseurl }}/docs/installing/email/">configuring your MTA</a> (examples are for exim4 and postfix, two of the most common) </li> </ul> @@ -584,7 +583,7 @@ Definitions <li> use the <code>agent_enabled:</code> setting in the the <code>newrelic.yml</code> config file to enable the New Relic analytics. - See the <a href="{{ site.baseurl }}docs/installing/manual_install/">manual installation</a> instructions. + See the <a href="{{ page.baseurl }}/docs/installing/manual_install/">manual installation</a> instructions. </li> <li> see also the New Relic Ruby Agent <a href="https://github.com/newrelic/rpm">github repo</a> and @@ -613,11 +612,11 @@ Definitions <p>More information:</p> <ul> <li> - See <a href="{{ site.baseurl }}docs/customising/translation/">translating + See <a href="{{ page.baseurl }}/docs/customising/translation/">translating Alaveteli</a> for an overview from a translator's point of view. </li> <li> - See <a href="{{ site.baseurl }}docs/developers/i18n/">Internationalising + See <a href="{{ page.baseurl }}/docs/developers/i18n/">Internationalising Alaveteli</a> for more technical details. </li> <li> @@ -649,7 +648,7 @@ Definitions example, caching is enabled, and debugging switched off. <a href="#rails" class="glossary__link">Rails</a> has a "production mode" which does this for you: set - <code><a href="{{site.baseurl}}docs/customising/config/#staging_site">STAGING_SITE</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> to <code>0</code>. Note that if you <em>change</em> this setting after you've deployed, the <code>rails_env.rb</code> file that enables Rails's production mode won't be created until you run <code>rails-post-deploy</code>. @@ -660,7 +659,7 @@ Definitions <p> You should never need to edit code directly on your production server. We strongly recommend you use Alaveteli's - <a href="{{ site.baseurl }}docs/installing/deploy/">deployment mechanism</a> + <a href="{{ page.baseurl }}/docs/installing/deploy/">deployment mechanism</a> (using Capistrano) to make changes to your production site. </p> </dd> @@ -695,7 +694,7 @@ Definitions <ul> <li> You can add a publication scheme URL by - <a href="{{ site.baseurl }}docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">updating authority data</a> in the admin. + <a href="{{ page.baseurl }}/docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">updating authority data</a> in the admin. </li> </ul> </div> @@ -716,9 +715,9 @@ Definitions <ul> <li> use the config settings - <code><a href="{{site.baseurl}}docs/customising/config/#recaptcha_public_key">RECAPTCHA_PUBLIC_KEY</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#recaptcha_public_key">RECAPTCHA_PUBLIC_KEY</a></code> and - <code><a href="{{site.baseurl}}docs/customising/config/#recaptcha_private_key">RECAPTCHA_PRIVATE_KEY</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#recaptcha_private_key">RECAPTCHA_PRIVATE_KEY</a></code> to set this up. </li> <li> @@ -747,7 +746,7 @@ Definitions <ul> <li> see the - <a href="{{ site.baseurl }}docs/running/admin_manual/">admin manual</a> + <a href="{{ page.baseurl }}/docs/running/admin_manual/">admin manual</a> for more about how and when you may need to redact information </li> <li> @@ -822,11 +821,11 @@ Definitions </li> <li> We try to coordinate releases with any active translation work too. - See <a href="{{ site.baseurl }}docs/customising/translation/">translating + See <a href="{{ page.baseurl }}/docs/customising/translation/">translating Alaveteli</a> for more information. </li> <li> - We encourage you use the <a href="{{site.baseurl}}docs/installing/deploy/">deployment + We encourage you use the <a href="{{ page.baseurl }}/docs/installing/deploy/">deployment mechanism</a>, which makes it easier to keep your production server up-to-date. </li> </ul> @@ -868,7 +867,7 @@ Definitions <a href="http://rubyonrails.org/">Ruby on Rails</a> website </li> <li> - Alavateli's <a href="{{ site.baseurl }}docs/developers/directory_structure/">directory structure</a> + Alavateli's <a href="{{ page.baseurl }}/docs/developers/directory_structure/">directory structure</a> is influenced by its use of Ruby on Rails </li> </ul> @@ -894,7 +893,7 @@ Definitions <a href="http://sass-lang.com">Sass website</a> </li> <li> - more about <a href="{{ site.baseurl }}docs/customising/themes/#changing-the-colour-scheme">changing + more about <a href="{{ page.baseurl }}/docs/customising/themes/#changing-the-colour-scheme">changing your colour scheme</a>, which uses Sass </li> </ul> @@ -918,7 +917,7 @@ Definitions <ul> <li> To add addresses to the spam address list , see - <a href="{{ site.baseurl }}docs/running/admin_manual/#rejecting-spam-that-arrives-in-the-holding-pen">Rejecting + <a href="{{ page.baseurl }}/docs/running/admin_manual/#rejecting-spam-that-arrives-in-the-holding-pen">Rejecting spam that arrives in the holding pen</a>. </li> <li> @@ -940,7 +939,7 @@ Definitions site your users visit running with live data. <p> On your staging server, you should set - <code><a href="{{site.baseurl}}docs/customising/config/#staging_site">STAGING_SITE</a></code> + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> to <code>1</code>. </p> <p> @@ -950,7 +949,7 @@ Definitions <p> You should never need to edit code directly on your production or staging servers. We strongly recommend you use Alaveteli's - <a href="{{ site.baseurl }}docs/installing/deploy/">deployment mechanism</a> + <a href="{{ page.baseurl }}/docs/installing/deploy/">deployment mechanism</a> (using Capistrano) to make changes to these sites. </p> </dd> @@ -972,15 +971,15 @@ Definitions <p>More information:</p> <ul> <li> - <a href="{{ site.baseurl }}docs/customising/states/">example states for WhatDoTheyKnow</a> + <a href="{{ page.baseurl }}/docs/customising/states/">example states for WhatDoTheyKnow</a> (Alaveteli site running in the UK) </li> <li> - for comparison, <a href="{{ site.baseurl }}docs/customising/states_informatazyrtare/">example states for InformataZyrtare</a> + for comparison, <a href="{{ page.baseurl }}/docs/customising/states_informatazyrtare/">example states for InformataZyrtare</a> (Alaveteli site running in Kosovo) </li> <li> - to customise or add your own states, see <a href="{{ site.baseurl }}docs/customising/themes/#customising-the-request-states">Customising the request states</a> + to customise or add your own states, see <a href="{{ page.baseurl }}/docs/customising/themes/#customising-the-request-states">Customising the request states</a> </li> </ul> </div> @@ -992,11 +991,11 @@ Definitions <dd> A <strong>superuser</strong>, or <strong>administrator</strong>, is an Alaveteli user who has been granted the privilege to use all features of the - <a href="{{ site.baseurl }}docs/glossary/#admin" + <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>. <p> The only way to access the admin without being an Alaveteli superuser - is as the <a href="{{ site.baseurl }}docs/glossary/#emergency" + is as the <a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">emergency user</a>, which should be disabled in normal operation. </p> @@ -1011,7 +1010,7 @@ Definitions <li> On a newly-installed Alaveteli system, you can grant yourself admin privilege by using the - <a href="{{ site.baseurl }}docs/glossary/#emergency" class="glossary__link">emergency + <a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">emergency user</a>. </li> </ul> @@ -1035,7 +1034,7 @@ Definitions <ul> <li> More about - <a href="{{ site.baseurl }}docs/running/categories_and_tags/">categories and tags</a> + <a href="{{ page.baseurl }}/docs/running/categories_and_tags/">categories and tags</a> </li> </ul> </div> @@ -1054,7 +1053,7 @@ Definitions <p>More information:</p> <ul> <li> - <a href="{{ site.baseurl }}docs/customising/themes/">about themes</a> + <a href="{{ page.baseurl }}/docs/customising/themes/">about themes</a> </li> </ul> </div> diff --git a/docs/index.md b/docs/index.md index b8cc66b48..e3c9fe918 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,16 +19,15 @@ You've found the documentation for Alaveteli. * Read [Turbo Transparency](/assets/files/Turbo-Transparency-v1.0.pdf), a paper about how and why to use Alaveteli for Freedom of Information systems -* Read the [Getting Started guide]({{ site.baseurl }}docs/getting_started/) +* Read the [Getting Started guide]({{ page.baseurl }}/docs/getting_started/) **The documentation covers -[installing]({{ site.baseurl }}docs/installing/), -[customising]({{ site.baseurl }}docs/customising/), and -[running]({{ site.baseurl }}docs/running/) your own Alaveteli site.** +[installing]({{ page.baseurl }}/docs/installing/), +[customising]({{ page.baseurl }}/docs/customising/), and +[running]({{ page.baseurl }}/docs/running/) your own Alaveteli site.** If you're making changes to the source code, we have -[documentation for developers]({{ site.baseurl }}docs/developers/) too. +[documentation for developers]({{ page.baseurl }}/docs/developers/) too. If you are an organisation who wants to use Alaveteli in your jurisdiction, or a developer who is interested in collaborating on the software, please -[get in touch]({{ site.baseurl }}community/). - +[get in touch]({{ page.baseurl }}/community/). diff --git a/docs/installing/ami.md b/docs/installing/ami.md index 974c55d0c..44e10d87c 100644 --- a/docs/installing/ami.md +++ b/docs/installing/ami.md @@ -10,28 +10,28 @@ title: Installation from AMI EC2. This is handy if you just want to evaluate Alaveteli, for example. </p> -Note that there are [other ways to install Alaveteli]({{ site.baseurl }}docs/installing/). +Note that there are [other ways to install Alaveteli]({{ page.baseurl }}/docs/installing/). ## Installing from our AMI To help you try out Alaveteli, we have created an AMI with a basic installation of Alaveteli, which you can use to create a running server on an Amazon EC2 instance. This creates an instance that runs as a -<a href="{{ site.baseurl }}docs/glossary/#development" class="glossary__link">development site</a>. +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development site</a>. If you want to use this for a -<a href="{{ site.baseurl }}docs/glossary/#production" class="glossary__link">production site</a>, +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production site</a>, you must -[change the configuration]({{ site.baseurl }}docs/customising/config/#staging_site). +[change the configuration]({{ page.baseurl }}/docs/customising/config/#staging_site). <div class="attention-box"> <p> <strong>What's in the AMI?</strong> The AMI gives you exactly the same thing as the - <a href="{{ site.baseurl}}docs/installing/script/">installation script</a> + <a href="{{ page.baseurl }}/docs/installing/script/">installation script</a> does. You get an Alaveteli website powered by Rails running the Thin application server under nginx, using a postgreSQL database. All this running on Amazon's EC2 servers, ready to be - <a href="{{ site.baseurl }}docs/customising/">configured and customised</a>. + <a href="{{ page.baseurl }}/docs/customising/">configured and customised</a>. </p> </div> @@ -132,7 +132,7 @@ When you log into your instance's command line shell, you must do so as the the code is actually owned by (and runs as) the `alaveteli` user. You will need to -[customise the site's configuration]({{ site.baseurl }}docs/customising/config/). +[customise the site's configuration]({{ page.baseurl }}/docs/customising/config/). Do this by logging into your EC2 server and editing the `general.yml` configuration file. @@ -158,4 +158,4 @@ If you have any problems or questions, please ask on the [Alaveteli developer ma ##What next? -Check out the [next steps]({{ site.baseurl }}docs/installing/next_steps/). +Check out the [next steps]({{ page.baseurl }}/docs/installing/next_steps/). diff --git a/docs/installing/deploy.md b/docs/installing/deploy.md index 74c7a8560..858ef2727 100644 --- a/docs/installing/deploy.md +++ b/docs/installing/deploy.md @@ -9,13 +9,13 @@ title: Deploying Although you can install Alaveteli and just change it when you need it, we recommend you adopt a way of <strong>deploying</strong> it automatically, especially on your - <a href="{{ site.baseurl }}docs/glossary/#production" class="glossary__link">production server</a>. + <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production server</a>. Alaveteli provides a deployment mechanism using Capistrano. </p> ## Why deploy? -Although you can [install Alaveteli]({{ site.baseurl }}docs/installing/) in a number +Although you can [install Alaveteli]({{ page.baseurl }}/docs/installing/) in a number of ways, once you're running, sooner or later you'll need to make changes to the site. A common example is updating your site when we issue a new release. @@ -28,13 +28,13 @@ changes or copying files by hand, so your site will be down for the shortest possible time. We **strongly recommend** you use the deployment mechanism for your -<a href="{{ site.baseurl }}docs/glossary/#production" class="glossary__link">production server</a> +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production server</a> and, if you're running one, your -<a href="{{ site.baseurl }}docs/glossary/#staging" class="glossary__link">staging server</a> too. +<a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">staging server</a> too. ## Capistrano -<a href="{{site.baseurl}}docs/glossary/#capistrano" class="glossary__link">Capistrano</a> +<a href="{{ page.baseurl }}/docs/glossary/#capistrano" class="glossary__link">Capistrano</a> is included as part of Alaveteli as a standard deployment system. The basic principle of Capistrano is that you execute `cap [do-something]` @@ -68,7 +68,7 @@ and thereafter you'll be able to deploy very easily (see [usage, below](#usage)) First, on the server: -* [install Alaveteli]({{ site.baseurl }}docs/installing/) +* [install Alaveteli]({{ page.baseurl }}/docs/installing/) * give the Unix user that runs Alaveteli the ability to ssh to your server. Either give them a password or, preferably, set up ssh keys for them so they can ssh from your local machine to the server: * to give them a password (if they don't already have one) - `sudo passwd [UNIX-USER]`. Store this password securely on your local machine e.g in a password manager * to set up ssh keys for them, follow the instructions in the [capistrano documentation](http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/). There's no need to set up ssh keys to the git repository as it is public. @@ -131,8 +131,8 @@ Now, back on your local machine: * make sure you're still in the Alaveteli repo (if not, `cd` back into it) * run `cap -S stage=staging deploy:update_code` to get a code checkout on the server. * create a deployment directory on the server by running *one* of these commands: - * `cap deploy` if you're deploying a <a href="{{site.baseurl}}docs/glossary/#staging" class="glossary__link">staging site</a>, or... - * `cap -S stage=production deploy` for <a href="{{site.baseurl}}docs/glossary/#production" class="glossary__link">production</a> + * `cap deploy` if you're deploying a <a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">staging site</a>, or... + * `cap -S stage=production deploy` for <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production</a> Back on the server: @@ -151,7 +151,7 @@ Back on the server: If you're using Exim as your MTA, edit `etc/exim4/conf.d/04_alaveteli_options` to update the `ALAVETELI_HOME` variable to the new Alaveteli path. Restart the MTA after you've made these changes. -* You will also need to update the path to Alaveteli in your [init scripts]({{site.baseurl}}docs/installing/manual_install/#cron-jobs-and-init-scripts). +* You will also need to update the path to Alaveteli in your [init scripts]({{ page.baseurl }}/docs/installing/manual_install/#cron-jobs-and-init-scripts). You should have a script for running the alert tracks (`/etc/init.d/foi-alert-tracks`), and possibly scripts for purging the varnish cache (`/etc/init.d/foi-purge-varnish`), and restarting the diff --git a/docs/installing/email.md b/docs/installing/email.md index 44476cefa..6bc3e8351 100644 --- a/docs/installing/email.md +++ b/docs/installing/email.md @@ -36,17 +36,17 @@ Parts of this address are controlled with options in If there is some error inside Rails while processing an email, an exit code `75` is returned to the MTA by the `script/mailin` script. Postfix and Exim (and maybe others) take this as a signal for the MTA to try again later. Additionally, a stacktrace is emailed to `CONTACT_EMAIL`. -[Production]({{ site.baseurl }}/docs/glossary/#production) installs of Alaveteli should make a backup copy of emails sent to the special addresses. You can configure your chosen MTA to backup these in a separate mailbox. +[Production]({{ page.baseurl }}//docs/glossary/#production) installs of Alaveteli should make a backup copy of emails sent to the special addresses. You can configure your chosen MTA to backup these in a separate mailbox. ### Transactional mail Alaveteli also sends emails to users about their requests – letting them know when someone has replied to them, or prompting them to take further action. -Configure the address that these messages are sent from in the [`CONTACT_EMAIL`]({{site.baseurl}}docs/customising/config/#contact_email) option in `config/general.yml`: +Configure the address that these messages are sent from in the [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) option in `config/general.yml`: CONTACT_EMAIL = 'team@example.com' -The address in [`CONTACT_EMAIL`]({{ site.baseurl }}docs/customising/config/#contact_email) is also visible in various places on the site so that users can get in touch with the team that runs the site. +The address in [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) is also visible in various places on the site so that users can get in touch with the team that runs the site. You must configure your MTA to deliver mail sent to these addresses to the administrators of your site so that they can respond to it. @@ -54,23 +54,23 @@ You must configure your MTA to deliver mail sent to these addresses to the admin Users subscribed to updates from the site – known as `tracks` – receive emails when there is something new of interest to them on the site. -Configure the address that these messages are sent from in the [`TRACK_SENDER_EMAIL`]({{site.baseurl}}docs/customising/config/#track_sender_email) option in `config/general.yml`: +Configure the address that these messages are sent from in the [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) option in `config/general.yml`: TRACK_SENDER_EMAIL = 'track@example.com' ### Automatic bounce handling (optional) -As [`CONTACT_EMAIL`]({{ site.baseurl }}docs/customising/config/#contact_email) and [`TRACK_SENDER_EMAIL`]({{site.baseurl}}docs/customising/config/#track_sender_email) appear in the `From:` header of emails sent from Alaveteli, they sometimes receive reply emails, including <a href="{{ site.baseurl }}docs/glossary/#bounce-message">bounce messages</a> and ‘out of office’ notifications. +As [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) and [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) appear in the `From:` header of emails sent from Alaveteli, they sometimes receive reply emails, including <a href="{{ page.baseurl }}/docs/glossary/#bounce-message">bounce messages</a> and ‘out of office’ notifications. Alaveteli provides a script (`script/handle-mail-replies`) that handles bounce messages and ‘out of office’ notifications and forwards genuine mails to your administrators. It also prevents further track emails being sent to a user email address that appears to have a permanent delivery problem. -To make use of automatic bounce-message handling, set [`TRACK_SENDER_EMAIL`]({{ site.baseurl }}docs/customising/config/#track_sender_email) and [`CONTACT_EMAIL`]({{ site.baseurl }}docs/customising/config/#contact_email) to an address that you will filter through `script/handle-mail-replies`. Messages that are not bounces or out-of-office autoreplies will be forwarded to [`FORWARD_NONBOUNCE_RESPONSES_TO`]({{ site.baseurl }}docs/customising/config/#forward_nonbounce_responses_to), which you should set to a mail alias that points at your list of site administrators. +To make use of automatic bounce-message handling, set [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) and [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) to an address that you will filter through `script/handle-mail-replies`. Messages that are not bounces or out-of-office autoreplies will be forwarded to [`FORWARD_NONBOUNCE_RESPONSES_TO`]({{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to), which you should set to a mail alias that points at your list of site administrators. -See the MTA-specific instructions for how to do this for [exim]({{ site.baseurl }}docs/installing/email#filter-incoming-messages-to-admin-addresses) and [postfix]({{ site.baseurl }}docs/installing/email#filter-incoming-messages-to-site-admin-addresses). +See the MTA-specific instructions for how to do this for [exim]({{ page.baseurl }}/docs/installing/email#filter-incoming-messages-to-admin-addresses) and [postfix]({{ page.baseurl }}/docs/installing/email#filter-incoming-messages-to-site-admin-addresses). -_Note:_ Bounce handling is not applied to [request emails]({{ site.baseurl }}docs/installing/email#request-mail). Bounce messages from authorities get added to the request page so that the user can see what has happened. Users can ask site admins for help redelivering the request if necessary. +_Note:_ Bounce handling is not applied to [request emails]({{ page.baseurl }}/docs/installing/email#request-mail). Bounce messages from authorities get added to the request page so that the user can see what has happened. Users can ask site admins for help redelivering the request if necessary. --- @@ -142,7 +142,7 @@ In `/etc/postfix/main.cf` update the `mydestination` line (which determines what mydestination = example.com, localhost.localdomain, localhost <div class="attention-box"> -This guide assumes you have set <a href="{{ site.baseurl }}docs/customising/config/#incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> to <code>foi+</code> in <code>config/general.yml</code> +This guide assumes you have set <a href="{{ page.baseurl }}/docs/customising/config/#incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> to <code>foi+</code> in <code>config/general.yml</code> </div> Pipe all incoming mail where the `To:` address starts with `foi+` to the `alaveteli` pipe (`/var/www/alaveteli/script/mailin`, as specified in `/etc/postfix/master.cf` at the start of this section): @@ -201,7 +201,7 @@ To set up recipient groups for the `postmaster@`, `team@` and `user-support@` em #### Discard unwanted incoming email -Configure postfix to discard any messages sent to the [`BLACKHOLE_PREFIX`]({{ site.baseurl }}docs/customising/config/#blackhole_prefix) address, whose default value is `do-not-reply-to-this-address`: +Configure postfix to discard any messages sent to the [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix) address, whose default value is `do-not-reply-to-this-address`: cat >> /etc/aliases <<EOF # We use this for envelope from for some messages where @@ -209,21 +209,21 @@ Configure postfix to discard any messages sent to the [`BLACKHOLE_PREFIX`]({{ si do-not-reply-to-this-address: /dev/null EOF -If you have set [`BLACKHOLE_PREFIX`]({{ site.baseurl }}docs/customising/config/#blackhole_prefix) address, replace `do-not-reply-to-this-address` with the address you have configured. +If you have set [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix) address, replace `do-not-reply-to-this-address` with the address you have configured. #### Filter incoming messages to site admin addresses -You can make use of Alaveteli's [automatic bounce handling]({{site.baseurl}}docs/installing/email/#automatic-bounce-handling-optional) to filter bounces sent to [`TRACK_SENDER_EMAIL`]({{site.baseurl}}docs/customising/config/#track_sender_email) -and [`CONTACT_EMAIL`]({{site.baseurl}}docs/customising/config/#contact_email). +You can make use of Alaveteli's [automatic bounce handling]({{ page.baseurl }}/docs/installing/email/#automatic-bounce-handling-optional) to filter bounces sent to [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) +and [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email). <div class="attention-box"> This guide assumes you have set the following in <code>config/general.yml</code>: <ul> - <li><a href="{{site.baseurl}}docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> - <li><a href="{{site.baseurl}}docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> - <li><a href="{{site.baseurl}}docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> </ul> Change the examples below to the addresses you have configured. @@ -257,8 +257,8 @@ each day), it's good to have them in their own directory. You'll also need to tell Alaveteli where the log files are stored and that they're in postfix format. Update -[`MTA_LOG_PATH`]({{ site.baseurl }}docs/customising/config/#mta_log_path) and -[`MTA_LOG_TYPE`]({{ site.baseurl }}docs/customising/config/#mta_log_type) in `config/general.yml`: +[`MTA_LOG_PATH`]({{ page.baseurl }}/docs/customising/config/#mta_log_path) and +[`MTA_LOG_TYPE`]({{ page.baseurl }}/docs/customising/config/#mta_log_type) in `config/general.yml`: MTA_LOG_PATH: '/var/log/mail/mail.log-*' MTA_LOG_TYPE: "postfix" @@ -340,7 +340,7 @@ delivery report email using the `mail` command on a new server: apt-get install mailutils If emails are not being received by your Alaveteli install, we have some -more troubleshooting tips for incoming mail in [general email troubleshooting]({{ site.baseurl }}docs/installing/email#general-email-troubleshooting). +more troubleshooting tips for incoming mail in [general email troubleshooting]({{ page.baseurl }}/docs/installing/email#general-email-troubleshooting). @@ -460,7 +460,7 @@ To set up recipient groups for the `team@` and `user-support@` email addresses a #### Discard unwanted incoming email -Configure exim to discard any messages sent to the [`BLACKHOLE_PREFIX`]({{ site.baseurl }}docs/customising/config/#blackhole_prefix) address, whose default value is `do-not-reply-to-this-address` +Configure exim to discard any messages sent to the [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix) address, whose default value is `do-not-reply-to-this-address` cat >> /var/www/alaveteli/config/aliases <<EOF # We use this for envelope from for some messages where @@ -472,16 +472,16 @@ _Note:_ Replace `/var/www/alaveteli` with the correct path to alaveteli if requi #### Filter incoming messages to admin addresses -You can make use of Alaveteli's [automatic bounce handling]({{site.baseurl}}docs/installing/email/#automatic-bounce-handling-optional) to filter bounces sent to [`TRACK_SENDER_EMAIL`]({{site.baseurl}}docs/customising/config/#track_sender_email) -and [`CONTACT_EMAIL`]({{site.baseurl}}docs/customising/config/#contact_email). +You can make use of Alaveteli's [automatic bounce handling]({{ page.baseurl }}/docs/installing/email/#automatic-bounce-handling-optional) to filter bounces sent to [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) +and [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email). <div class="attention-box"> This guide assumes you have set the following in <code>config/general.yml</code>: <ul> - <li><a href="{{site.baseurl}}docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> - <li><a href="{{site.baseurl}}docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> - <li><a href="{{site.baseurl}}docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> </ul> Change the examples below to the addresses you have configured. @@ -493,7 +493,7 @@ Change the `user-support` line in `/var/www/alaveteli/config/aliases`: #### Logging -You’ll need to tell Alaveteli where the log files are stored and that they’re in exim format. Update [`MTA_LOG_PATH`]({{ site.baseurl }}docs/customising/config/#mta_log_path) and [`MTA_LOG_TYPE`]({{ site.baseurl }}docs/customising/config/#mta_log_type) in `config/general.yml`: +You’ll need to tell Alaveteli where the log files are stored and that they’re in exim format. Update [`MTA_LOG_PATH`]({{ page.baseurl }}/docs/customising/config/#mta_log_path) and [`MTA_LOG_TYPE`]({{ page.baseurl }}/docs/customising/config/#mta_log_type) in `config/general.yml`: MTA_LOG_PATH: '/var/log/exim4/exim-mainlog-*' MTA_LOG_TYPE: 'exim' @@ -557,8 +557,8 @@ First, you need to check that your MTA is delivering relevant incoming emails to the `script/mailin` command. There are various ways of setting your MTA up to do this; we have documented one way of doing it -[in Exim]({{ site.baseurl }}docs/installing/email/#example-setup-on-exim4), including [a command you can use]({{ site.baseurl }}docs/installing/email/#troubleshooting-exim) to check that the email -routing is set up correctly. We've also documented one way of setting up [Postfix]({{ site.baseurl }}docs/installing/email/#example-setup-on-postfix), with a similar [debugging command]({{ site.baseurl }}docs/installing/email/#troubleshooting-postfix). +[in Exim]({{ page.baseurl }}/docs/installing/email/#example-setup-on-exim4), including [a command you can use]({{ page.baseurl }}/docs/installing/email/#troubleshooting-exim) to check that the email +routing is set up correctly. We've also documented one way of setting up [Postfix]({{ page.baseurl }}/docs/installing/email/#example-setup-on-postfix), with a similar [debugging command]({{ page.baseurl }}/docs/installing/email/#troubleshooting-postfix). Second, you need to test that the mailin script itself is working correctly, by running it from the command line, First, find a diff --git a/docs/installing/index.md b/docs/installing/index.md index c04aaa3ca..269407506 100644 --- a/docs/installing/index.md +++ b/docs/installing/index.md @@ -17,8 +17,8 @@ title: Installing ## Before you start This is important: you need to decide if you are installing Alaveteli for -<a href="{{ site.baseurl }}docs/glossary/#development" class="glossary__link">development</a> or -<a href="{{ site.baseurl }}docs/glossary/#production" class="glossary__link">production</a>. +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development</a> or +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production</a>. A **development** site is one where you're going to change, customise, and perhaps experiment while you get it up and running. You should always do this @@ -30,10 +30,10 @@ A **production** site is different: you want your production site to run as efficiently as possible, so things like caching are swiched on, and debug messages switched off. It's important to be able to deploy changes to a production site quickly and efficiently, so we recommend you consider using a -[deployment mechanism]({{ site.baseurl }}docs/installing/deploy/) too. +[deployment mechanism]({{ page.baseurl }}/docs/installing/deploy/) too. Ideally, you should also have a -<a href="{{ site.baseurl }}docs/glossary/#staging" class="glossary__link">staging site</a>, +<a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">staging site</a>, which is used solely to test new code in an identical environment to your production site before it goes live. @@ -44,23 +44,23 @@ production server. ## Deployment If you're running a production server, we **strongly recommend** you -use the Capistrano [deployment mechanism]({{ site.baseurl }}docs/installing/deploy/) +use the Capistrano [deployment mechanism]({{ page.baseurl }}/docs/installing/deploy/) that's included with Alaveteli. Set this up and you never have to edit files on those servers, because Capistrano takes care of that for you. ## Installing the core code -* [Install into a Vagrant virtual development environment]({{ site.baseurl }}docs/installing/vagrant/) -- a good choice for development, and playing around with the site. -* [Install on Amazon EC2]({{ site.baseurl }}docs/installing/ami/) using our AMI -* [Use the installation script]({{ site.baseurl }}docs/installing/script/) which does the full installation on your own server -* [Manual installation]({{ site.baseurl }}docs/installing/manual_install/) -- step-by-step instructions +* [Install into a Vagrant virtual development environment]({{ page.baseurl }}/docs/installing/vagrant/) -- a good choice for development, and playing around with the site. +* [Install on Amazon EC2]({{ page.baseurl }}/docs/installing/ami/) using our AMI +* [Use the installation script]({{ page.baseurl }}/docs/installing/script/) which does the full installation on your own server +* [Manual installation]({{ page.baseurl }}/docs/installing/manual_install/) -- step-by-step instructions If you're setting up a development server on MacOS X, we've also got -[MacOS installation instructions]({{ site.baseurl }}docs/installing/macos/). +[MacOS installation instructions]({{ page.baseurl }}/docs/installing/macos/). ## Other installation information Alaveteli needs to be able to send and receive email. If you're installing manually, you need to [setup your -MTA (Mail Transfer Agent) appropriately]({{ site.baseurl }}docs/installing/email/). The other install methods will do this for you. +MTA (Mail Transfer Agent) appropriately]({{ page.baseurl }}/docs/installing/email/). The other install methods will do this for you. -* [Installing the MTA]({{ site.baseurl }}docs/installing/email/) +* [Installing the MTA]({{ page.baseurl }}/docs/installing/email/) diff --git a/docs/installing/macos.md b/docs/installing/macos.md index 2c08be0e5..f6acfcc06 100644 --- a/docs/installing/macos.md +++ b/docs/installing/macos.md @@ -11,7 +11,7 @@ title: Installing on MacOS X help. </p> -Note that there are [other ways to install Alaveteli]({{ site.baseurl }}docs/installing/). +Note that there are [other ways to install Alaveteli]({{ page.baseurl }}/docs/installing/). ## MacOS X 10.7 @@ -84,7 +84,7 @@ As of August 22, 2012 or earlier, you can install `mahoro` in Ruby 1.9.3 on OS X ## Alaveteli -The following is mostly from [the manual installation process]({{ site.baseurl}}docs/installing/manual_install). +The following is mostly from [the manual installation process]({{ page.baseurl }}/docs/installing/manual_install). ### Configure database diff --git a/docs/installing/manual_install.md b/docs/installing/manual_install.md index 9cad6b5b9..d4e2a6d17 100644 --- a/docs/installing/manual_install.md +++ b/docs/installing/manual_install.md @@ -10,12 +10,12 @@ title: Manual installation The following instructions describe the step-by-step process for installing Alaveteli. <em>You don't necessarily need to do it this way:</em> it's usually easier to use the - <a href="{{ site.baseurl }}docs/installing/script/">installation script</a> + <a href="{{ page.baseurl }}/docs/installing/script/">installation script</a> or the - <a href="{{ site.baseurl }}docs/installing/ami/">Amazon EC2 AMI</a>. + <a href="{{ page.baseurl }}/docs/installing/ami/">Amazon EC2 AMI</a>. </p> -Note that there are [other ways to install Alaveteli]({{ site.baseurl }}docs/installing/). +Note that there are [other ways to install Alaveteli]({{ page.baseurl }}/docs/installing/). <div class="attention-box"> <ul> @@ -30,7 +30,7 @@ Note that there are [other ways to install Alaveteli]({{ site.baseurl }}docs/ins These instructions assume a 64-bit version of Debian 6 (Wheezy), Debian 7 (Squeeze) or Ubuntu 12.04 LTS (Precise). Debian is the best supported deployment platform. We also -have instructions for [installing on MacOS]({{ site.baseurl }}docs/installing/macos/). +have instructions for [installing on MacOS]({{ page.baseurl }}/docs/installing/macos/). ### Set the locale @@ -309,7 +309,7 @@ Then create the databases: You will need to set up an email server – or Mail Transfer Agent (MTA) – to send and receive emails. -Full configuration for an MTA is beyond the scope of this document -- see the guide for [configuring the Exim4 or Postfix MTAs]({{ site.baseurl }}docs/installing/email/). +Full configuration for an MTA is beyond the scope of this document -- see the guide for [configuring the Exim4 or Postfix MTAs]({{ page.baseurl }}/docs/installing/email/). Note that in development mode mail is handled by [`mailcatcher`](http://mailcatcher.me/) by default so that you can see the mails in a browser. Start mailcatcher by running `bundle exec mailcatcher` in the application directory. @@ -354,7 +354,7 @@ permissions on these databases. As the user needs the ability to turn off constraints whilst running the tests they also need to be a superuser (clarification: a <em>Postgres</em> superuser, not an Alaveteli -<a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">superuser</a>). +<a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">superuser</a>). If you don't want your database user to be a superuser, you can add this line to the `test` section in `database.yml` (as seen in `config/database.yml-example`): @@ -362,9 +362,9 @@ to the `test` section in `database.yml` (as seen in `config/database.yml-example ### general.yml -We have a full [guide to Alaveteli configuration]({{ site.baseurl }}docs/customising/config/) which covers all the settings in `config/general.yml`. +We have a full [guide to Alaveteli configuration]({{ page.baseurl }}/docs/customising/config/) which covers all the settings in `config/general.yml`. -_Note:_ If you are setting up Alaveteli to run in production, set the [`STAGING_SITE`]({{ site.baseurl }}docs/customising/config/#staging_site) variable to `0` in `/var/www/alaveteli/config/general.yml` now. +_Note:_ If you are setting up Alaveteli to run in production, set the [`STAGING_SITE`]({{ page.baseurl }}/docs/customising/config/#staging_site) variable to `0` in `/var/www/alaveteli/config/general.yml` now. STAGING_SITE: 0 @@ -558,7 +558,7 @@ Start the application: One of the cron jobs refers to a script at `/etc/init.d/alaveteli-alert-tracks`. This is an init script, which can be generated from the -`config/alert-tracks-debian.ugly` template. This script sends out emails to users subscribed to updates from the site – known as [`tracks`]({{ site.baseurl }}docs/installing/email/#tracks-mail) – when there is something new matching their interests. +`config/alert-tracks-debian.ugly` template. This script sends out emails to users subscribed to updates from the site – known as [`tracks`]({{ page.baseurl }}/docs/installing/email/#tracks-mail) – when there is something new matching their interests. **Template Variables:** @@ -817,11 +817,11 @@ front of Varnish. If you're already using Apache as a web server you could simply use Apache as the SSL terminator. We have some [production server best practice -notes]({{ site.baseurl}}docs/running/server/). +notes]({{ page.baseurl }}/docs/running/server/). ## What next? -Check out the [next steps]({{ site.baseurl }}docs/installing/next_steps/). +Check out the [next steps]({{ page.baseurl }}/docs/installing/next_steps/). ## Troubleshooting @@ -833,7 +833,7 @@ Check out the [next steps]({{ site.baseurl }}docs/installing/next_steps/). If there are failures here, something has gone wrong with the preceding steps (see the next section for a common problem and workaround). You might - be able to move on to the [next steps]({{ site.baseurl }}docs/installing/next_steps/), depending on how serious they are, but + be able to move on to the [next steps]({{ page.baseurl }}/docs/installing/next_steps/), depending on how serious they are, but ideally you should try to find out what's gone wrong. @@ -850,7 +850,7 @@ You should then be able to run the tests. Don't forget to restore <code>config/r * **Incoming emails aren't appearing in my Alaveteli install** - See the [general email troubleshooting guide]({{ site.baseurl }}docs/installing/email#general-email-troubleshooting). + See the [general email troubleshooting guide]({{ page.baseurl }}/docs/installing/email#general-email-troubleshooting). * **Various tests fail with "*Your PostgreSQL connection does not support unescape_bytea. Try upgrading to pg 0.9.0 or later.*"** diff --git a/docs/installing/next_steps.md b/docs/installing/next_steps.md index 2b7acbd45..5ebd395aa 100644 --- a/docs/installing/next_steps.md +++ b/docs/installing/next_steps.md @@ -20,11 +20,11 @@ title: Next Steps ## Create a superuser admin account Alaveteli ships with an -<a href="{{site.baseurl}}docs/glossary/#emergency" class="glossary__link">emergency user</a> +<a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">emergency user</a> that has access to the admin. So when you've just created a new site, you should sign up to create your own account, then log into admin as the emergency user to promote your new account to be an administrator with -<a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">super</a> +<a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">super</a> privilege. As soon as that's done, disable the emergency user, because you don't need to @@ -42,8 +42,8 @@ First, in the browser: * Go to `/profile/sign_in` and create a user by signing up. * Check your email and confirm your account. * Go to `/admin?emergency=1`, log in with the username and password you specified in - [`ADMIN_USERNAME`]({{site.baseurl}}docs/customising/config/#admin_username) - and [`ADMIN_PASSWORD`]({{site.baseurl}}docs/customising/config/#admin_password). + [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) + and [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password). You can find these settings in `config/general.yml`. * You're now on the Alaveteli admin page. * Click on **Users** (in the navigation menu across the top of the page), and @@ -73,13 +73,13 @@ emergency user access to the admin. On the command line shell, edit * It's important that you change the emergency user's password (and, ideally, the username too) from the values Alavateli ships with, because they are public and hence insecure. In `general.yml`, change - [`ADMIN_PASSWORD`]({{site.baseurl}}docs/customising/config/#admin_password) - (and maybe [`ADMIN_USERNAME`]({{site.baseurl}}docs/customising/config/#admin_username) + [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password) + (and maybe [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) too) to new, unique values. * Additionally, you can totally disable the emergency user. Under normal operation you don't need it, because from now on you'll be using the admin user you've just created. - Set [`DISABLE_EMERGENCY_USER`]({{site.baseurl}}docs/customising/config/#disable_emergency_user) + Set [`DISABLE_EMERGENCY_USER`]({{ page.baseurl }}/docs/customising/config/#disable_emergency_user) to `true`. * To apply these changes restart the service as a user with root privileges: `sudo service alaveteli restart` @@ -119,8 +119,8 @@ follow the steps described in the previous section. * You should receive the request email -- try replying to it. Your response email should appear in Alaveteli. Not working? Take a look at our - [troubleshooting tips]({{ site.baseurl}}docs/installing/manual_install/#troubleshooting). - If that doesn't sort it out, [get in touch]({{ site.baseurl}}community/) on + [troubleshooting tips]({{ page.baseurl }}/docs/installing/manual_install/#troubleshooting). + If that doesn't sort it out, [get in touch]({{ page.baseurl }}/community/) on the [developer mailing list](https://groups.google.com/forum/#!forum/alaveteli-dev) or [IRC](http://www.irc.mysociety.org/) for help. ## Import Public Authorities @@ -128,7 +128,7 @@ follow the steps described in the previous section. Alaveteli can import a list of public authorities and their contact email addresses from a CSV file. Follow the instructions for -[uploading public authority data]({{ site.baseurl }}docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data). +[uploading public authority data]({{ page.baseurl }}/docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data). ## Set the amount of time authorities will be given to respond to requests @@ -137,13 +137,13 @@ have a certain number of days in order to respond to requests. Alaveteli helps requesters by reminding them when their request is overdue for a response according to the law. You can set the number of days an authority is given to respond to a request in the -[`REPLY_LATE_AFTER_DAYS`]({{site.baseurl}}docs/customising/config/#reply_late_after_days), -[`REPLY_VERY_LATE_AFTER_DAYS`]({{site.baseurl}}docs/customising/config/#reply_very_late_after_days) +[`REPLY_LATE_AFTER_DAYS`]({{ page.baseurl }}/docs/customising/config/#reply_late_after_days), +[`REPLY_VERY_LATE_AFTER_DAYS`]({{ page.baseurl }}/docs/customising/config/#reply_very_late_after_days) and -[`SPECIAL_REPLY_VERY_LATE_AFTER_DAYS`]({{site.baseurl}}docs/customising/config/#special_reply_very_late_after_days) +[`SPECIAL_REPLY_VERY_LATE_AFTER_DAYS`]({{ page.baseurl }}/docs/customising/config/#special_reply_very_late_after_days) options in `config/general.yml`. Most laws specify that the days are either working days, or calendar days. You can set this using the -[`WORKING_OR_CALENDAR_DAYS`]({{site.baseurl}}docs/customising/config/#working_or_calendar_days) +[`WORKING_OR_CALENDAR_DAYS`]({{ page.baseurl }}/docs/customising/config/#working_or_calendar_days) option in `config/general.yml`. ## Add some public holidays @@ -153,17 +153,17 @@ Interface introduced in Alaveteli version 0.21 </div> Alaveteli calculates the due dates of requests taking account of the -<a href="{{ site.baseurl }}docs/glossary/#holiday" class="glossary__link">public holidays</a> +<a href="{{ page.baseurl }}/docs/glossary/#holiday" class="glossary__link">public holidays</a> you enter into the admin interface. If you have set the -[`WORKING_OR_CALENDAR_DAYS`]({{site.baseurl}}docs/customising/config/#working_or_calendar_days) +[`WORKING_OR_CALENDAR_DAYS`]({{ page.baseurl }}/docs/customising/config/#working_or_calendar_days) setting for Alaveteli to `working`, the date when a response to a request is officially overdue will be calculated in days that are not weekends or public holidays. If you have set -[`WORKING_OR_CALENDAR_DAYS`]({{site.baseurl}}docs/customising/config/#working_or_calendar_days) +[`WORKING_OR_CALENDAR_DAYS`]({{ page.baseurl }}/docs/customising/config/#working_or_calendar_days) to `calendar`, the date will be calculated in calendar days, but if the due date falls on a public holiday or weekend day, then the due date is considered to be the next week day that isn't a holiday. @@ -176,6 +176,4 @@ once using the **Create holidays from suggestions or iCalendar feed** button. ## Start thinking about customising Alaveteli -Check out [our guide]({{ site.baseurl}}docs/customising/). - - +Check out [our guide]({{ page.baseurl }}/docs/customising/). diff --git a/docs/installing/script.md b/docs/installing/script.md index 72fbd6438..875cf8734 100644 --- a/docs/installing/script.md +++ b/docs/installing/script.md @@ -9,7 +9,7 @@ title: Installation script If you prefer to use your own server, we've provided an installation script which does most of the work for you. </p> -Note that there are [other ways to install Alaveteli]({{ site.baseurl }}docs/installing/). +Note that there are [other ways to install Alaveteli]({{ page.baseurl }}/docs/installing/). ## Installing with the installation script @@ -69,7 +69,7 @@ The server will also be configured to accept replies to information request emai ##What next? -Check out the [next steps]({{ site.baseurl }}docs/installing/next_steps/). +Check out the [next steps]({{ page.baseurl }}/docs/installing/next_steps/). diff --git a/docs/installing/vagrant.md b/docs/installing/vagrant.md index a0b058da5..0e260e81b 100644 --- a/docs/installing/vagrant.md +++ b/docs/installing/vagrant.md @@ -8,10 +8,10 @@ title: Vagrant <a href="https://www.vagrantup.com">Vagrant</a> provides an easy method to set up virtual development environments We bundle an example Vagrantfile in the repository, which runs the - <a href="{{ site.baseurl}}docs/installing/script/">install script</a> for you. + <a href="{{ page.baseurl}}/docs/installing/script/">install script</a> for you. </p> -Note that this is just one of [several ways to install Alaveteli]({{ site.baseurl }}docs/installing/). +Note that this is just one of [several ways to install Alaveteli]({{ page.baseurl }}/docs/installing/). The included steps will use vagrant to create a development environment where you can run the test suite and the development server, and make @@ -23,7 +23,7 @@ scripts will create you a Vagrant VM based on the server edition of Ubuntu 12.04 LTS that contains everything you need to work on Alaveteli. 1. Get a copy of Alaveteli from - <a href="{{ site.baseurl }}docs/glossary/#git" class="glossary__link">GitHub</a>: + <a href="{{ page.baseurl }}/docs/glossary/#git" class="glossary__link">GitHub</a>: # on your machine $ git clone git@github.com:mysociety/alaveteli.git @@ -75,7 +75,7 @@ for full instructions on using Vagrant. ## What next? -Check out the [next steps]({{ site.baseurl }}docs/installing/next_steps/). +Check out the [next steps]({{ page.baseurl }}/docs/installing/next_steps/). ## Customizing the Vagrant instance diff --git a/docs/running/admin_manual.md b/docs/running/admin_manual.md index 7c112400c..b05ddb5f4 100644 --- a/docs/running/admin_manual.md +++ b/docs/running/admin_manual.md @@ -8,7 +8,8 @@ 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. It includes - examples of how mySociety manages their own <a href="/docs/glossary/#foi" + examples of how mySociety manages their own + <a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">Freedom of Information</a> site, <a href="https://www.whatdotheyknow.com">whatdotheyknow.com</a>. </p> @@ -57,7 +58,7 @@ WhatDoTheyKnow usually has about 3 active volunteers at any one time managing the support, plus a few other less active people who help out at different 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). +Administration tasks can be split into [**maintenance**]({{ page.baseurl }}/docs/running/admin_manual/#maintenance) and [**user support**]({{ page.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 admin interface, whereas the latter are mediated by email directly with end users (but often result in @@ -312,13 +313,13 @@ 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> +The <a href="{{ page.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> +<a href="{{ page.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). +[follow these steps]({{ page.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 @@ -336,20 +337,20 @@ have extra privileges in the main website front end. Administrators can: <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> + <code><a href="{{ page.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" + are working on a <a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">development</a> server. </div> ### Removing a message from the holding pen Alaveteli puts incoming messages (that is, -<a href="{{ site.baseurl }}docs/glossary/#reponse" class="glossary__link">responses</a>) +<a href="{{ page.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> +<a href="{{ page.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>. +<a href="{{ page.baseurl }}/docs/glossary/#reponse" class="glossary__link">request</a>. The two most common reasons for this are: @@ -361,7 +362,7 @@ When this happens, the messages wait in the holding pen until an administrator redelivers them to the correct request, or else deletes them. To do this, log into the -The <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a> +The <a href="{{ page.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*: @@ -417,13 +418,13 @@ 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>. +<a href="{{ page.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>, +<a href="{{ page.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 @@ -434,7 +435,7 @@ 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 — 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> +<a href="{{ page.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 @@ -471,7 +472,7 @@ 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>. +<a href="{{ page.baseurl }}/docs/glossary/#mta" class="glossary__link">MTA</a>. ### Creating, changing and uploading public authority data @@ -554,7 +555,7 @@ unrecognised column name, the import will fail. <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>, + <a href="{{ page.baseurl }}/docs/glossary/#publication-scheme" class="glossary__link">publication scheme</a>, if they have one </td> </tr> @@ -563,7 +564,7 @@ unrecognised column name, the import will fail. <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>, + <a href="{{ page.baseurl }}/docs/glossary/#disclosure-log" class="glossary__link">disclosure log</a>, if they have one </td> </tr> @@ -588,10 +589,10 @@ unrecognised column name, the import will fail. 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> + <a href="{{ page.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). + [`AVAILABLE_LOCALES`]({{ page.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 @@ -689,14 +690,14 @@ Enter some text in the in the ‘Ban text’ box to explain why they have been b ### Allowing a user to make more requests -Alaveteli has a config setting <code><a href="{{ site.baseurl }}docs/customising/config/#max_requests_per_user_per_day">MAX_REQUESTS_PER_USER_PER_DAY</a></code>, +Alaveteli has a config setting <code><a href="{{ page.baseurl }}/docs/customising/config/#max_requests_per_user_per_day">MAX_REQUESTS_PER_USER_PER_DAY</a></code>, which determines the maximum number of requests that a normal user can make in a day. If they try to make more than this number of requests within a 24 hour period, they will see a message telling them that they have hit the limit, and encouraging them to use the contact form if they feel they have a good reason to ask for the request limit to be lifted. -To lift the request limit for a particular user, go to the <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin +To lift the request limit for a particular user, go to the <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Users**, then click on the name of the user you want to lift the request limit for. Click the **Edit** button. Tick the checkbox **No rate limit**, and click the **Save** button. @@ -716,12 +717,12 @@ Users can choose which authorities to include in a batch requests. They can eve </div> To enable batch requests on your site, first you must set -<code><a href="{{ site.baseurl }}docs/customising/config/#allow_batch_requests">ALLOW_BATCH_REQUESTS</a></code> +<code><a href="{{ page.baseurl }}/docs/customising/config/#allow_batch_requests">ALLOW_BATCH_REQUESTS</a></code> to <code>true</code> in <code>general.yml</code>. This does not allow anyone to make batch requests yet. You must still enable this for each user on an individual basis. To do this, go to the -<a href="{{ site.baseurl }}docs/glossary/#admin" +<a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Users**, then click on the name of the user who wants to make batch requests. Click the **Edit** button. Tick the checkbox **Can make batch requests**, and @@ -740,18 +741,18 @@ an existing request to that authority to the new email address. Alternatively, a user may send a request to the wrong authority. In that situation, you can change the authority on the request and then resend it to the correct authority. For instructions, see -[resending a request or sending it to a different authority]({{ site.baseurl }}docs/running/requests/#resending-a-request-or-sending-it-to-a-different-authority). +[resending a request or sending it to a different authority]({{ page.baseurl }}/docs/running/requests/#resending-a-request-or-sending-it-to-a-different-authority). ### Hiding a request If a request contains vexatious or inappropriate content, is libellous, or is not a valid -<a href="{{ site.baseurl }}docs/glossary/#foi" class="glossary__link">Freedom of Information</a> +<a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">Freedom of Information</a> request at all, you may want to hide it. A hidden request is still visible to you and the other administrators, and (optionally) the requester themselves. For instructions, see -[hiding a request]({{ site.baseurl }}docs/running/requests/#hiding-a-request). +[hiding a request]({{ page.baseurl }}/docs/running/requests/#hiding-a-request). Responses to a hidden request will be accepted in the normal way, but because they are added to the request's page, they too will be hidden. @@ -759,7 +760,7 @@ they are added to the request's page, they too will be hidden. ### Deleting a request You can delete a request from the site. For instructions, see -[deleting a request]({{ site.baseurl }}docs/running/requests/#deleting-a-request). +[deleting a request]({{ page.baseurl }}/docs/running/requests/#deleting-a-request). Responses to a deleted request will be sent to the holding pen. diff --git a/docs/running/categories_and_tags.md b/docs/running/categories_and_tags.md index 8f36ae472..e1192f84d 100644 --- a/docs/running/categories_and_tags.md +++ b/docs/running/categories_and_tags.md @@ -8,12 +8,12 @@ title: Categories & tags <p class="lead"> Use tags to arrange - <a href="{{ site.baseurl }}docs/glossary/#authority" + <a href="{{ page.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>) + <a href="{{ page.baseurl }}/docs/glossary/#request" class="glossary__link">request</a> + (or <a href="{{ page.baseurl }}/docs/glossary/#response" class="glossary__link">response</a>) they are interested in. </p> @@ -26,7 +26,7 @@ Admin interface introduced in Alaveteli version 0.20 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="{{ page.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** @@ -57,7 +57,7 @@ users find the specific authorities they are looking for. 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>). + <a href="{{ page.baseurl }}/docs/glossary/#advanced-search" class="glossary__link">advanced search</a>). </div> ### Adding a new category @@ -113,7 +113,7 @@ of these tags. <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>. + <a href="{{ page.baseurl }}/docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">export authorities in CSV format</a>. </td> </tr> <tr> @@ -130,7 +130,7 @@ of these tags. <code>not_apply</code> </td> <td> - <a href="{{ site.baseurl }}docs/glossary/#foi" class="glossary__link">Freedom of Information</a> + <a href="{{ page.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> @@ -142,7 +142,7 @@ of these tags. <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>, + <a href="{{ page.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 @@ -155,7 +155,7 @@ of these tags. </td> <td> <em>Custom example:</em> (see below)<br> - <a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a> + <a href="{{ page.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> @@ -169,10 +169,10 @@ 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>. +<a href="{{ page.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) +[`SPECIAL_REPLY_VERY_LATE_AFTER_DAYS`]({{ page.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) @@ -183,7 +183,7 @@ for the source code. ## Searching with tags Alaveteli's -<a href="{{ site.baseurl }}docs/glossary/#advanced-search" class="glossary__link">advanced search</a> +<a href="{{ page.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 @@ -191,7 +191,7 @@ 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> +<a href="{{ page.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). diff --git a/docs/running/holding_pen.md b/docs/running/holding_pen.md index 5b7f08bec..535c17dd8 100644 --- a/docs/running/holding_pen.md +++ b/docs/running/holding_pen.md @@ -8,15 +8,15 @@ title: The holding pen <p class="lead"> The <em>holding pen</em> is where Alaveteli puts any incoming - <a href="{{ site.baseurl }}docs/glossary/#response" class="glossary__link">responses</a> + <a href="{{ page.baseurl }}/docs/glossary/#response" class="glossary__link">responses</a> that can't be matched to a - <a href="{{ site.baseurl }}docs/glossary/#request" class="glossary__link">request</a> + <a href="{{ page.baseurl }}/docs/glossary/#request" class="glossary__link">request</a> automatically. </p> Alaveteli works by emailing requests to the correct target -<a href="{{ site.baseurl }}docs/glossary/#authority" class="glossary__link">authority</a>. +<a href="{{ page.baseurl }}/docs/glossary/#authority" class="glossary__link">authority</a>. That email message is sent from a unique email address — that is, an email address that is associated with that single request (technically, Alaveteli hashes the request ID to generate a unique address and uses this as @@ -25,7 +25,7 @@ the `Reply-to:` address). So whenever an authority replies (by email) to a request that Alaveteli has sent, that response will be addressed to that request's unique email address. The email is received by your installation's -<a href="{{ site.baseurl}}docs/glossary/#mta" class="glossary__link">MTA</a>, +<a href="{{ page.baseurl }}/docs/glossary/#mta" class="glossary__link">MTA</a>, and is passed on to Alaveteli. In this way, incoming messages are easily matched with the request they are responses to — this is important because your site displays the responses underneath their original request, on @@ -34,11 +34,11 @@ the request's page. Normally, this works fine. But sometimes things go wrong, and a message comes in that can't be matched with a request. When this happens, Alaveteli puts the message in the -<a href="{{ site.baseurl }}docs/glossary/#holding_pen" class="glossary__link">holding +<a href="{{ page.baseurl }}/docs/glossary/#holding_pen" class="glossary__link">holding pen </a>. Messages wait in the holding pen until an -<a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">administrator</a> +<a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">administrator</a> redelivers them to the correct request, or else deletes them. ## Why messages end up in the holding pen @@ -61,7 +61,7 @@ There are several reasons why a message might end up in the holding pen: deliberate attempt to send spam. * **the response is to a request that has been deleted**<br> - If you [delete a request]({{ site.baseurl }}docs/running/requests/#deleting-a-request), + If you [delete a request]({{ page.baseurl }}/docs/running/requests/#deleting-a-request), Alaveteli cannot deliver responses to it. * **the response has been rejected and rejections are set to go to the holding pen**<br> @@ -72,12 +72,12 @@ There are several reasons why a message might end up in the holding pen: reasons — for example, if a response is sent from an unrecognised email address for a request whose *Allow new responses from* setting is `authority_only`. See instructions on - [how to manage requests]({{site.baseurl}}docs/running/requests/) for details. + [how to manage requests]({{ page.baseurl }}/docs/running/requests/) for details. ## What to do: redeliver or delete You need to be an -<a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">administrator</a> +<a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">administrator</a> to modify the holding pen. There are two things you can do to a message in the holding pen: @@ -90,12 +90,12 @@ There are two things you can do to a message in the holding pen: If the message is not a response, you can delete it. For instructions, see -[removing a message from the holding pen]({{ site.baseurl }}docs/running/admin_manual/#removing-a-message-from-the-holding-pen). +[removing a message from the holding pen]({{ page.baseurl }}/docs/running/admin_manual/#removing-a-message-from-the-holding-pen). If the `To:` address does not belong to a valid request and the message is clearly spam you can add that email address to Alaveteli's -<a href="{{site.baseurl}}#spam-address-list" class="glossary__link">spam address list</a>. +<a href="{{ page.baseurl }}/#spam-address-list" class="glossary__link">spam address list</a>. Subsequent messages to that address will be automatically rejected — for instructions see -[rejecting spam that arrives in the holding pen]({{ site.baseurl }}docs/running/admin_manual/#rejecting-spam-that-arrives-in-the-holding-pen). +[rejecting spam that arrives in the holding pen]({{ page.baseurl }}/docs/running/admin_manual/#rejecting-spam-that-arrives-in-the-holding-pen). diff --git a/docs/running/index.md b/docs/running/index.md index bbf30d3b9..c84a74427 100644 --- a/docs/running/index.md +++ b/docs/running/index.md @@ -11,19 +11,19 @@ title: Running </p> Alaveteli is not just software. To run a successful -<a href="{{ site.baseurl }}docs/glossary/#foi" class="glossary__link">Freedom of Information</a> +<a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">Freedom of Information</a> site, you need to make sure day-to-day tasks get done too. Most Alaveteli sites are run by a team who allocate some time every day to user support and generally keeping the project up to date. -* The [administrator's guide]({{ site.baseurl }}docs/running/admin_manual/) describes +* The [administrator's guide]({{ page.baseurl }}/docs/running/admin_manual/) describes what you need to do and know to run your site -* The [redaction guide]({{ site.baseurl }}docs/running/redaction/) includes some +* The [redaction guide]({{ page.baseurl }}/docs/running/redaction/) includes some examples of Alaveteli's ability to redact sensitive information * We've prepared a checklist of - [things to consider]({{ site.baseurl }}docs/running/server/) + [things to consider]({{ page.baseurl }}/docs/running/server/) when setting up your production server diff --git a/docs/running/redaction.md b/docs/running/redaction.md index 6ab8fed86..1e6542873 100644 --- a/docs/running/redaction.md +++ b/docs/running/redaction.md @@ -7,7 +7,7 @@ title: Redacting Sensitive Information In some countries, local requirements mean that requests need to contain personal information such as the address or ID number of the person asking for information. Usually requesters do not want this information to be displayed to the general public. -Alaveteli has some ability to deal with this through the use of <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rules</a>. +Alaveteli has some ability to deal with this through the use of <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rules</a>. The [theme](https://github.com/mysociety/derechoapreguntar-theme) we'll use as an example requires a National Identity Card Number and what's known as General Law in Nicaragua (Date of Birth, Domicile, Occupation and Marital Status). @@ -30,13 +30,13 @@ When a request is made the user's ID Number is now added to the footer of the ou  -At this point we haven't added any <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rules</a>. When the authority replies it is unlikely that the responder will remove the quoted section of the email: +At this point we haven't added any <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rules</a>. When the authority replies it is unlikely that the responder will remove the quoted section of the email:  -We could add a <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> for the individual request, but as every request will contain a user's ID Number its better to add some code to do do it automatically. +We could add a <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> for the individual request, but as every request will contain a user's ID Number its better to add some code to do do it automatically. -To illustrate this we'll patch the `User` model with a callback that creates a <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> when the user is created and updated. +To illustrate this we'll patch the `User` model with a callback that creates a <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> when the user is created and updated. # THEME_ROOT/lib/model_patches.rb User.class_eval do @@ -54,7 +54,7 @@ To illustrate this we'll patch the `User` model with a callback that creates a < end end -You can see the new <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> in the admin interface: +You can see the new <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> in the admin interface:  @@ -66,9 +66,9 @@ It also gets redacted if the public body use the ID Number in the main email bod  -A <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">censor rule</a> added to a user only gets applied to correspondence on requests created by that user. It does not get applied to annotations made by the user. +A <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">censor rule</a> added to a user only gets applied to correspondence on requests created by that user. It does not get applied to annotations made by the user. -**Warning:** Redaction in this way requires the sensitive text to be in exactly the same format as the <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a>. If it differs even slightly, the redaction can fail. If the public body was to remove the hyphens from the number it would not be redacted: +**Warning:** Redaction in this way requires the sensitive text to be in exactly the same format as the <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a>. If it differs even slightly, the redaction can fail. If the public body was to remove the hyphens from the number it would not be redacted:  @@ -102,7 +102,7 @@ Note that the information is now contained in a specially formatted block of tex  -This allows a <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> to match the special formatting and remove anything contained within. This <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> is global, so it will act on matches in all requests. +This allows a <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> to match the special formatting and remove anything contained within. This <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> is global, so it will act on matches in all requests. # THEME_ROOT/lib/censor_rules.rb # If not already created, make a CensorRule that hides personal information @@ -126,7 +126,7 @@ In this case the authority has revealed the user's Date of Birth and Domicile:  -Its really difficult to add a <a href="{{site.baseurl}}docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> to remove this type of information. One suggestion might be to remove all mentions of the user's Date of Birth, but you would have to account for [every type of date format](http://en.wikipedia.org/wiki/Calendar_date#Date_format). Likewise, you could redact all occurrences of the user's Domicile, but if they a question about their local area (very likely) the request would become unintelligible. +Its really difficult to add a <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">Censor Rule</a> to remove this type of information. One suggestion might be to remove all mentions of the user's Date of Birth, but you would have to account for [every type of date format](http://en.wikipedia.org/wiki/Calendar_date#Date_format). Likewise, you could redact all occurrences of the user's Domicile, but if they a question about their local area (very likely) the request would become unintelligible.  diff --git a/docs/running/requests.md b/docs/running/requests.md index e554fe763..3b4c6e44e 100644 --- a/docs/running/requests.md +++ b/docs/running/requests.md @@ -8,17 +8,17 @@ title: Managing requests <p class="lead"> Alaveteli makes it easy for a user to make a - <a href="{{ site.baseurl }}docs/glossary/#request" class="glossary__link">request</a>. + <a href="{{ page.baseurl }}/docs/glossary/#request" class="glossary__link">request</a>. As an - <a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">administrator</a>, + <a href="{{ page.baseurl }}/docs/glossary/#super" class="glossary__link">administrator</a>, there are some things about that request you can change once it’s been created. </p> A request is automatically created when a user submits and (where necessary) confirms it. Alaveteli sends it to the -<a href="{{ site.baseurl }}docs/glossary/#authority" class="glossary__link">authority</a> +<a href="{{ page.baseurl }}/docs/glossary/#authority" class="glossary__link">authority</a> responsible and handles any -<a href="{{ site.baseurl }}docs/glossary/#response" class="glossary__link">responses</a>. +<a href="{{ page.baseurl }}/docs/glossary/#response" class="glossary__link">responses</a>. Usually this process runs without needing any intervention from an administrator. But sometimes you'll want to change some aspect of the request, or the way Alaveteli is handling it. @@ -35,7 +35,7 @@ or the way Alaveteli is handling it. ## What state is the request in? Every request moves through a series of -<a href="{{ site.baseurl }}docs/glossary/#state" class="glossary__link">states</a>, +<a href="{{ page.baseurl }}/docs/glossary/#state" class="glossary__link">states</a>, indicating its progress. Usually a new request will be in the `waiting_response` state until something happens to change that — for example, a response is received. @@ -87,7 +87,7 @@ for how to change these settings. ## Changing things about a request To change any of these settings, go to the -<a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>, +<a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Requests**, then click on the title of the request you want to affect. Click the **Edit metadata** button. @@ -179,12 +179,12 @@ Click the **Edit metadata** button. </li> <li> <code>holding pen</code>: responses are put in the - <a href="{{ site.baseurl }}docs/glossary/#holding_pen" class="glossary__link">holding pen</a> + <a href="{{ page.baseurl }}/docs/glossary/#holding_pen" class="glossary__link">holding pen</a> for an administrator to deal with </li> <li> <code>blackhole</code>: responses are destroyed by being sent to a - <a href="{{ site.baseurl }}docs/glossary/#blackhole" class="glossary__link">black hole</a> + <a href="{{ page.baseurl }}/docs/glossary/#blackhole" class="glossary__link">black hole</a> </li> </ul> </td> @@ -194,7 +194,7 @@ Click the **Edit metadata** button. What state is it in? </td> <td> - See <a href="{{ site.baseurl }}docs/customising/states/">more about + See <a href="{{ page.baseurl }}/docs/customising/states/">more about request states</a>, which can be customised for your installation. <p> You can force the state of the request by choosing it explicitly. @@ -240,10 +240,10 @@ Click the **Edit metadata** button. </p> <p> Although it’s a little more complex than tags on requests, - <a href="{{ site.baseurl }}docs/glossary/#category" class="glossary__link">categories</a> + <a href="{{ page.baseurl }}/docs/glossary/#category" class="glossary__link">categories</a> also use tags: see - <a href="{{ site.baseurl }}docs/running/categories_and_tags/">more about tags</a> + <a href="{{ page.baseurl }}/docs/running/categories_and_tags/">more about tags</a> for a little more information. </p> </td> @@ -258,12 +258,12 @@ a user may send a request to the wrong authority. In that situation, you can change the authority on the request and then resend it to the correct authority. To resend a request, go to -the <a href="{{ site.baseurl }}docs/glossary/#admin" +the <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Requests**, then click on the name of the request you want to change. Go to the **Outgoing messages** heading. Click the chevron next to the first outgoing message, which is the initial request. A panel of information about that message will appear. Click on the **Resend** button. To send a request to a different authority, go to -the <a href="{{ site.baseurl }}docs/glossary/#admin" +the <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Requests**, then click on the name of the request you want to change. In the **Request metadata** section, there is a line which shows the authority. Click the @@ -285,7 +285,7 @@ You can hide an entire request. Typically you do this if it's not a valid Freedom of Information request (for example, a request for personal information), or if it is vexatious. -Go to the <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>, +Go to the <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Requests**, then click on the title of the request you want. You can hide it in one of two ways: @@ -344,12 +344,12 @@ destroyed as well. <a href="#hiding-a-request">hide the request</a> instead. </div> -Go to the <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>, +Go to the <a href="{{ page.baseurl }}/docs/glossary/#admin" class="glossary__link">admin interface</a>, click on **Requests**, then click on the title of the request you want to delete. Click the **Edit metadata** button. Click on the red **Destroy request entirely** button at the bottom of the page. Responses to a deleted request will be sent to the -<a href="{{ site.baseurl }}docs/glossary/#holding_pen" class="glossary__link">holding pen</a>. +<a href="{{ page.baseurl }}/docs/glossary/#holding_pen" class="glossary__link">holding pen</a>. diff --git a/docs/running/server.md b/docs/running/server.md index da1312ac3..4a36aff41 100644 --- a/docs/running/server.md +++ b/docs/running/server.md @@ -25,7 +25,7 @@ ask us about hosting. ## Cron jobs Don't forget to set up the cron jobs as outlined in the -[installation instructions]({{ site.baseurl }}docs/installing/manual_install/). +[installation instructions]({{ page.baseurl }}/docs/installing/manual_install/). ## Webserver configuration @@ -34,7 +34,7 @@ We recommend running your site behind [Passenger](https://www.phusionpassenger.com) or [Nginx](http://wiki.nginx.org/Main) + [Thin](http://code.macournoyer.com/thin/). If you're using Passenger, refer to the -[installation instructions]({{ site.baseurl }}docs/installing/manual_install/) +[installation instructions]({{ page.baseurl }}/docs/installing/manual_install/) regarding `PassengerMaxPoolSize`, which you should experiment with to match your available RAM. It is very unlikely that you'll ever need a pool larger than [Passenger's @@ -47,23 +47,23 @@ Alaveteli ships with a ## Security -You _must_ change all key-related [config settings]({{ site.baseurl }}docs/customising/config/) +You _must_ change all key-related [config settings]({{ page.baseurl }}/docs/customising/config/) in `general.yml` from their default values. This includes (but may not be limited to!) these settings: -* [`INCOMING_EMAIL_SECRET`]({{ site.baseurl }}docs/customising/config/#incoming_email_secret) -* [`ADMIN_USERNAME`]({{ site.baseurl }}docs/customising/config/#admin_username) -* [`ADMIN_PASSWORD`]({{ site.baseurl }}docs/customising/config/#admin_password) -* [`COOKIE_STORE_SESSION_SECRET`]({{ site.baseurl }}docs/customising/config/#cookie_store_session_secret) -* [`RECAPTCHA_PUBLIC_KEY`]({{ site.baseurl }}docs/customising/config/#recaptcha_public_key) -* [`RECAPTCHA_PRIVATE_KEY`]({{ site.baseurl }}docs/customising/config/#recaptcha_private_key) +* [`INCOMING_EMAIL_SECRET`]({{ page.baseurl }}/docs/customising/config/#incoming_email_secret) +* [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) +* [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password) +* [`COOKIE_STORE_SESSION_SECRET`]({{ page.baseurl }}/docs/customising/config/#cookie_store_session_secret) +* [`RECAPTCHA_PUBLIC_KEY`]({{ page.baseurl }}/docs/customising/config/#recaptcha_public_key) +* [`RECAPTCHA_PRIVATE_KEY`]({{ page.baseurl }}/docs/customising/config/#recaptcha_private_key) You should consider running the admin part of the site over HTTPS. This can be achieved with rewrite rules that redirect URLs beginning with `/admin`. ## Email configuration -See the [configuration for exim or postfix]({{ site.baseurl }}docs/installing/email/) for +See the [configuration for exim or postfix]({{ page.baseurl }}/docs/installing/email/) for setting up your Mail Transfer Agent (MTA). It is possible to use other MTAs — if you use a different one, the documentation there should provide you with enough information to get started. If this applies to you, please add to the @@ -77,7 +77,7 @@ deliverability of your email: href="http://wiki.asrg.sp.am/wiki/Feedback_loop_links_for_some_email_providers">feedback loops</a> with the main email providers (Hotmail and Yahoo! are recommended) * Especially if deploying from Amazon EC2, use an external SMTP relay for - sending outgoing mail. See [Alaveteli EC2 AMI]( {{ site.baseurl }}docs/installing/ami/) + sending outgoing mail. See [Alaveteli EC2 AMI]( {{ page.baseurl }}/docs/installing/ami/) for more suggestions. ## Backup @@ -85,7 +85,7 @@ deliverability of your email: Most of the data for the site lives in the production database. The exception is the raw incoming email data, which is stored on the filesystem, as specified in the setting -[`RAW_EMAILS_LOCATION`]({{ site.baseurl }}docs/customising/config/#raw_emails_location) +[`RAW_EMAILS_LOCATION`]({{ page.baseurl }}/docs/customising/config/#raw_emails_location) setting in `config/general.yml`. Refer to the [Postgres diff --git a/docs/running/upgrading.md b/docs/running/upgrading.md index 81af8289f..39c18163c 100644 --- a/docs/running/upgrading.md +++ b/docs/running/upgrading.md @@ -8,14 +8,14 @@ Upgrading Alaveteli <p class="lead"> Alaveteli is under active development — don’t let the version you’re running get too far behind our latest - <a href="{{site.baseurl}}docs/glossary/#release" class="glossary__link">release</a>. + <a href="{{ page.baseurl }}/docs/glossary/#release" class="glossary__link">release</a>. This page describes how to keep your site up to date. </p> ## How to upgrade the code * If you're using Capistrano for deployment, - simply [deploy the code]({{site.baseurl}}docs/installing/deploy/#usage): + simply [deploy the code]({{ page.baseurl }}/docs/installing/deploy/#usage): set the repo and branch in `deploy.yml` to be the version you want. We recommend you set this to the explicit tag name (for example, `0.18`, and not `master`) so there's no risk of you accidentally deploying @@ -24,7 +24,7 @@ Upgrading Alaveteli ## Run the post-deploy script -Unless you're [using Capistrano for deployment]({{site.baseurl}}docs/installing/deploy/), +Unless you're [using Capistrano for deployment]({{ page.baseurl }}/docs/installing/deploy/), you should always run the script `scripts/rails-post-deploy` after each deployment. This runs any database migrations for you, plus various other things that can be automated for deployment. @@ -55,7 +55,7 @@ version numbering when it reaches `1.0.0`. The developer team policy is that the `master` branch in git should always contain the latest stable release -- so you'll be up to date if you pull from the `master` branch. However, on your -<a href="{{site.baseurl}}docs/glossary/#production" class="glossary__link">production +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">production site</a>, you should know precisely what version you're running, and deploy Alaveteli from a [*specific* release tag](https://github.com/mysociety/alaveteli/releases). @@ -76,7 +76,7 @@ Patch version increases (e.g. 0.1.2.3 → 0.1.2.**4**) should not require any Minor version increases (e.g. 0.1.2.4 → 0.1.**3**.0) will usually require further action. You should read the [`CHANGES.md`](https://github.com/mysociety/alaveteli/blob/master/doc/CHANGES.md) document to see what's changed since your last deployment, paying special attention to anything in the "Upgrade notes" sections. Any upgrade may include new translations strings, that is, new or altered messages -to the user that need translating to your locale. You should visit <a href="{{ site.baseurl }}docs/glossary/#transifex" class="glossary__link">Transifex</a> +to the user that need translating to your locale. You should visit <a href="{{ page.baseurl }}/docs/glossary/#transifex" class="glossary__link">Transifex</a> and try to get your translation up to 100% on each new release. Failure to do so means that any new words added to the Alaveteli source code will appear in your website in English by default. If your translations didn't make it to the diff --git a/es/about.md b/es/about.md new file mode 100644 index 000000000..f857334fd --- /dev/null +++ b/es/about.md @@ -0,0 +1,33 @@ +--- +layout: es/landing +title: Información +--- +<meta charset="utf-8"> + +<div class="about__intro"> + <div class="container"> + + <h1>Acerca de Alaveteli</h1> + + <p> Se trata de un concepto sencillo: los ciudadanos utilizan Alaveteli para solicitar información y las respuestas se guardan para que todo el mundo pueda verlas en el sitio web. El historial de solicitudes se archiva en línea de forma pública junto con los resultados correspondientes, aumentando la disponibilidad de la información solicitada y fomentando la transparencia. Por tanto, Alaveteli funciona como una práctica herramienta para los ciudadanos y como un apoyo para los defensores del derecho a saber.</p> + + <p>Este proyecto, fundado por el instituto <a href="http://soros.org/">Open Society</a> y la fundación <a href="http://www.hivos.nl/">Hivos</a>, soporta sitios web de información pública alrededor de todo el mundo.</p> + <img src="{{ site.baseurl }}assets/img/stamp.svg" class="stamp-graphic" /> + </div> +</div> +<div class="container clearfix"> + <h2>Cómo empezar</h2> + <h3>Consulte <a href="{{ page.baseurl }}/docs/">nuestra documentación</a></h3> + <div class="grid-row content-in-columns"> + <div class="about__column"> + <p>Los usuarios sin conocimientos técnicos pueden dirigirse a nuestra <a href="{{ page.baseurl }}/docs/getting_started/">guía de inicio</a>. A los desarrolladores les interesarán <a href="{{ page.baseurl }}/docs/developers/">las especificaciones generales</a>.</p> + <p>Si representa a una organización interesada en utilizar Alaveteli en su jurisdicción, únase a nuestro <a href="http://groups.google.com/group/alaveteli-users">grupo de Google para usuarios de Alaveteli</a> y preséntese. Si es usted un desarrollador interesado en colaborar en la elaboración del software, envíe un mensaje a nuestra <a href="https://groups.google.com/group/alaveteli-dev">lista de correo para desarrolladores</a>.</p> + <p>Actualmente para personalizar un sitio nuevo mediante el uso de Alaveteli se necesitan ciertos conocimientos técnicos. Estamos trabajando para cambiar este requisito en los próximos meses. También contamos con recursos para soportar un número reducido de sitios nuevos como servicios hospedados.</p> + </div> + <div class="about__column"> + <p>Los grupos que deseen crear un sitio web con Alaveteli deben saber que su éxito no solo depende del desarrollo del software, sino que también se necesita un mantenimiento constante para garantizar que las solicitudes se gestionan correctamente, ya sea desde un punto de vista técnico, legal o de la usabilidad. Por tanto, el proyecto desarrollará también un conjunto de buenas prácticas por parte de los usuarios para obtener un sitio web de información pública satisfactorio. Para empezar, disponemos de <a href="https://www.mysociety.org/2011/07/29/you-need-volunteers-to-make-your-website-work/">una publicación donde se describe la importancia de los voluntarios</a>. + </p> + <p>El software cobró vida con <a href="https://www.whatdotheyknow.com">WhatDoTheyKnow</a>, un sitio web producido por <a href="https://mysociety.org/">mySociety</a> para elaborar solicitudes de información pública en el Reino Unido. Su historia y sus antecedentes se describen <a href="https://www.whatdotheyknow.com/help/credits">aquí</a>. El desarrollo de Alaveteli es actualmente gestionado por <a href="https://www.mysociety.org/about/team/louise-crow/">Louise Crow de mySociety</a>.</p> + </div> + </div> +</div> diff --git a/es/community/index.md b/es/community/index.md new file mode 100644 index 000000000..4b7e77db0 --- /dev/null +++ b/es/community/index.md @@ -0,0 +1,67 @@ +--- +layout: es/page +title: Comunidad +--- +<meta charset="utf-8"> + +La comunidad Alaveteli +==================== + +<p class="lead"> + Si está ejecutando una instalación de Alaveteli (o tiene en mente llevar una a cabo), permita que la comunidad le ayude. +</p> + +Ayudamos de forma activa a los usuarios a configurar y ejecutar instancias de Alaveteli alrededor de todo el +mundo. Alaveteli no es tan solo de software, sino que también está formado por una comunidad de personas +a quienes les importa lo suficiente la <a href="{{ page.baseurl }}/docs/glossary/#foi" +class="glossary__link">información pública</a> como para construir y gestionar sitios en beneficio +público. + +Tanto si acaba de empezar como si ya dispone de un sitio en funcionamiento, +esta página indica los lugares donde podrá encontrar más información, realizar consultas +o simplemente saludar. + + +## Lista de correo del proyecto + +Inscríbase en la <a href="https://groups.google.com/group/alaveteli-dev">lista de correo del proyecto Alaveteli</a> y consulte lo que necesite con total libertad. Esta lista cuenta con numerosas personas de gran ayuda, no solamente con el personal de mySociety, sino también con personas (¡como usted!) que gestionan sus propios sitios web. + +Los archivos también constituyen una buena fuente de información. Si tiene algún problema, +siempre vale la pena consultarlos para ver si ya lo ha solucionado alguien anteriormente. + +Si acaba de empezar, saludar en la lista de correo es una buena forma de dar el primer paso +<img src="{{ site.baseurl }}assets/img/icon_smile.gif" alt=":-)"> + +## Equipo internacional de mySociety + +mySociety tiene la capacidad, aunque muy limitada, de gestionar un pequeño conjunto de sitios web basados en Alaveteli para voluntarios. Contacte con nuestro <a href="mailto:international@mysociety.org">equipo internacional</a> para obtener más información. + +## IRC + +### irc.mysociety.org #mschat + +**`#mschat`**: +Puede encontrar a los desarrolladores de mySociety en IRC a través de `#mschat` en +`irc.mysociety.org` (en los puertos `6667` y `9219`) +(también disponible a través de esta [interfaz web](http://www.irc.mysociety.org)). + +### irc.freenode.net #alaveteli + +**`#alaveteli`**: +Existe un canal `#alaveteli` en +[Freenode](http://freenode.net) (`irc.freenode.net`), pero generalmente cuenta con poca participación +<img src="http://www.alaveteli.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley"> + +## Código y publicaciones en github + +El [software de Alaveteli se halla en github](https://github.com/mysociety/alaveteli) y utilizamos de forma activa las +[publicaciones de github](https://github.com/mysociety/alaveteli). A veces también se debaten detalles específicos +que pueden resultar interesantes (especialmente si se trata de un tema que ha comentado usted). + +## Documentación + +Aunque consultar a otras personas es magnífico, a menudo lo que desea saber puede encontrarse en la documentación: + +* [esta documentación]({{ page.baseurl }}/docs/): los documentos a consultar siempre en primer lugar +* [la wiki para desarrolladores](https://github.com/mysociety/alaveteli/wiki): anotaciones informales o específicas +* [documentos del repositorio](https://github.com/mysociety/alaveteli/tree/rails-3-develop/doc) (aunque los estamos eliminando gradualmente para sustituirlos por los documentos que está leyendo actualmente) diff --git a/es/deployments.md b/es/deployments.md new file mode 100644 index 000000000..cc99dce89 --- /dev/null +++ b/es/deployments.md @@ -0,0 +1,213 @@ +--- +layout: es/landing +title: Implementaciones +--- +<meta charset="utf-8"> + +<div class="deployments__intro"> + <div class="container"> + <h1>Más de 20 idiomas, 18 jurisdicciones + <span>200.000 solicitudes de información</span></h1> + <p>Alaveteli puede colaborar en la transparencia del gobierno en cualquier país, +en cualquier idioma y dentro de cualquier marco legal</p> + </div> +</div> + +<div class="deployments__content"> + <div class="container"> + <h2>Implementaciones de Alaveteli</h2> + <div class="deployments__list--featured"> + <div class="grid-row"> + <div class="deployments__unit--major"> + <div class="deployment--major"> + <img src="{{ site.baseurl }}assets/img/what-do-they-know.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">WhatDoTheyKnow</h3> + <p class="deployment__country">Reino Unido</p> + <p class="deployment__link"><a href="https://www.whatdotheyknow.com/">https://www.whatdotheyknow.com/</a></p> + <div class="deployment__description"> + <p>Alaveteli cobró vida con <a href="https://www.whatdotheyknow.com">WhatDoTheyKnow</a>, un sitio web producido por <a href="https://mysociety.org/">mySociety</a> para realizar solicitudes de información pública en el Reino Unido.</p> + <p>A través de WhatDoTheyKnow.com se llevan a cabo entre un 15% y un 20% de las solicitudes recibidas por el gobierno central de Reino Unido.</p> + </div> + </div> + </div><!-- + --><div class="deployments__unit--major"> + <div class="deployment--major"> + <img src="{{ site.baseurl }}assets/img/ki-mit-tud.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Ki Mit Tud</h3> + <p class="deployment__country">Hungría</p> + <p class="deployment__link"><a href="http://kimittud.atlatszo.hu/">http://kimittud.atlatszo.hu/</a></p> + <div class="deployment__description"> + <p>Las leyes de Hungría reconocen el derecho de la población húngara a exigir información a cualquier organismo financiado con impuestos. Ki Mit Tud («¿Quién sabe qué?») simplifica radicalmente este proceso para los ciudadanos.</p> + <p>Ki Mit Tud se lanzó utilizando la plataforma Alaveteli en mayo de 2012 y durante su primer año procesó más de 1.000 solicitudes de información pública.</p> + </div> + </div> + </div><!-- + --><div class="deployments__unit--major"> + <div class="deployment--major"> + <img src="{{ site.baseurl }}assets/img/fyi.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">FYI </h3> + <p class="deployment__country">Nueva Zelanda</p> + <p class="deployment__link"><a href="https://fyi.org.nz/">https://fyi.org.nz/</a></p> + <div class="deployment__description"> + <p>El sector público neozelandés se halla dentro de los menos corruptos a nivel mundial. Sin embargo, Open New Zealand, la organización que se halla detrás de FYI, considera que un sitio web de información pública puede proporcionar ciertos beneficios.</p> + <p>FYI, al igual que todas las implementaciones de Alaveteli, simplifica el proceso total de envío de solicitudes y las publica junto con sus respuestas en línea, a la vista de todo el mundo. </p> + </div> + </div> + </div><!-- + --><div class="deployments__unit--major"> + <div class="deployment--major"> + <img src="{{ site.baseurl }}assets/img/tu-derecho-a-saber.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Tu derecho a saber</h3> + <p class="deployment__country">España</p> + <p class="deployment__link"><a href="http://tuderechoasaber.es/ ">http://tuderechoasaber.es/ </a></p> + <div class="deployment__description"> + <p>Tu derecho a saber se lanzó en 2012, antes de que España hubiese aceptado la Ley de Transparencia y frente a un entorno de discrepancia política.</p> + <p>España tiene ahora su derecho a saber, pero la plataforma Tu derecho a saber se mantiene como ejemplo de cómo gestionar un sitio basado en Alaveteli, incluso cuando la jurisdicción no dispone de ninguna ley que lo apoye.</p> + </div> + </div> + </div><!-- + --><div class="deployments__unit--major"> + <div class="deployment--major"> + <img src="{{ site.baseurl }}assets/img/ask-the-eu.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Ask the EU</h3> + <p class="deployment__country">Europa</p> + <p class="deployment__link"><a href="http://www.asktheeu.org/">http://www.asktheeu.org/</a></p> + <div class="deployment__description"> + <p>AskTheEU no da soporte a un solo país, sino que ofrece sus servicios a más de 500 millones de personas: a toda Europa.</p> + <p>AskTheEU procesa solicitudes para todos los organismos que forman parte de la Unión Europea y está traducido a diversos idiomas. Access Info Europe (Madrid) se encarga de su gestión.</p> + </div> + </div> + </div><!-- + --> + </div> + </div> + <div class="deployments__list--minor"> + <div class="grid-row"> + <div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/queremos-saber.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Queremos saber</h3> + <p class="deployment__country">Brasil</p> + <p class="deployment__link"><a href="http://queremossaber.org.br/">http://queremossaber.org.br/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/ukraine.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Доступ до правди</h3> + <p class="deployment__country">Ucrania</p> + <p class="deployment__link"><a href="https://dostup.pravda.com.ua/">https://dostup.pravda.com.ua/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/informace-pro-vsechny.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Info Pro Všechny</h3> + <p class="deployment__country">República Checa</p> + <p class="deployment__link"><a href="http://www.infoprovsechny.cz/">http://www.infoprovsechny.cz/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/right-to-know.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Right To Know</h3> + <p class="deployment__country">Australia</p> + <p class="deployment__link"><a href="https://www.righttoknow.org.au/">https://www.righttoknow.org.au/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/que-sabes.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Qué sabes</h3> + <p class="deployment__country">Uruguay</p> + <p class="deployment__link"><a href="http://www.quesabes.org/">http://www.quesabes.org/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/marsoum-41.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Marsoum 41</h3> + <p class="deployment__country">Túnez</p> + <p class="deployment__link"><a href="http://www.marsoum41.org/en">http://www.marsoum41.org/en</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/nu-va-suparati.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Nu Vă Supărați</h3> + <p class="deployment__country">Rumanía</p> + <p class="deployment__link"><a href="http://nuvasuparati.info/">http://nuvasuparati.info/ </a></p> + </div> + </div><!-- + + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/pravo-da-znam.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Pravo Da Znam</h3> + <p class="deployment__country">Bosnia</p> + <p class="deployment__link"><a href="http://www.pravodaznam.ba/">http://www.pravodaznam.ba/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/ask-data.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Ask Data</h3> + <p class="deployment__country">Israel</p> + <p class="deployment__link"><a href="http://askdata.org.il/">http://askdata.org.il/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/je-veux-savoir.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Je Veux Savoir</h3> + <p class="deployment__country">Canadá</p> + <p class="deployment__link"><a href="http://www.jeveuxsavoir.org/">http://www.jeveuxsavoir.org/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/macedonia.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Слободен пристап</h3> + <p class="deployment__country">Macedonia</p> + <p class="deployment__link"><a href="http://www.slobodenpristap.mk/">http://www.slobodenpristap.mk/</a></p> + </div> + </div><!-- + --><div class="deployments__unit--minor"> + <div class="deployment--minor"> + <img src="{{ site.baseurl }}assets/img/da-zanamo-svi.jpg" class="deployment__screenshot" /> + <h3 class="deployment__title">Da Zanamo Svi</h3> + <p class="deployment__country">Serbia</p> + <p class="deployment__link"><a href="http://daznamosvi.rs/sr">http://daznamosvi.rs/sr</a></p> + </div> + </div> + </div> + </div> + </div> +</div> + + +<div class="get-started"> + <div class="container"> + <h2>Primeros pasos</h2> + <div class="get-started__grid-unit get-started__grid-unit--wide"> + <div class="get-started__item get-started__item--primary"> + <p>Desde los miembros del equipo hasta los encargados de mantenimiento, nuestra guía de inicio recorre todo el proceso de planificación, inicio y gestión de su propio sitio web basado en Alaveteli</p> + <p><a href="{{ page.baseurl }}/docs/getting_started/" class="button">Primeros pasos</a></p> + </div> + </div><!-- + --><div class="get-started__grid-unit"> + <div class="get-started__item get-started__item"> + <h3>Obtenga el código</h3> + <p>Alaveteli es de código abierto y está disponible para su consulta, descarga y modificación en GitHub</p> + <p><a href="https://github.com/mysociety/alaveteli/" class="button">Github</a></p> + </div> + </div><!-- + --><div class="get-started__grid-unit"> + <div class="get-started__item get-started__item"> + <h3>Hable con nosotros</h3> + <p>¿Necesita ayuda? Coméntenos sus planes</p> + <p class="push-top"><a href="{{ page.baseurl }}/community" class="button">Póngase en contacto</a></p> + </div> + </div> + </div> +</div> diff --git a/es/docs/customising/config.md b/es/docs/customising/config.md new file mode 100644 index 000000000..dc79df3e9 --- /dev/null +++ b/es/docs/customising/config.md @@ -0,0 +1,1186 @@ +--- +layout: es/page +title: Configuración +--- + +# Configuración de Alaveteli + +<p class="lead"> + Puede controlar numerosos detalles sobre el aspecto y el comportamiento de Alaveteli con tan solo + modificar los ajustes de configuración. +</p> + +## Archivo de configuración general + +El código de Alaveteli incluye un ejemplo de archivo de configuración: `config/general.yml-example`. + +Como parte del [proceso de instalación]({{ page.baseurl }}/docs/installing/ ), el +archivo de ejemplo se copia en `config/general.yml`. **Debe** editar este archivo para +adaptarlo a sus necesidades. + +Los ajustes predeterminados para los ejemplos de páginas frontales están diseñados para trabajar con +los datos de prueba incluidos en Alaveteli. Al disponer de datos reales debe editarlos. + +También existen [otros archivos de configuración](#other-config) para aspectos específicos de Alaveteli. + + +## Ajustes de configuración por tema + +Los siguientes ajustes de configuración pueden modificarse en `config/general.yml`. +Al editar este archivo, recuerde que debe hacerlo con la <a href="http://yaml.org">sintaxis de YAML</a>. +No es complicado, pero (especialmente al editar un listado) debe prestar atención en mantener el +sangrado de texto correcto. Si tiene dudas, consulte los ejemplos que se hallan en el archivo +y no utilice tabulaciones. + +### Apariencia y comportamiento general del sitio: + +<code><a href="#site_name">SITE_NAME</a></code> +<br> <code><a href="#domain">DOMAIN</a></code> +<br> <code><a href="#force_ssl">FORCE_SSL</a></code> +<br> <code><a href="#force_registration_on_new_request">FORCE_REGISTRATION_ON_NEW_REQUEST</a></code> +<br> <code><a href="#theme_urls">THEME_URLS</a></code> +<br> <code><a href="#theme_branch">THEME_BRANCH</a></code> +<br> <code><a href="#frontpage_publicbody_examples">FRONTPAGE_PUBLICBODY_EXAMPLES</a></code> +<br> <code><a href="#public_body_statistics_page">PUBLIC_BODY_STATISTICS_PAGE</a></code> +<br> <code><a href="#minimum_requests_for_statistics">MINIMUM_REQUESTS_FOR_STATISTICS</a></code> +<br> <code><a href="#responsive_styling">RESPONSIVE_STYLING</a></code> + +### Estado del sitio: + +<code><a href="#read_only">READ_ONLY</a></code> +<br> <code><a href="#staging_site">STAGING_SITE</a></code> + +### Localización e internacionalización: + +<code><a href="#iso_country_code">ISO_COUNTRY_CODE</a></code> +<br> <code><a href="#time_zone">TIME_ZONE</a></code> +<br> <code><a href="#available_locales">AVAILABLE_LOCALES</a></code> +<br> <code><a href="#default_locale">DEFAULT_LOCALE</a></code> +<br> <code><a href="#use_default_browser_language">USE_DEFAULT_BROWSER_LANGUAGE</a></code> +<br> <code><a href="#include_default_locale_in_urls">INCLUDE_DEFAULT_LOCALE_IN_URLS</a></code> + +### Definición de «late» (fuera de plazo): + +<code><a href="#reply_late_after_days">REPLY_LATE_AFTER_DAYS</a></code> +<br> <code><a href="#reply_very_late_after_days">REPLY_VERY_LATE_AFTER_DAYS</a></code> +<br> <code><a href="#special_reply_very_late_after_days">SPECIAL_REPLY_VERY_LATE_AFTER_DAYS</a></code> +<br> <code><a href="#working_or_calendar_days">WORKING_OR_CALENDAR_DAYS</a></code> + +### Acceso a la interfaz de administración: + +<code><a href="#admin_username">ADMIN_USERNAME</a></code> +<br> <code><a href="#admin_password">ADMIN_PASSWORD</a></code> +<br> <code><a href="#disable_emergency_user">DISABLE_EMERGENCY_USER</a></code> +<br> <code><a href="#skip_admin_auth">SKIP_ADMIN_AUTH</a></code> + +### Gestión del correo electrónico: + +<code><a href="#incoming_email_domain">INCOMING_EMAIL_DOMAIN</a></code> +<br> <code><a href="#incoming_email_prefix">INCOMING_EMAIL_PREFIX</a></code> +<br> <code><a href="#incoming_email_secret">INCOMING_EMAIL_SECRET</a></code> +<br> <code><a href="#blackhole_prefix">BLACKHOLE_PREFIX</a></code> +<br> <code><a href="#contact_email">CONTACT_EMAIL</a></code> +<br> <code><a href="#contact_name">CONTACT_NAME</a></code> +<br> <code><a href="#track_sender_email">TRACK_SENDER_EMAIL</a></code> +<br> <code><a href="#track_sender_name">TRACK_SENDER_NAME</a></code> +<br> <code><a href="#raw_emails_location">RAW_EMAILS_LOCATION</a></code> +<br> <code><a href="#exception_notifications_from">EXCEPTION_NOTIFICATIONS_FROM</a></code> +<br> <code><a href="#exception_notifications_to">EXCEPTION_NOTIFICATIONS_TO</a></code> +<br> <code><a href="#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a></code> +<br> <code><a href="#mta_log_path">MTA_LOG_PATH</a></code> +<br> <code><a href="#mta_log_type">MTA_LOG_TYPE</a></code> + +### Administración general (claves, rutas, servicios de soporte del sistema): + +<code><a href="#cookie_store_session_secret">COOKIE_STORE_SESSION_SECRET</a></code> +<br> <code><a href="#recaptcha_public_key">RECAPTCHA_PUBLIC_KEY</a></code> +<br> <code><a href="#recaptcha_private_key">RECAPTCHA_PRIVATE_KEY</a></code> +<br> <code><a href="#gaze_url">GAZE_URL</a></code> +<br> <code><a href="#ga_code">GA_CODE</a></code> (GA=Google Analytics) +<br> <code><a href="#utility_search_path">UTILITY_SEARCH_PATH</a></code> +<br> <code><a href="#shared_files_path">SHARED_FILES_PATH</a></code> +<br> <code><a href="#shared_files">SHARED_FILES</a></code> +<br> <code><a href="#shared_directories">SHARED_DIRECTORIES</a></code> + +### Disparadores y ajustes de comportamiento: + +<code><a href="#new_response_reminder_after_days">NEW_RESPONSE_REMINDER_AFTER_DAYS</a></code> +<br> <code><a href="#max_requests_per_user_per_day">MAX_REQUESTS_PER_USER_PER_DAY</a></code> +<br> <code><a href="#override_all_public_body_request_emails">OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS</a></code> +<br> <code><a href="#allow_batch_requests">ALLOW_BATCH_REQUESTS</a></code> +<br> <code><a href="#public_body_list_fallback_to_default_locale">PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE</a></code> +<br> <code><a href="#cache_fragments">CACHE_FRAGMENTS</a></code> + +### Servicios públicos externos: + +<code><a href="#blog_feed">BLOG_FEED</a></code> +<br> <code><a href="#twitter_username">TWITTER_USERNAME</a></code> +<br> <code><a href="#twitter_widget_id">TWITTER_WIDGET_ID</a></code> +<br> <code><a href="#donation_url">DONATION_URL</a></code> + +### Casos especiales o trabajo de desarrollo: + +<code><a href="#debug_record_memory">DEBUG_RECORD_MEMORY</a></code> +<br> <code><a href="#varnish_host">VARNISH_HOST</a></code> +<br> <code><a href="#use_mailcatcher_in_development">USE_MAILCATCHER_IN_DEVELOPMENT</a></code> +<br> <code><a href="#use_ghostscript_compression">USE_GHOSTSCRIPT_COMPRESSION</a></code> +<br> <code><a href="#html_to_pdf_command">HTML_TO_PDF_COMMAND</a></code> + + +--- + +## Todos los ajustes generales + + +<dl class="glossary"> + + <dt> + <a name="site_name"><code>SITE_NAME</code></a> + </dt> + <dd> + <strong>SITE_NAME</strong> aparece en diversos lugares del sitio. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>SITE_NAME: 'Alaveteli'</code> + </li> + <li> + <code>SITE_NAME: 'WhatDoTheyKnow'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="domain"><code>DOMAIN</code></a> + </dt> + <dd> + Dominio utilizado en direcciones URL generadas por scripts (por ejemplo, para incluirse en algunos correos). + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>DOMAIN: '127.0.0.1:3000'</code> + </li> + <li> + <code>DOMAIN: 'www.ejemplo.com'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="force_ssl"><code>FORCE_SSL</code></a> + </dt> + <dd> + Si tiene asignado el valor «true», fuerza a todo el mundo (dentro del entorno de producción) a utilizar conexiones cifradas + (https), redirigiendo las conexiones sin cifrado. Esta característia está <strong>altamente + recomendada</strong> para que las credenciales no puedan ser interceptadas por personas malintencionadas. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>FORCE_SSL: true</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="iso_country_code"><code>ISO_COUNTRY_CODE</code></a> + </dt> + <dd> + <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">Código ISO nacional</a> + del país donde se implementa su sitio basado en Alaveteli. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>ISO_COUNTRY_CODE: GB</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="time_zone"><code>TIME_ZONE</code></a> + </dt> + <dd> + Esta es la <a href="http://en.wikipedia.org/wiki/List_of_tz_database_time_zones">zona horaria</a> + que utiliza Alaveteli para mostrar la fecha y la hora. + Si no se configura, utiliza UTC por defecto. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>TIME_ZONE: Australia/Sydney</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="blog_feed"><code>BLOG_FEED</code></a> + </dt> + <dd> + Estas transmisiones se muestran consecuentemente en la página del blog de Alaveteli: <!-- TODO --> + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>BLOG_FEED: 'https://www.mysociety.org/category/projects/whatdotheyknow/feed/'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="twitter_username"><code>TWITTER_USERNAME</code></a> + <a name="twitter_widget_id"><code>TWITTER_WIDGET_ID</code></a> + </dt> + <dd> + Si desea mostrar las novedades de Twitter en la página del blog, introduzca el identificador y el código de usuario para el widget. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>TWITTER_USERNAME: WhatDoTheyKnow</code> + </li> + <li> + <code>TWITTER_WIDGET_ID: '833549204689320031'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="available_locales"><code>AVAILABLE_LOCALES</code></a> y + <a name="default_locale"><code>DEFAULT_LOCALE</code></a> + </dt> + <dd> + <strong>AVAILABLE_LOCALES</strong> lista todas las localizaciones que desea soportar en su sitio. + Si hay más de una, utilice espacios para separar las entradas. + Defina una de las localizaciones como predeterminada con la variable <strong>DEFAULT_LOCALE</strong>. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>AVAILABLE_LOCALES: 'en es'</code> + </li> + <li> + <code>DEFAULT_LOCALE: 'en'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="use_default_browser_language"><code>USE_DEFAULT_BROWSER_LANGUAGE</code></a> + </dt> + <dd> + ¿Desea que Alaveteli intente utiliza el idioma predeterminado del navegador del usuario? + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>USE_DEFAULT_BROWSER_LANGUAGE: true</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="include_default_locale_in_urls"><code>INCLUDE_DEFAULT_LOCALE_IN_URLS</code></a> + </dt> + <dd> + Normalmente Alaveteli incluirá la localización en sus direcciones URL, de este modo: + <code>www.ejemplo.com/en/body/list/all</code>. Si no desea este comportamiento + cuando se trate de la localización por defecto, asigne a + <strong>INCLUDE_DEFAULT_LOCALE_IN_URLS</strong> el valor «false». + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>INCLUDE_DEFAULT_LOCALE_IN_URLS: true</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="reply_late_after_days"><code>REPLY_LATE_AFTER_DAYS</code></a><br> + <a name="reply_very_late_after_days"><code>REPLY_VERY_LATE_AFTER_DAYS</code></a><br> + <a name="special_reply_very_late_after_days"><code>SPECIAL_REPLY_VERY_LATE_AFTER_DAYS</code></a> + <a name="working_or_calendar_days"><code>WORKING_OR_CALENDAR_DAYS</code></a> + </dt> + <dd> + Las variables <strong>REPLY...AFTER_DAYS</strong> definen cuántos días deben pasar + antes de que la respuesta a una solicitud se considere oficialmente <em>late</em> (fuera de plazo). + Existe un caso SPECIAL para ciertos tipos de autoridades (por ejemplo, los colegios en el Reino Unido) que + disponen de algo más de tiempo que las demás para responder a las consultas. + La variable <strong>WORKING_OR_CALENDAR_DAYS</strong> puede contener los valores «working» (predeterminado) + o «calendar», que determinan qué días se incluyen en el contador. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>REPLY_LATE_AFTER_DAYS: 20</code> + </li> + <li> + <code>REPLY_VERY_LATE_AFTER_DAYS: 40</code> + </li> + <li> + <code>SPECIAL_REPLY_VERY_LATE_AFTER_DAYS: 60</code> + </li> + <li> + <code>WORKING_OR_CALENDAR_DAYS: working</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="frontpage_publicbody_examples"><code>FRONTPAGE_PUBLICBODY_EXAMPLES</code></a> + </dt> + <dd> + Especifique qué organismos públicos desea listar como ejemplo en la página de inicio + utilizando su nombre corto, <code>short_name</code>. + Si desea mostrar más de uno, sepárelos por punto y coma. + Comente este apartado si desea que se genere de forma automática. + <p> + <strong>Advertencia</strong>: esta opción es lenta, ¡no la utilice en producción! + </p> + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>FRONTPAGE_PUBLICBODY_EXAMPLES: 'tgq'</code> + </li> + <li> + <code>FRONTPAGE_PUBLICBODY_EXAMPLES: 'tgq;foo;bar'</code> + </li> + <li> + <code># FRONTPAGE_PUBLICBODY_EXAMPLES: </code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="theme_urls"><code>THEME_URLS</code></a> + </dt> + <dd> + Direcciones URL de <a href="{{ page.baseurl }}/docs/customising/themes/">temas</a> para descargar y utilizar + (al ejecutar el script <code>rails-post-deploy</code>). Las primeras plantillas de la lista tienen + mayor prioridad que las siguientes. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <pre> +THEME_URLS: + - 'git://github.com/mysociety/alavetelitheme.git' +</pre> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="theme_branch"><code>THEME_BRANCH</code></a> + </dt> + <dd> + Cuando el script <code>rails-post-deploy</code> instale los <a href="{{ page.baseurl }}/docs/customising/themes/">temas</a>, + probará primero la rama de temas, pero solo si ha asignado a <code>THEME_BRANCH</code> + el valor «true». Si la rama no existe, retornará al uso de una versión etiquetada específica + en su versión instalada de Alaveteli y, en caso de que no exista ninguna, retornará a + la maestra, <code>master</code>. + <p> + El tema por defecto es el denominado «Alaveteli». Se instala automáticamente cuando se ejecuta + <code>rails-post-deploy</code>. + </p> + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>THEME_BRANCH: false</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="force_registration_on_new_request"><code>FORCE_REGISTRATION_ON_NEW_REQUEST</code></a> + </dt> + <dd> + ¿Necesitan los usuarios iniciar sesión para comenzar un nuevo proceso de solicitud? + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>FORCE_REGISTRATION_ON_NEW_REQUEST: false</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="incoming_email_domain"><code>INCOMING_EMAIL_DOMAIN</code></a> + </dt> + <dd> + Su dominio de correo electrónico para recibir correo entrante. Consulte también la <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">gestión de correo de Alaveteli</a>. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>INCOMING_EMAIL_DOMAIN: 'localhost'</code> + </li> + <li> + <code>INCOMING_EMAIL_DOMAIN: 'foifa.com'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> + </dt> + <dd> + Un prefijo opcional para ayudarle a distinguir las solicitudes de información pública. Consulte también la <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">gestión de correo de Alaveteli</a>. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>INCOMING_EMAIL_PREFIX: ''</code> + </li> + <li> + <code>INCOMING_EMAIL_PREFIX: 'foi+'</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="incoming_email_secret"><code>INCOMING_EMAIL_SECRET</code></a> + </dt> + <dd> + Utilizada para almacenar el código hash en la dirección de correo de la solicitud. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>INCOMING_EMAIL_SECRET: '11ae 4e3b 70ff c001 3682 4a51 e86d ef5f'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="blackhole_prefix"><code>BLACKHOLE_PREFIX</code></a> + </dt> + <dd> + Utilizada como campo remitente «from» en el dominio de correo entrante para casos en que no se tienen en cuenta los posibles errores. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>BLACKHOLE_PREFIX: 'do-not-reply-to-this-address'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="admin_username"><code>ADMIN_USERNAME</code></a> + y + <a name="admin_password"><code>ADMIN_PASSWORD</code></a> + <br> + <a name="disable_emergency_user"><code>DISABLE_EMERGENCY_USER</code></a> + </dt> + <dd> + Detalles sobre el + <a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">usuario de emergencia</a>. + <p> + Estas opciones resultan útiles para crear los usuarios administradores iniciales de su sitio: + <ul> + <li>Cree un nuevo usuario (mediante el registro común del sitio).</li> + <li>Inicie sesión con el usuario de emergencia.</li> + <li>Ascienda la nueva cuenta a administrador.</li> + <li>Deshabilite el usuario de emergencia.</li> + </ul> + </p> + <p> + Para obtener detalles sobre este proceso, consulte la + <a href="{{ page.baseurl }}/docs/installing/next_steps/#cree-una-cuenta-de-administrador-superusuario">creación + de cuentas de superusuario</a>. + </p> + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>ADMIN_USERNAME: 'adminxxxx'</code> + </li> + <li> + <code>ADMIN_PASSWORD: 'passwordx'</code> + </li> + <li> + <code>DISABLE_EMERGENCY_USER: false</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="skip_admin_auth"><code>SKIP_ADMIN_AUTH</code></a> + </dt> + <dd> + Asigne a esta variable el valor «true» para que la interfaz de administración sea accesible para usuarios anónimos. + Evidentemente, esta opción no debe activarse en entornos de producción. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>SKIP_ADMIN_AUTH: false</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="contact_email"><code>CONTACT_EMAIL</code></a> + y + <a name="contact_name"><code>CONTACT_NAME</code></a> + </dt> + <dd> + Detalles del campo del remitente «from» en el correo electrónico. Consulte también la <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">gestión de correo de Alaveteli</a>. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>CONTACT_EMAIL: 'team@example.com'</code> + </li> + <li> + <code>CONTACT_NAME: 'Alaveteli Webmaster'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="track_sender_email"><code>TRACK_SENDER_EMAIL</code></a> y + <a name="track_sender_name"><code>TRACK_SENDER_NAME</code></a> + </dt> + <dd> + Detalles del campo del remitente «from» para mensajes de seguimiento. Consulte también la <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">gestión de correo de Alaveteli</a>. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>TRACK_SENDER_EMAIL: 'alaveteli@ejemplo.com'</code> + </li> + <li> + <code>TRACK_SENDER_NAME: 'Alaveteli Webmaster'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="raw_emails_location"><code>RAW_EMAILS_LOCATION</code></a> + </dt> + <dd> + Lugar donde se almacenan los datos de tipo raw del correo entrante. + <strong>¡Asegúrese de hacer copias de seguridad de estos datos!</strong> + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>RAW_EMAILS_LOCATION: 'files/raw_emails'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="cookie_store_session_secret"><code>COOKIE_STORE_SESSION_SECRET</code></a> + </dt> + <dd> + Clave secreta para firmar sesiones cookie_store. Debe ser larga y aleatoria. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>COOKIE_STORE_SESSION_SECRET: 'uIngVC238Jn9NsaQizMNf89pliYmDBFugPjHS2JJmzOp8'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="read_only"><code>READ_ONLY</code></a> + </dt> + <dd> + Si está presente, <strong>READ_ONLY</strong> aplica el modo de solo lectura al sitio + y utiliza el texto como razón (el párrafo completo). Utilice un usuario de solo lectura + también en la base de datos, pues solo se verifica en unos pocos lugares evidentes. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + Normalmente <strong>no</strong> deseará que su sitio funcione en + modo de solo lectura, por lo que deberá dejar <strong>READ_ONLY</strong> + en blanco. + <br> + <code> + READ_ONLY: '' + </code> + </li> + <li> + <code> + READ_ONLY: 'Actualmente el sitio no acepta solicitudes porque estamos trasladando el servidor.' + </code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="staging_site"><code>STAGING_SITE</code></a> + </dt> + <dd> + ¿Es este un servidor de + <a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">pruebas</a> o de + <a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">desarrollo</a>? + Si no es así, se trata de un servidor real de <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">producción</a>. + Esta opción controla si el script <code>rails-post-deploy</code> + debe o no crear el archivo <code>config/rails_env.rb</code> para forzar + Rails en el entorno de producción. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + Para servidores de pruebas o de desarrollo: + <p> + <code>STAGING_SITE: 1</code> + </p> + </li> + <li> + Para producción: + <p> + <code>STAGING_SITE: 0</code> + </p> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="recaptcha_public_key"><code>RECAPTCHA_PUBLIC_KEY</code></a> y + <a name="recaptcha_private_key"><code>RECAPTCHA_PRIVATE_KEY</code></a> + </dt> + <dd> + Recaptcha, para la detección de humanos. Obtenga aquí las claves: + <a href="http://recaptcha.net/whyrecaptcha.html">http://recaptcha.net/whyrecaptcha.html</a> + + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>RECAPTCHA_PUBLIC_KEY: '7HoPjGBBBBBBBBBkmj78HF9PjjaisQ893'</code> + </li> + <li> + <code>RECAPTCHA_PRIVATE_KEY: '7HjPjGBBBBBCBBBpuTy8a33sgnGG7A'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="new_response_reminder_after_days"><code>NEW_RESPONSE_REMINDER_AFTER_DAYS</code></a> + </dt> + <dd> + Número de días tras los cuales se enviará un recordatorio de respuesta «new response reminder». + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>NEW_RESPONSE_REMINDER_AFTER_DAYS: [3, 10, 24]</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="debug_record_memory"><code>DEBUG_RECORD_MEMORY</code></a> + </dt> + <dd> + Para depurar problemas de memoria. Si se le asigna el valor «true», Alaveteli registra + los aumentos de uso de memoria del proceso de Ruby debido a la + solicitud (solamente en Linux). Como Ruby nunca devuelve memoria al sistema operativo, + si el proceso existente había dado servicio previamente a una solicitud de mayor tamaño, + no se mostrará ningún consumo para la siguiente. + + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>DEBUG_RECORD_MEMORY: false</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="use_ghostscript_compression"><code>USE_GHOSTSCRIPT_COMPRESSION</code></a> + </dt> + <dd> + Actualmente predeterminamos el uso de pdftk para comprimir archivos en formato PDF. + Opcionalmente, puede probar Ghostscript, que debería llevar a cabo un mejor trabajo + de compresión. Algunas versiones de pdftk generan errores respecto a la compresión, + en cuyo caso Alaveteli no recomprime los archivos PDF + y registra un mensaje de advertencia, «Unable to compress PDF», un motivo más + para probar esta opción. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>USE_GHOSTSCRIPT_COMPRESSION: true</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="gaze_url"><code>GAZE_URL</code></a> + </dt> + <dd> + Alateveli utiliza el servicio geográfico de mySociety para determinar el país de la dirección + IP recibida (así podemos sugerir un sitio basado en Alaveteli del país correspondiente, si existe alguno). + Normalmente no es necesario modificar esta opción. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>GAZE_URL: http://gaze.mysociety.org</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="forward_nonbounce_responses_to"><code>FORWARD_NONBOUNCE_RESPONSES_TO</code></a> + </dt> + <dd> + Dirección de correo electrónico a la que se dirigen las respuestas no rebotadas. Consulte también la <a href="{{ page.baseurl }}/docs/installing/email#how-alaveteli-handles-email">gestión de correo de Alaveteli</a>. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>FORWARD_NONBOUNCE_RESPONSES_TO: soporte-usuario@ejemplo.com</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="html_to_pdf_command"><code>HTML_TO_PDF_COMMAND</code></a> + </dt> + <dd> + Ruta hacia un programa que convierte una página HTML de un archivo a PDF. Debería + recibir dos parámetros: la dirección URL y la ruta del archivo de salida. + Se recomienda una version binaria estática de <a href="http://wkhtmltopdf.org">wkhtmltopdf</a>. + Si el comando no está presente, se generará en su lugar una versión de texto. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>HTML_TO_PDF_COMMAND: /usr/local/bin/wkhtmltopdf-amd64</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="exception_notifications_from"><code>EXCEPTION_NOTIFICATIONS_FROM</code></a> y + <a name="exception_notifications_to"><code>EXCEPTION_NOTIFICATIONS_TO</code></a> + </dt> + <dd> + Direcciones de correo utilizadas para enviar notificaciones de excepciones. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <pre> +EXCEPTION_NOTIFICATIONS_FROM: no-responda-a-esta-direccion@ejemplo.com + +EXCEPTION_NOTIFICATIONS_TO: + - robin@ejemplo.com + - seb@ejemplo.com +</pre> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="max_requests_per_user_per_day"><code>MAX_REQUESTS_PER_USER_PER_DAY</code></a> + </dt> + <dd> + Este límite puede desactivarse por usuario a través de la interfaz de administración. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>MAX_REQUESTS_PER_USER_PER_DAY: 6</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="varnish_host"><code>VARNISH_HOST</code></a> + </dt> + <dd> + Si su sitio funciona con Varnish, + puede activar esta opción para + averiguar dónde enviar las solicitudes + de purga. En caso contrario, no + la configure. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>VARNISH_HOST: null</code> + </li> + <li> + <code>VARNISH_HOST: localhost</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="ga_code"><code>GA_CODE</code> (GA=Google Analytics)</a> + </dt> + <dd> + Añadir aquí un valor activará Google Analytics en todas las páginas que no pertenezcan a la administración para todos los usuarios que no sean administradores. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>GA_CODE: ''</code> + </li> + <li> + <code>GA_CODE: 'AB-8222142-14'</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="override_all_public_body_request_emails"><code>OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS</code></a> + </dt> + <dd> + Utilice esta opción si desea sobrescribir <strong>todas</strong> las direcciones de correo de solicitudes para organismos públicos + con su propia dirección de correo, para que los mensajes de solicitudes que normalmente se dirigirían a los organismos + públicos se dirijan a usted en su lugar. + Esta opción resulta práctica en el servidor de pruebas para poder reproducir el proceso completo de envío de solicitudes + si remitir correos a ninguna autoridad real. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <code>OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS: test-email@foo.com</code> + </li> + <li> + Si no le interesa este comportamiento, comente la opción: + <br> + <code># OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS:</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="utility_search_path"><code>UTILITY_SEARCH_PATH</code></a> + </dt> + <dd> + Ruta de búsqueda para utilidades externas de línea de comando (como pdftohtml, pdftk y unrtf). + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>UTILITY_SEARCH_PATH: ["/usr/bin", "/usr/local/bin"]</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="mta_log_path"><code>MTA_LOG_PATH</code></a> + </dt> + <dd> + Ruta hacia sus archivos de registro de exim o postfix que serán absorbidos por + <code>script/load-mail-server-logs</code>. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>MTA_LOG_PATH: '/var/log/exim4/exim-mainlog-*'</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="mta_log_type"><code>MTA_LOG_TYPE</code></a> + </dt> + <dd> + ¿Utiliza «exim» o «postfix» para su servidor de correo (MTA)? + + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>MTA_LOG_TYPE: "exim"</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="donation_url"><code>DONATION_URL</code></a> + </dt> + <dd> + URL donde las personas pueden donar dinero a la organización que gestiona el sitio. Si se configura, + se incluirá en el mensaje que ven los usuarios cuando su solicitud tiene resultados satisfactorios. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>DONATION_URL: "https://www.mysociety.org/donate/"</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="public_body_statistics_page"><code>PUBLIC_BODY_STATISTICS_PAGE</code></a> y + <a name="minimum_requests_for_statistics"><code>MINIMUM_REQUESTS_FOR_STATISTICS</code></a> + </dt> + <dd> + Si a <strong>PUBLIC_BODY_STATISTICS_PAGE</strong> se le asigna el valor «true», Alaveteli creará + una página de estadísticas sobre el comportamiento de los organismos públicos (que puede consultar en + <code>/body_statistics</code>). + La página solo considerará los organismos públicos que hayan recibido al menos el número de solicitudes + definido en <strong>MINIMUM_REQUESTS_FOR_STATISTICS</strong>. + + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>PUBLIC_BODY_STATISTICS_PAGE: false</code> + </li> + <li> + <code>MINIMUM_REQUESTS_FOR_STATISTICS: 50</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="public_body_list_fallback_to_default_locale"><code>PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE</code></a> + </dt> + <dd> + Si desea que la página del listado de organismos públicos incluya autoridades que no disponen de traducción + para la localización actual (pero que sí disponen de traducción para la localización predeterminada), asigne el valor «true» a esta variable. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE: false</code> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="use_mailcatcher_in_development"><code>USE_MAILCATCHER_IN_DEVELOPMENT</code></a> + </dt> + <dd> + <!-- TODO check mailcatcher URL --> + Si se el asigna el valor «true», durante la fase de desarrollo, intente enviar correo por SMTP al puerto + 1025 (puerto predeterminado de escucha de <a href="http://mailcatcher.me">mailcatcher</a>): + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>USE_MAILCATCHER_IN_DEVELOPMENT: true</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="cache_fragments"><code>CACHE_FRAGMENTS</code></a> + </dt> + <dd> + Utilice memcached para almacenar en caché fragmentos de HTML con la finalidad. + de obtener un mejor rendimiento. Solo tendrá efecto en entornos en los que se + asigne a <code>config.action_controller.perform_caching</code> el valor «true». + + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>CACHE_FRAGMENTS: true</code> + </li> + </ul> + </div> + </dd> + + + + <dt> + <a name="shared_files_path"><code>SHARED_FILES_PATH</code></a> + </dt> + <dd> + En algunas implementaciones de Alaveteli tal vez desee instalar cada nueva versión + implementada junto con las anteriores, en cuyo caso ciertos archivos y recursos + se compartirán entre las diferentes instalaciones. + Por ejemplo, el directorio de archivos, <code>files</code>, el directorio <code>cache</code> + y los gráficos generados, tales como <code>public/foi-live-creation.png</code>. Si + instala Alaveteli con este tipo de configuración, asigne a <strong>SHARED_FILES_PATH</strong> + el directorio en el que almacena estos archivos. En caso contrario, déjela en blanco. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>SHARED_FILES_PATH: ''</code> <!-- TODO specific example --> + </li> + </ul> + </div> + </dd> + + + <dt> + <a name="shared_files"><code>SHARED_FILES</code></a> y + <a name="shared_directories"><code>SHARED_DIRECTORIES</code></a> + </dt> + <dd> + Si tiene configurada la variable <strong>SHARED_FILES_PATH</strong>, estas opciones listan + los archivos y directorios que se comparten, por ejemplo, aquellos hacia los que los scripts + de despliegue crean enlaces simbólicos desde el repositorio. + <div class="more-info"> + <p>Ejemplos:</p> + <ul class="examples"> + <li> + <pre> +SHARED_FILES: + - config/database.yml + - config/general.yml + - config/rails_env.rb + - config/newrelic.yml + - config/httpd.conf + - public/foi-live-creation.png + - public/foi-user-use.png + - config/aliases + </pre> + </li> + <li> + <pre> +SHARED_DIRECTORIES: + - files/ + - cache/ + - lib/acts_as_xapian/xapiandbs/ + - vendor/bundle + - public/assets + </pre> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="allow_batch_requests"><code>ALLOW_BATCH_REQUESTS</code></a> + </dt> + <dd> + Permita que algunos usuarios realicen solicitudes en bloque a múltiples autoridades. Una vez + asignado el valor «true» a esta variable, puede activar las solicitudes en bloque para usuarios + individuales a través de la página de administración de cada usuario. + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>ALLOW_BATCH_REQUESTS: false</code> + </li> + </ul> + </div> + </dd> + + <dt> + <a name="responsive_styling"><code>RESPONSIVE_STYLING</code></a> + </dt> + <dd> + + Utilice las plantillas y hojas de estilo de diseño web adaptable en lugar de + aquellas que solo muestran el sitio con una anchura determinada. Estas hojas + de estilo son experimentales actualmente, pero se predeterminarán en el futuro. + Permiten que el sitio se muestre correctamente en dispositivos móviles, así + como en pantallas de mayor tamaño. Actualmente las hojas de estilos de anchura + fija se utilizan por defecto. + + <div class="more-info"> + <p>Ejemplo:</p> + <ul class="examples"> + <li> + <code>RESPONSIVE_STYLING: true</code> + </li> + </ul> + </div> + </dd> + +</dl> + +<a name="other-config"> </a> + +## Otros archivos de configuración + +Existen otros archivos de configuración para Alaveteli, que puede encontrar en el +directorio `config`. Se presentan en el repositorio de git como archivos `*-example`, +que puede copiar en su correspondiente ubicación. + +<dl> + <dt> + <strong>database.yml</strong> + </dt> + <dd> + ajustes de base de datos (para Rails) + </dd> + <dt> + <strong>deploy.yml</strong> + </dt> + <dd> + especificaciones de implementación utilizadas por Capistrano + </dd> + <dt> + <strong>httpd.conf, nginx.conf</strong> + </dt> + <dd> + sugerencias de configuración de Apache y Nginx + </dd> + <dt> + <strong>newrelic.yml</strong> + </dt> + <dd> + configuración de análisis + </dd> +</dl> diff --git a/es/docs/customising/index.md b/es/docs/customising/index.md new file mode 100644 index 000000000..030466411 --- /dev/null +++ b/es/docs/customising/index.md @@ -0,0 +1,44 @@ +--- +layout: es/page +title: Personalización +--- + +# Personalización de Alaveteli + +<p class="lead"> + Existen dos formas de aplicar el aspecto y funcionamiento deseados a su instalación. + Algunos comportamientos pueden controlarse con <strong>los ajustes de configuración</strong>. + Para realizar cambios más complejos, necesitará crear un nuevo <strong>tema</strong>. +</p> + + +## Ajustes de configuración + +Puede personalizar numerosos comportamientos de Alaveteli solamente editando el archivo de configuración. +Esta [lista completa de los ajustes de configuración de Alaveteli]({{ page.baseurl }}/docs/customising/config/) +muestra el tipo de opciones que puede controlar de este modo. + +<!-- TODO key settings --> + +## Adaptaciones sencillas de marca: color y logotipo + +Es habitual querer cambiar la apariencia básica del sitio. A pesar de que puede simplemente +editar las plantillas y los estilos CSS predeterminados, le **recomendamos +encarecidamente** que [cree un tema]({{ page.baseurl }}/docs/customising/themes/). + +Los temas no necesitan ser especialmente complejos, pero le permiten añadir sus cambios junto +con el código principal, que puede actualizar (cuando haya nuevas versiones o +actualizaciones disponibles). + +## ¿Necesita Alaveteli en un idioma diferente? + +¡Ningún problema! Consulte esta [información sobre la traducción de Alaveteli]({{ page.baseurl }}/docs/customising/translation/). + +## Cambios complejos + +Si es un desarrollador (o cuenta con un equipo de programadores disponible), puede +añadir todas las personalizaciones que desee. Pero es importante que lo haga sin romper +el código principal para que pueda aceptar actualizaciones y versiones nuevas. +Encontrará más detalles en la [página sobre los temas]({{ page.baseurl }}/docs/customising/themes/). + +Consulte también la [documentación para desarrolladores]({{ page.baseurl }}/docs/developers/). diff --git a/es/docs/customising/states.md b/es/docs/customising/states.md new file mode 100644 index 000000000..660972d98 --- /dev/null +++ b/es/docs/customising/states.md @@ -0,0 +1,218 @@ +--- +layout: es/page +title: Estados de solicitud +--- + +# Estados de solicitud + +<p class="lead"> + Una <a href="{{ page.baseurl }}/docs/glossary/#request" class="glossary__link">solicitud</a> + atraviesa distintos <strong>estados</strong> durante su proceso. Estos pueden variar + de una jurisdicción a otra. +</p> + +Los estados de solicitud están definidos en el código de Alaveteli y le recomendamos su +uso (siempre que concuerden con la <a href="{{ page.baseurl }}/docs/glossary/#foi" +class="glossary__link">ley de información pública</a> de su propia jurisdicción). Pero si necesita +personalizarlos, puede consultar la +<a href="{{ page.baseurl }}/docs/customising/themes/#personalizar-los-estados-de-solicitud">personalización de los estados de solicitud</a> +para obtener más información. + +## Ejemplo de WhatDoTheyKnow + +Las solicitudes efectuadas en el sitio basado en Alaveteli del Reino Unido, [WhatDoTheyKnow](https://www.whatdotheyknow.com), +pueden hallarse en cualquiera de los estados descritos a continuación. + +Su sitio no tiene por qué utilizar los mismos estados que utiliza WhatDoTheyKnow. Por ejemplo, +el sitio de Kosovo utiliza unos estados ligeramente distintos: consulte +[esta comparación de las diferencias entre ambos]({{ page.baseurl }}/docs/customising/states_informatazyrtare/). + +### Estados + +<ul class="definitions"> + <li><a href="#waiting_response">waiting_response</a></li> + <li><a href="#waiting_classification">waiting_classification</a></li> + <li><a href="#waiting_response_overdue">waiting_response_overdue</a></li> + <li><a href="#waiting_response_very_overdue">waiting_response_very_overdue</a></li> + <li><a href="#waiting_clarification">waiting_clarification</a></li> + <li><a href="#gone_postal">gone_postal</a></li> + <li><a href="#not_held">not_held</a></li> + <li><a href="#rejected">rejected</a></li> + <li><a href="#successful">successful</a></li> + <li><a href="#partially_successful">partially_successful</a></li> + <li><a href="#internal_review">internal_review</a></li> + <li><a href="#error_message">error_message</a></li> + <li><a href="#requires_admin">requires_admin</a></li> + <li><a href="#user_withdrawn">user_withdrawn</a></li> + <li><a href="#awaiting_description">awaiting_description</a></li> +</ul> + + +<dl class="glossary"> + + <dt> + <a name="waiting_response">waiting_response</a> + </dt> + <dd> + Esperando a que la autoridad pública responda. + <ul> + <li>Estado inicial por defecto.</li> + <li>No se puede pasar a este estado desde internal_review.</li> + </ul> + </dd> + + <dt> + <a name="waiting_classification">waiting_classification</a> + </dt> + <dd> + Esperando la clasificación de una respuesta. + <ul> + <li>Estado por defecto tras recibir una respuesta.</li> + </ul> + </dd> + + <dt> + <a name="waiting_response_overdue">waiting_response_overdue</a> + </dt> + <dd> + Se ha esperado una respuesta durante demasiado tiempo. + <ul> + <li>Automático, si la fecha actual coincide con la fecha de la solicitud + festivos + 20 días.</li> + <li>Cuando un usuario actualiza/visita un elemento en este estado, se le da las gracias y se le indica cuánto tiempo debería tener que esperar.</li> + <li>Se alerta al usuario por correo cuando alguna solicitud se halla fuera de plazo.</li> + </ul> + </dd> + + <dt> + <a name="waiting_response_very_overdue">waiting_response_very_overdue</a> + </dt> + <dd> + Se ha esperado una respuesta durante muchísimo tiempo. + <ul> + <li>Automático, si la fecha actual coincide con la fecha de la solicitud + festivos + (60 días (para escuelas) o 40 días (todos los demás)).</li> + <li>Cuando un usuario actualiza/visita un elemento en este estado, se le sugiere que efectúe una reclamación, mostrando las acciones que puede emprender.</li> + <li>Se alerta al usuario por correo cuando alguna solicitud se halla en este estado.</li> + </ul> + </dd> + + <dt> + <a name="waiting_clarification">waiting_clarification</a> + </dt> + <dd> + La autoridad pública solicita una explicación sobre una parte de la solicitud. + <ul> + <li>Se envía una petición al usuario para que incluya información al respecto.</li> + <li>Si el usuario envía un mensaje saliente en una solicitud en este estado, esta pasa automáticamente al estado {{waiting_response}}.</li> + <li>Tres días más tarde de pasar a este estado, se envía un recordatorio al usuario para que actúe al respecto (suponiendo que el usuario no está bloqueado).</li> + <li>No es posible pasar a este estado desde internal_review.</li> + </ul> + </dd> + + <dt> + <a name="gone_postal">gone_postal</a> + </dt> + <dd> + La autoridad pública desea responder o ha respondido por correo postal. + <ul> + <li>Si está seleccionado este estado, se recuerda al usuario que en numerosos casos la autoridad debería responder por correo electrónico y se le anima a insistir.</li> + <li>Se proporciona la dirección de correo electrónico más reciente de la autoridad al usuario para que se solicite la comunicación postal por correo electrónico privado.</li> + <li>Se anima al usuario a actualizar la solicitud con una anotación en una fecha posterior.</li> + </ul> + </dd> + + <dt> + <a name="not_held">not_held</a> + </dt> + <dd> + La autoridad pública no dispone de la información solicitada. + <ul> + <li>Se sugiere al usuario que pruebe con una autoridad diferente o que efectúe una reclamación.</li> + </ul> + </dd> + + <dt> + <a name="rejected">rejected</a> + </dt> + <dd> + La solicitud ha sido rechazada por la autoridad pública. + <ul> + <li>Se muestra la página de posibles pasos a seguir.</li> + </ul> + </dd> + + + <dt> + <a name="successful">successful</a> + </dt> + <dd> + Se ha recibido toda la información solicitada. + <ul> + <li>Se sugiere que el usuario añada un comentario o haga una donación.</li> + </ul> + </dd> + + + <dt> + <a name="partially_successful">partially_successful</a> + </dt> + <dd> + Se ha recibido parte de la información solicitada. + <ul> + <li>Se sugiere al usuario que haga una donación y se ofrecen ideas sobre qué pasos seguir.</li> + </ul> + </dd> + + <dt> + <a name="internal_review">internal_review</a> + </dt> + <dd> + Esperando a que la autoridad pública complete una revisión interna de su gestión respecto a la solicitud. + <ul> + <li>Se indica al usuario que debería esperar una respuesta dentro de los primeros 20 días.</li> + <li>Cuando se envía un correo a la autoridad, se añade «Revisión interna de» en el asunto.</li> + <li>Se puede pasar a este estado desde el formulario de seguimiento.</li> + </ul> + </dd> + + <dt> + <a name="error_message">error_message</a> + </dt> + <dd> + Se ha recibido un mensaje de error, por ejemplo, un fallo de entrega. + <ul> + <li>Se da las gracias al usuario por informar sobre el tema y se sugiere el uso de un formulario para que proporcione una nueva dirección de correo de la autoridad, si este es el problema.</li> + <li>Se marca para revisión por parte de un administrador.</li> + </ul> + </dd> + + <dt> + <a name="requires_admin">requires_admin</a> + </dt> + <dd> + Una respuesta extraña que requiere atención por parte del equipo de WhatDoTheyKnow. + <ul> + <li>Un usuario se confunde y no sabe qué estado asignar para que intervenga un administrador.</li> + <li>Se redirige al usuario a un formulario para solicitar más información.</li> + <li>Se marca para revisión por parte de un administrador.</li> + </ul> + </dd> + + <dt> + <a name="user_withdrawn">user_withdrawn</a> + </dt> + <dd> + El solicitante ha abandonado la solicitud por algún motivo. + <ul> + <li>Se solicita al usuario que escriba un mensaje para avisar a la autoridad.</li> + </ul> + </dd> + + <dt> + <a name="awaiting_description">awaiting_description</a> + </dt> + <dd> + El awaiting_description no es realmente de un estado, sino de un distintivo que indica que no hay ningún estado. + </dd> + +</dl> + diff --git a/es/docs/customising/states_informatazyrtare.md b/es/docs/customising/states_informatazyrtare.md new file mode 100644 index 000000000..8a230371d --- /dev/null +++ b/es/docs/customising/states_informatazyrtare.md @@ -0,0 +1,87 @@ +--- +layout: es/page +title: Estados de solicitud (InformataZyrtare) +--- + +# Estados de solicitud: comparación de ejemplo + +<p class="lead"> + Esta página muestra las diferencias entre los estados utilizados en dos implementaciones + distintas de Alaveteli: una en Kosovo y otra en Reino Unido. Se trata de un ejemplo + práctico que muestra que es posible personalizar los estados que su sitio utiliza. +</p> + +Los estados des solicitud están definidos en el código de Alaveteli y le recomendamos +utilizarlos (siempre que concuerden con la <a href="{{ page.baseurl }}/docs/glossary/#foi" +class="glossary__link">ley de información pública</a> de su propia jurisdicción). + +## Ejemplo de InformataZyrtare.org (Kosovo) + +Las solicitudes realizadas en la implementación de Alaveteli de Kosovo, +[InformataZyrtare](http://informatazyrtare.org), utilizan unos estados ligeramente diferentes +a los utilizados en la implementación de Reino Unido, [WhatDoTheyKnow](http://www.whatdotheyknow.com) +(WDTK). + +En general estas diferencias se deben a que la legislación local o el modo en que funcionan +los grupos que gestionan los sitios son distintos y se hallan en distintos lugares. Alavateli +facilita los cambios permitiendo personalizar los estados que se utilizan. + +Este ejemplo muestra claramente que puede utilizar distintos estados dependiendo de sus +requisitos locales y el aspecto que pueden tener. Consulte la [personalización de los estados +de solicitud]({{ page.baseurl }}/docs/customising/themes/) para obtener detalles sobre cómo hacerlo. + +### Estados utilizados por InformataZyrtare, pero no por WDTK + + * <a href="#deadline_extended">deadline_extended</a> + * <a href="#partial_rejected">partial_rejected</a> + * <a href="#wrong_response">wrong_response</a> + +### Estados utilizados por WDTK, pero no por InformataZyrtare + + * <a href="{{ page.baseurl }}/docs/customising/states/#awaiting_description">awaiting_description</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#gone_postal">gone_postal</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#internal_review">internal_review</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#user_withdrawn">user_withdrawn</a> + * <a href="{{ page.baseurl }}/docs/customising/states/#waiting_response_very_overdue">waiting_response_very_overdue</a> + +Para obtener más información, consulte todos los [estados utilizados por WhatDoTheyKnow]({{ page.baseurl }}/docs/customising/states/). + + +--- + + + +### Detalles de los estados de InformataZytare + +Los estados no representados dentro de los [estados de WDTK]({{ page.baseurl }}/docs/customising/states/) +se describen aquí más detalladamente: + +<ul class="definitions"> + <li><a href="#deadline_extended">deadline_extended</a></li> + <li><a href="#partial_rejected">partial_rejected</a></li> + <li><a href="#wrong_response">wrong_response</a></li> +</ul> + +<dl class="glossary"> + <dt> + <a name="deadline_extended">deadline_extended</a> + </dt> + <dd> + La autoridad ha solicitado una extensión del tiempo disponible para responder. + </dd> + <dt> + <a name="partial_rejected">partial_rejected</a> + </dt> + <dd> + Solo se ha rechazado parte de la solicitud, pero la parte satisfactoria de la solicitud + no se ha adjuntado. + </dd> + <dt> + <a name="wrong_response">wrong_response</a> + </dt> + <dd> + La autoridad ha respondido, pero la respuesta no corresponde a la solicitud realizada. + </dd> + +</dl> + diff --git a/es/docs/customising/themes.md b/es/docs/customising/themes.md new file mode 100644 index 000000000..5327b31d8 --- /dev/null +++ b/es/docs/customising/themes.md @@ -0,0 +1,191 @@ +--- +layout: es/page +title: Temas +--- + +# Temas de Alaveteli + +<p class="lead"> + Alaveteli utiliza <strong>temas</strong> para que el sitio tenga un aspecto + y un funcionamiento distintos del predeterminado.. + Los cambios pequeños, como el color y el logotipo, son relativamente sencillos, pero los temas + también pueden controlar detalles más complejos, como el <em>comportamiento</em> del sitio. +</p> + +Al personalizar su sitio basado en Alaveteli, existen numerosos detalles que puede modificar +con tan solo editar los [ajustes de configuración]({{ page.baseurl }}/docs/customising/config/). +Pero si desea modificar el aspecto del sitio o añadir comportamientos más específicos, +necesitará elaborar un **tema**. + +No necesita ser programador para realizar pequeños cambios, pero necesitará tener la suficiente +confianza para copiar y modificar algunos archivos. Si no está seguro sobre este tema, +¡[pida ayuda](/community/)! + +## Qué le puede interesar cambiar + +El requisito más habitual es añadir una marca al sitio, por lo menos, +[insertar su propio logotipo](#modificar-el-logotipo) y su [esquema de colores](#modificar-el-esquema-de-colores). +Es posible que también desee modificar los distintos estados en los que puede +hallarse una solicitud. También querrá editar las categorías en las que los organismos públicos pueden +aparecer (por ejemplo, los grupos a mano izquierda de la página +«[View authorities](https://www.whatdotheyknow.com/body/list/all)» en +WhatDoTheyKnow). + +Es posible que desee personalizar otras opciones; escriba a la lista de correo de +desarrollo para comentar sus necesidades. ¡Seguimos trabajando para encontrar +el mejor método de llevar a cabo este tipo de modificaciones! + +En todo caso, el principio importante a tener en cuenta es que cuanto menos +sobrescriba y personalice el código, más sencillo será el mantenimiento de su +sitio a largo plazo. Toda personalización es posible, pero +para cada modificación más allá de los casos sencillos aquí documentados, +pregúntese (o pregunte a su cliente): «¿podemos vivir sin esto?». Si la +respuesta es «no», considere iniciar un debate sobre una forma +de implementar los cambios mediante un complemento en lugar de sobrescribir el código central. + +## Principios generales + +Intentamos encapsular todas las funcionalidades específicas del sitio en uno +de los siguientes lugares: + +* [Configuración]({{ page.baseurl }}/docs/customising/config/) del sitio + (por ejemplo, el nombre de su sitio, los idiomas + disponibles, etc., en `config/general.yml`). +* Datos (por ejemplo, los organismos públicos a lso que deben dirigirse las solicitudes). +* Un tema, instalado en `lib/themes`. + +Este documento trata sobre lo que puede hacer en un tema. + +Por defecto, el tema de muestra («alavetelitheme») ya está instalado. +Consulte la opción +[`THEME_URLS`]({{ page.baseurl }}/docs/customising/config/#theme_urls) +en `general.yml` para obtener información. + +También puede instalar el tema de muestra manualmente ejecutando: + + bundle exec rake themes:install + +El tema de muestra contiene ejemplos para prácticamente todo lo que pueda +interesarle personalizar. Probablemente le interese efectuar una copia, renombrarla +y utilizarla como base para su propio tema. + +## Asegúrese de que su tema es lo más ligero posible + +Cuanto más añade a su tema, más difícil resulta actualizarlo a versiones +futuras de Alaveteli. Toda la información que añade a su tema +sobrescribe detalles del tema central, así que, si elabora una nueva «plantilla +principal», los nuevos widgets que aparezcan en el tema principal no aparecerán +en su sitio web. + +Por tanto, debería considerar cómo puede adaptar el sitio a su marca sin +modificar el tema principal en exceso. Lo ideal sería que pudiese adaptar el +sitio modificando únicamente los estilos CSS. También necesitará añadir +páginas de ayuda personalizadas, como se describe a continuación. + +## Adaptar el sitio a su marca + +Las plantillas principales que comprenden la apariencia y la interfaz de usuario de un +sitio basado en Alaveteli se hallan en `app/views/` y utilizan la sintaxis ERB de Rails. +Por ejemplo, la plantilla para la página de inicio se encuentra en +`app/views/general/frontpage.html.erb` y la correspondiente a la página de información +del sitio, en `app/views/help/about.html.erb`. + +Evidentemente *podría* editar directamente estos archivos centrales, pero no sería una +buena idea, puedes cada vez le resultaría más difícil aplicar actualizaciones. +Dicho esto, a veces le interesará modificar las plantillas centrales de forma que +ofrezcan ventajas para todo el mundo, en cuyo caso, puede debatir los cambios en la +lista de correo, aplicarlos en una adaptación de Alaveteli y publicar una solicitud +de extracción (pull request). + +Sin embargo, normalmente debería sobrescribir estas páginas **en su propio +tema**, situándolas en la ubicación correspondiente dentro del directorio +`lib/` del tema. Es decir, se mostrará el archivo ubicado en +`lib/themes/alavetelitheme/lib/views/help/about.html.erb` en +lugar del archivo principal de información sobre el sitio. + +### Modificar el logotipo + +Alaveteli utiliza el [flujo de atributos](http://guides.rubyonrails.org/asset_pipeline.html) de Rails para convertir y comprimir las hojas de estilos escritas en +<a href="{{ page.baseurl }}/docs/glossary/#sass" class="glossary__link">Sass</a>, +la extensión del lenguaje CSS, en CSS minimizados y concatenados. Los atributos se almacenan en el núcleo de Alaveteli, en `app/assets`, como `fonts`, `images`, `javascripts` y `stylesheets`. +El tema predeterminado incluye los directorios de atributos correspondientes en `alavetelitheme/assets`. Los archivos añadidos a estos directorios tendrán prioridad sobre los ubicados en los directorios centrales. Al igual que con las plantillas, aparecerá el archivo `lib/themes/alavetelitheme/assets/images/logo.png` en el sitio en lugar del logotipo `app/assets/images/logo.png`. + +### Modificar el esquema de colores + +Alaveteli utiliza un conjunto básico de módulos de +<a href="{{ page.baseurl }}/docs/glossary/#sass" class="glossary__link">Sass</a> +para definir la apariencia del sitio en dispositivos de distintos tamaños, así como algunos estilos básicos. Estos módulos se hallan en `app/assets/stylesheets/responsive`. Los colores y fuentes se añaden en el tema, alavetelitheme los define en `lib/themes/alavetelitheme/assets/stylesheets/responsive/custom.scss`. Los colores utilizados en el tema se definen como variables en la parte superior de este archivo, donde pueden editarse. + +### Modificar otros detalles de estilo + +Para modificar otras opciones de estilo, puede añadir o editar los estilos en `lib/themes/alavetelitheme/assets/stylesheets/responsive/custom.scss`. Los estilos definidos aquí tendrán prioridad sobre los ubicados en los módulos Sass, en `app/assets/stylesheets/responsive`, pues serán importados en último lugar por `app/assets/stylesheets/responsive/all.scss`. Sin embargo, si desea modificar significativamente el modo en que se muestra una parte concreta del sitio, puede interesarle sobrescribir uno de los módulos principales Sass. Puede sobrescribir la apariencia de la página de inicio, por ejemplo copiando `app/assets/stylesheets/responsive/_frontpage_layout.scss` a `lib/themes/alavetelitheme/assets/stylesheets/responsive/_frontpage_layout.scss` y editándolo después. + +Puede cargar hojas de estilos y archivos javascript adicionales añadiéndolos a `lib/themes/alavetelitheme/lib/views/general/_before_head_end.html.erb`. + +## Añadir sus propias categorías de organismos públicos + +En Alaveteli las categorías se implementan utilizando etiquetas. Pueden utilizarse +etiquetas específicas para agrupar autoridades en categorías. Las categorías +se agrupan a su vez bajo encabezados de categoría en el margen de la página +de visualización de autoridades, «View authorities». Puede crear, editar y reorganizar +categorías y encabezados de categoría desde la interfaz de administración, en el +elemento «Categories» del menú. Puede aplicar las etiquetas de categoría creadas +a las autoridades en el elemento «Authorities» del menú de administración. Para que +una autoridad aparezca dentro de una categoría, la etiqueta de dicha categoría debe +ser una de las aplicadas a la autoridad en cuestión. + +## Personalizar los estados de solicitud + +Como ya se ha mencionado, si puede vivir con los +[estados de solicitud predeterminados de Alaveteli]({{ page.baseurl }}/docs/customising/states/), +es buena idea hacerlo. Tenga en cuenta que puede definir tras cuántos días se considera +que una solicitud está «fuera de plazo» en el archivo de configuración principal del sitio: consulte +[`REPLY_LATE_AFTER_DAYS`]({{ page.baseurl }}/docs/customising/config/#reply_late_after_days). + +Si no puede vivir con los estados tal y como están, existe un método muy básico para añadir otros +(que se irá mejorando con el tiempo). Actualmente no existe una forma sencilla de eliminar +un estado. Hay un ejemplo sobre cómo llevar a cabo estos cambios en el tema `alavetelitheme`. + +Para añadir estados, cree dos módulos en su tema, +`InfoRequestCustomStates` y `RequestControllerCustomStates`. El primero +debe contener estos métodos: + +* `theme_calculate_status`: devuelve una etiqueta para identificar el estado actual de la solicitud. +* `theme_extra_states`: devuelve una lista de etiquetas para identificar los estados adicionales que desea soportar. +* `theme_display_status`: devuelve cadenas de texto legibles por humanos correspondientes a dichas etiquetas. + +El segundo debe contener el siguietne método: + +* `theme_describe_state`: devuelve un aviso para el usuario correspondiente + tras haber clasificado una solicitud y lo redirige a la página siguiente correspondiente. + +Una vez añadidos los estados adicionales, necesitará crear los siguientes archivos en su tema: + +* `lib/views/general/_custom_state_descriptions.html.erb`: descripciones sobre + sus nuevos estados, adecuadas para mostrar a usuarios finales. +* `lib/views/general/_custom_state_transitions_complete.html.erb`: + descripciones de estados nuevos que desee caracterizar como estados de + «completación», para mostrar en el formulario de clasificación que requerimos + que rellenen los solicitantes. +* `lib/views/general/_custom_state_transitions_pending.html.erb`: igual que el + anterior, pero para estados nuevos que desee caracterizar como estados «pendientes». + +Puede consultar ejemplos de estas personalizaciones en +[este commit](https://github.com/sebbacon/informatazyrtare-theme/commit/2b240491237bd72415990399904361ce9bfa431d) +para la versión de Kosovo de Alaveteli, Informata Zyrtare (ignore el +archivo `lib/views/general/_custom_state_transitions.html.erb`, no se utiliza). + +## Añadir nuevas páginas en la navegación + +`alavetelitheme/lib/config/custom-routes.rb` le permite extender las rutas básicas de +Alaveteli. El ejemplo de `alavetelitheme` añade una página de ayuda adicional. +También peude utilizar esta función para sobrescribir el comportamiento de páginas +especificas, si es necesario. + +## Añadir o sobrescribir modelos o controladores + +Si necesita añadir o extender el comportamiento de Alaveteli a nivel de modelo o controlador, consulte `alavetelitheme/lib/controller_patches.rb` y `alavetelitheme/lib/model_patches.rb` para obtener algunos ejemplos. + +## Trabajar con temas + +Puede utilizar [`script/switch-theme.rb`](https://github.com/mysociety/alaveteli/blob/master/script/switch-theme.rb) para definir el tema actual, si está trabajando con múltiples temas. Esta opción puede resultar útil para cambiar entre el tema predeterminado `alavetelitheme` y uno de su propia adaptación. diff --git a/es/docs/customising/translation.md b/es/docs/customising/translation.md new file mode 100644 index 000000000..f806181c8 --- /dev/null +++ b/es/docs/customising/translation.md @@ -0,0 +1,172 @@ +--- +layout: es/page +title: Traducción +--- + +# Traducción de Alaveteli + +<p class="lead"> + Hemos diseñado Alaveteli para ser utilizado en numerosas jurisdicciones + diferentes de todo el mundo. Si aún no soporta el idioma que necesita, puede + ayudar a traducirlo. Esta página explica cómo. +</p> + +## ¡Alaveteli ya incluye traducciones! + +Alaveteli incluye varias versiones en distintos idiomas listas para su uso. +Si Alaveteli ya se ha traducido al idioma (o idiomas) que necesita, solo +deberá configurarlo: consulte +[`AVAILABLE_LOCALES`]({{ page.baseurl }}/docs/customising/config/#available_locales). + +[Consulte el directorio `locale/`](https://github.com/mysociety/alaveteli/tree/master/locale) +para ver qué traducciones hay actualmente disponibles. Algunas son traducciones completas del +sitio, mientras que otras son parciales, bien porque las traducciones aún no se han finalizado, +o bien porque los traductores no han actualizado los textos desde la última vez que los +desarrolladores añadieron texto al sitio. + +Existen dos motivos por los que la traducción puede necesitar más trabajo antes de poder utilizarse: + +* **El idioma que desea no es uno de los que ya tenemos** <br> En este caso + no habrá ninguna entrada en ``locale/`` para este idioma porque Alaveteli aún + no ha sido traducido a su idioma por nadie. Consulte el resto de esta + página para averiguar cómo añadir una nueva traducción. + +* **La traducción a su idioma está incompleta o atrasada** <br> + Este estado puede deberse simplemente a que es una tarea en proceso. Además, a veces + una traducción incompleta ya cubre todas las áreas del sitio que necesita. + Por supuesto, puede añadir contenido a una traducción parcial, pero es una buena idea + consultarnos primero, ya que seguramente sabremos quién está trabajando en la traducción + actual y el estado de dicha traducción. + +Los traductores son miembros de la +[comunidad]({{ page.baseurl }}/community/) de Alaveteli y a menudo trabajan con +independencia de los desarrolladores. Por tanto, las traducciones pueden retrasarse +bastante respecto al código. Sin embargo, nuestro proceso de actualización incluye +una «detección de la traducción», que ofrece a los traductores la oportunidad de +ponerse al día. Consulte el resto de esta página para obtener más información. + +## Traducciones de Alaveteli + +No necesita ser programador para traducir Alaveteli, pues utilizamos un sitio web +externo llamado Transifex para ayudar en la gestión de las traducciones. Así se facilita +el trabajo de los traductores, pero significa que su equipo técnico necesitará realizar +cierto trabajo adicional para incluir las traducciones resultantes de vuelta en +Alaveteli, una vez se hallen disponibles. + +El proyecto Transifex se halla en +[https://www.transifex.net/projects/p/alaveteli](https://www.transifex.net/projects/p/alaveteli). +Probablemente le interese crear una cuenta (pregunte en la lista de correo). Esta plataforma ofrece una +interfaz de uso sencillo para contribuir en las traducciones. + +Alaveteli localiza cadenas de texto mediante el uso de gettext de GNU y +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivos <code>.pot</code> y <code>.po</code></a>. +Si es un desarrollador, debería consultar la +[internacionalización de Alaveteli]({{ page.baseurl }}/docs/developers/i18n/). + + +## Qué necesita hacer un traductor + +**Si solamente está trabajando en la traducción de Alaveteli a un idioma que conoce, +esta es la sección que debe consultar.** + +> Recuerde que Alaveteli +> [ya incluye algunas traducciones](#alaveteli-ya-incluye-traducciones), +> por lo que se recomienda que compruebe primero si realmente necesita efectuar la traducción. +> ¡Tal vez alguien haya traducido ya Alaveteli al idioma que necesita! + +Cuando un desarrollador añade una nueva funcionalidad a la interfaz de usuario de Alaveteli, +utiliza cierto código para destacar las frases o palabras (cadenas de texto o «strings») +que considera que deben traducirse. + +Cuando el +<a href="{{ page.baseurl }}/docs/glossary/#release" class="glossary__link">gestor de actualizaciones</a> +de Alaveteli planee una nueva actualización, cargará una plantilla que contenga todas las +cadenas de texto que deben traducirse (conocida como +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivo <code>.pot</code></a>) +en Transifex. Así sus propias traducciones en Transifex se actualizarán con las últimas +cadenas de texto. + +Al visitar Transifex, la plataforma le invitará a rellenar los valores para todas las +cadenas de texto nuevas o modificadas. Cuando una cadena haya sido ligeramente modificada, +por ejemplo, solamente en la puntuación (de «Hello» a «Hello!»), Transifex +sugerirá una traducción adecuada (busque la pestaña de sugerencias, *Suggestions*, +debajo de la cadena de texto original). + +Para que esta característica funcione correctamente, el gestor de actualizaciones debe +descargar sus traducciones, ejecutar un programa que inserta las sugerencias y después +cargarlas de nuevo. Por tanto, cuando se anuncie una nueva actualización candidata, asegúrese de +haber cargado todas las traducciones pertinentes o las perderá. + +Cuando se informa de una nueva actualización, se entra en un periodo de **detención de la traducción**: +durante este periodo los desarrolladores no deben añadir ninguna cadena de texto nueva al software, así +que puede confiar en que está traduciendo todo lo que habrá en la versión final. + +El gestor de actualizaciones también le indicará la **fecha límite de traducción**. Después de esta fecha +puede continuar contribuyendo en nuevas traducciones, pero ya no se incluirán en la versión actual. + + +### Notas generales sobre la traducción en Transifex + +Algunas cadenas tendrán comentarios adjuntos a ellas introducidos por los desarrolladores de +Alaveteli sobre el contexto donde aparece el texto dentro de la aplicación. Estos comentarios +aparecen en la pestaña de detalles *Details* del texto en Transifex. + +Algunas cadenas incluirán **placeholders** (marcadores de contenido) para indicar que Alaveteli +insertará algo de texto por sí mismo cuando las muestre. Estarán rodeados de +llaves dobles y tendrán este aspecto: + +<code> + some text with a {{placeholder}} in it +</code> + +En estas cadenas no deberá traducir estos elementos. Necesitan mantenerse +exactamente del mismo modo en que se presentan para que el texto pueda insertarse +correctamente: + +<code> + algo de texto con un {{placeholder}} en él +</code> + +Análogamente, algunas cadenas pueden contener pequeños fragmentos de código HTML, que se +mostrarán entre corchetes angulares (es probable que indiquen que el texto es un enlace o que +necesita un formato especial). Por ejemplo: + +<code> + please <a href=\"{{url}}\">send it to us</a> +</code> + +Del mismo modo, no deberá editar estos fragmentos entre corchetes. Manténgalos en la +traducción y edite solamente el texto a su alrededor. Así, el ejemplo se convertiría en: + +<code> + por favor <a href=\"{{url}}\">envíenoslo</a> +</code> + +Algunas cadenas de texto se hallan en forma de dos porciones de texto separadas por una barra vertical +(`|`), por ejemplo: `IncomingMessage|Subject`. Esta barra representa nombres de atributos, de forma que +`IncomingMessage|Subject` es el atributo correspondiente al asunto («Subject») de un mensaje entrante («IncomingMessage») +en el sitio. No priorice estos tipos de texto al traducir, pues actualmente no aparecen en +ningún lugar del sitio y, al hacerlo, solo se utilizan dentro de la interfaz de administración. Si los traduce, +solo debe modificar el texto situado *después* de las barras `|`. + + +## Cómo se incorporan las traducciones en Alaveteli + +Para incorporar las cadenas te texto traducidas de Transifex en Alaveteli, siga las +instrucciones indicadas en estas [notas de implementación]({{ page.baseurl }}/docs/developers/i18n/#notas-de-implementacin). +Este trabajo corresponde al departamento técnico de su equipo (o incluso al +gestor de actualizaciones de mySociety). Si los traductores no disponen de conocimientos técnicos, +pueden utilizar Transifex sin preocuparse por este tema. + + +## Desarrolladores e internacionalización + +Si está escribiendo código nuevo para Alaveteli, es un desarrollador +y necesita entender cómo generar el texto para facilitar el trabajo de los +traductores. Consulte la página sobre la +[internacionalización de Alaveteli]({{ page.baseurl }}/docs/developers/i18n/). + +Si es un desarrollador o traductor que está trabajando activamente en la internacionalización +del código de Alaveteli, debería hablar con nosotros para averiguar cuándo está programada la +próxima actualización, con el objetivo de preparar sus traducciones a tiempo para que se incluyan en ella. + diff --git a/es/docs/developers/api.md b/es/docs/developers/api.md new file mode 100644 index 000000000..dd4d66ac9 --- /dev/null +++ b/es/docs/developers/api.md @@ -0,0 +1,87 @@ +--- +layout: es/page +title: API +--- + +# API de Alaveteli + +<p class="lead"> + Existen dos partes del API para acceder a datos o insertarlos programáticamente: el API de lectura y el API de escritura. +</p> + +## API de lectura + +Se proporciona a través de las versiones JSON de la mayoría de las entidades del sistema, así como mediante +fuentes de difusión Atom para las entidades de listados: + +### Fuentes de difusión Atom + +Hay fuentes Atom en la mayoría de páginas que incluyen listados de solicitudes de información pública, +que pueden utilizarse para recibir actualizaciones y enlaces en formato XML. Puede encontrar la URL de la fuente Atom de +las siguientes maneras: + +* Busque los enlaces de la fuente RSS. +* Examine la etiqueta `<link rel="alternate" type="application/atom+xml">` en el encabezado del código HTML. +* Añada `/feed` al inicio de otra URL. + +Incluso las solicitudes complejas de búsqueda cuentan con fuentes Atom. Puede utilizarlas de múltiples maneras, +por ejemplo, para realizar búsquedas por autoridad, por tipo de archivo, por intervalo de fechas o por estado. +Consulte los consejos de búsqueda avanzada para obtener más información. + +### Datos JSON estructurados + +Hay unas cuantas páginas con versiones JSON, que permiten descargar información sobre +objetos de forma estructurada. Puede encontrarlas de los siguientes modos: + +* Añada `.json` al final de la URL. +* Busque la etiqueta `<link rel="alternate" type="application/json">` en el encabezado del código HTML. + +Los usuarios, autoridades y solicitudes disponen de versiones JSON que contienen información +básica sobre ellos. Cada fuente Atom tiene su equivalente en JSON, que incluye información +sobre el listado de eventos de la fuente. + +### Iniciar nuevas solicitudes programáticamente + +Para animar a los usuarios a crear enlaces hacia una autoridad pública en particular, utilice direcciones URL +con el formato `http://<susitio>/new/<nombre_url_organismopublico>`. Estos son los +parámetros que puede añadir a estas URL, ya sea propiamente en la URL o a partir de un formulario: + +* `title`: resumen por defecto de la nueva solicitud. +* `default_letter`: texto por defecto del cuerpo de la carta. El saludo y la firma locales lo rodean. +* `body`: constituye una alternativa a `default_letter` y permite editar el texto completo de la solicitud, permitiendo modificar el saludo y la firma. +* `tags`: lista de etiquetas separada por espacios que permite encontrar y enlazar cualquier solicitud realizada posteriormente, por ejemplo `openlylocal spending_id:12345`. El símbolo `:` indica que se trata de una etiqueta de máquina. Los valores de las etiquetas de máquina también pueden incluir puntos, útiles para identificadores URI. + +## API de escritura + +El API de escritura está diseñada para ser utilizada por organismos públicos al crear sus propias +solicitudes en el sistema. Actualmente se utiliza en el software de [registro de información +pública](https://github.com/mysociety/foi-register) de mySociety para soportar el uso de +Alaveteli como registro de divulgación para toda actividad de información pública procedente de +un organismo público en concreto. + +Todas las solicitudes deben incluir una clave del API como una variable `k`. Esta clave puede visualizarse +en cada una de las páginas de la autoridad desde la interfaz de administración. Otras variables deben +enviarse como se indica a continuación: + +* `/api/v2/request`: ENVÍA los siguientes datos json como una variable de tipo formulario `json` para crear una nueva solicitud: + * `title`: título de la solicitud. + * `body`: cuerpo de la solicitud. + * `external_user_name`: nombre de la persona que ha originado la solicitud. + * `external_url`: URL donde puede encontrarse una copia canónica de la solicitud + Devuelve contenido JSON con una `url` para la nueva solicitud junto con su `id`. +* `/api/v2/request/<id>.json`: RECIBE toda la información sobre una solicitud. +* `/api/v2/request/<id>.json`: ENVÍA correspondencia adicional respecto a una solicitud: + * Como variable de tipo formulario `json`: + * `direction`: `request` (solicitud procedente del usuario, por ejemplo, como seguimiento, recordatorio, etc.) o `response` (respuesta procedente de la autoridad). + * `body`: mensaje. + * `state`: opcional, permite que la autoridad incluya un valor de estado `state` de solicitud al enviar una actualización. Valores permitidos: `waiting_response` (esperando respuesta), `rejected` (rechazada), `successful` (satisfactoria) y `partially_successful` (parcialmente satisfactoria). Solo se utiliza en dirección `response` (respuesta). + * `sent_at`: hora en la que se ha enviado la correspondencia en formato ISO-8601. + * (Opcionalmente) la variable `attachments` (adjuntos) como `multipart/form-data`: + * Elementos adjuntos en la correspondencia. Solo pueden adjuntarse en mensajes en dirección `response` (respuesta). +* `/api/v2/request/<id>/update.json`: ENVÍA un nuevo estado para la solicitud: + * Como variable de tipo formulario `json`: + * `state`: estimación por parte del usuario del `state` (estado) de una solicitud que ha recibido una respuesta de la autoridad. Valores permitidos: `waiting_response` (esperando respuesta), `rejected` (rechazada), `successful` (satisfactoria) y `partially_successful` (parcialmente satisfactoria). Solo debería utilizarse para comentarios por parte del usuario; si una autoridad desea actualizar el estado `state`, debe utilizar `/api/v2/request/<id>.json` en su lugar. + + + + diff --git a/es/docs/developers/directory_structure.md b/es/docs/developers/directory_structure.md new file mode 100644 index 000000000..cd8ac358c --- /dev/null +++ b/es/docs/developers/directory_structure.md @@ -0,0 +1,216 @@ +--- +layout: es/page +title: Estructura de directorios +--- + + +# Estructura de directorios de Alaveteli + +<p class="lead">Esta página ofrece una vista general sobre dónde encontrar distintos datos en +los directorios de Alaveteli.</p> + +Si solo está instalando Alaveteli, **probablemente nunca necesite preocuparse de esto**; +es bastante más práctico cuando un desarrollador planea llevar a cabo cambios más +significativos en el código. No necesita estar familiarizado con +Ruby para realizar la instalación o aplicar [modificaciones básicas en +ella]({{ page.baseurl }}/docs/customising/). + +<!-- (y en caso de hacerlo, +recuerde consultar la página sobre [cómo comentar los cambios realizados]({{ page.baseurl }}/feeding-back)).--> + +Alaveteli utiliza Ruby on Rails, una infraestructura web de tipo «modelo-vista-controlador» común; +si está familiarizado con Rails, ya conocerá estos detalles. Para obtener más información +sobre la estructura de Rails, consulte el [sitio web de Ruby on Rails](http://guides.rubyonrails.org/getting_started.html). + +## Directorios principales y funciones de cada uno de ellos + +<dl class="dir-structure"> + <dt> + app + </dt> + <dd> + <p><em>núcleo del código de aplicación de Alaveteli</em></p> + <dl> + <dt> + assets + </dt> + <dd> + <em>recursos estáticos que requieren una compilación previa para poder dar servicio</em> + <dl> + <dt> + fonts + </dt> + <dt> + images + </dt> + <dt> + javascripts + </dt> + <dt class="last"> + stylesheets + </dt> + <dd class="last"> + <p><em>hojas de estilo en formato CSS o <a href="http://sass-lang.com/">SCSS</a></em></p> + <p>Las hojas de estilo SCSS se compilan como CSS.</p> + </dd> + </dl> + </dd> + <dt> + controllers + </dt> + <dt> + helpers + </dt> + <dt> + mailers + </dt> + <dt> + models + </dt> + <dt class="last"> + views + </dt> + </dl> + </dd> + <dt>cache + </dt> + <dd><p><em>archivos temporales de descarga, datos adjuntos y plantillas</em></p> + </dd> + <dt> + commonlib + </dt> + <dd> + <p><em>librería de funciones comunes de mySociety</em></p> + <p> + Mantenemos una <a href="https://github.com/mysociety/commonlib">librería + común</a>, que utilizamos en muchos de nuestros proyectos (no solo en + Alaveteli). Está implementada como un <a + href="http://git-scm.com/book/en/Git-Tools-Submodules">submódulo de git</a> + para que Alaveteli la contenga aunque el código sea independiente. Normalmente no + es necesario tener nada de esto en cuenta (ya que git lo gestiona automáticamente), + pero si realmente <em>necesita</em> cambiar algo al respecto, tenga en cuenta que + se trata de un repositorio independiente. + </p> + </dd> + <dt> + config + </dt> + <dd> + <p><em>archivos de configuración</em></p> + <p> + El archivo primario de configuración es <code>general.yml</code>. Este archivo no se halla en el + repositorio de git (ya que contendrá información específica de su instalación, incluida la + contraseña de la base de datos), pero hay archivos de ejemplo. + </p> + </dd> + <dt> + db + </dt> + <dd> + <p><em>archivos de base de datos</em></p> + <dl> + <dt class="last"> + migrate + </dt> + <dd class="last"> + Migración de Rails (actualización del esquema de la base de datos hacia arriba + o abajo a medida que se desarrolla el código). + </dd> + </dl> + </dd> + <dt> + doc + </dt> + <dd> + <p><em>documentación</em></p> + <p> + Se trata de información técnica adicional añadida a la <a + href="{{ page.baseurl }}/docs/">documentación principal</a> (la que + está leyendo actualmente), que se almacena en el repositorio de git, + en la rama <code>gh-pages</code> y se publica como páginas de GitHub. + </p> + </dd> + <dt> + lib + </dt> + <dd> + <p><em>librerías personalizadas</em></p> + <dl> + <dt> + tasks + </dt> + <dd>Tareas de <a href="http://guides.rubyonrails.org/command_line.html#rake">Rake</a>. + </dd> + <dt class="last"> + themes + </dt> + <dd class="last">Aquí vive su tema de Alaveteli. + </dd> + </dl> + </dd> + <dt> + locale + </dt> + <dd> + <p><em>traducciones (internacionalización/i18n)</em></p> + <p> + Las cadenas de texto de traducción se almacenan en archivos <code>.po</code> dentro de directorios específicos para + la localización y codificación. Por ejemplo, <code>es/</code> contiene las traducciones para el sitio en español. + </p> + </dd> + <dt> + log + </dt> + <dd> + <p><em>archivos de registro de aplicación</em></p> + </dd> + <dt> + public + </dt> + <dd> <p><em>archivos estáticos que pueden dar servicio directamente</em></p> + </dd> + <dt> + script + </dt> + <dd> + <p><em>shell scripts para el servidor</em></p> + <p> + Por ejemplo, <code>alert-overdue-requests</code> ejecuta el script + que encuentra solicitudes que han superado el límite de tiempo y las envía por + correo electrónico. + </p> + </dd> + <dt> + spec + </dt> + <dd> + <p><em>pruebas</em></p> + <p> + El entorno de pruebas de Alaveteli funciona con <a href="http://rspec.info/">rspec</a>. + </p> + </dd> + <dt> + tmp + </dt> + <dd> + <p> + <em>archivos temporales</em> + </p> + </dd> + <dt class="last"> + vendor + </dt> + <dd class="last"> + <p><em>software de terceros</em></p> + <dl> + <dt class="last">bundle</dt> + <dd class="last"> + <p> + <em>paquete de gems necesario para ejecutar Alaveteli</em> + </p> + </dd> + </dl> + </dd> +</dl> + +Hemos omitido algunos subdirectorios menos importantes para mantener la claridad. diff --git a/es/docs/developers/i18n.md b/es/docs/developers/i18n.md new file mode 100644 index 000000000..5110959fc --- /dev/null +++ b/es/docs/developers/i18n.md @@ -0,0 +1,176 @@ +--- +layout: es/page +title: Internacionalización (para desarrolladores) +--- + +# Internacionalización en el código + +<p class="lead"> + Esta página describe algunos aspectos técnicos de la internacionalización del + código de Alaveteli. Está principalmente dirigida a desarrolladores que están trabajando + en la base del código; si tan solo desea traducir Alaveteli a su idioma, consulte la + <a href="{{ page.baseurl }}/docs/customising/translation">traducción de Alaveteli</a> + en su lugar. +</p> + +## Notas de implementación + +Las traducciones implementadas para el proyecto se hallan en ``locale/``. + +Recomendamos que las traducciones se lleven a cabo en +[Transifex](https://www.transifex.net/projects/p/alaveteli/), +debido a que los traductores pueden trabajar a través de su interfaz gráfica en lugar de tener que editar +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivos `.po` y `.pot`</a> +directamente. Básicamente, Transifex tan solo captura el trabajo de los traductores y lo convierte +en los archivos que Alaveteli necesita (mediante el uso de gettext). + +### Cómo obtener las últimas traducciones en su sitio web + +Por ejemplo, para implementar traducciones en inglés y español a la vez: + + * Asegúrese de que los archivos `.po` correspondientes se hallan en ```locale/en/app.po``` y ```locale/es/app.po``` + (por ejemplo, descargándolos desde Transifex). + * Asigne a <code><a href="{{ page.baseurl }}/docs/customising/config/#available_locales">AVAILABLE_LOCALES</a></code> + el valor <code>en es</code>. + +### Qué hacer si no dispone de las traducciones completas para una versión anterior de Alaveteli + +Antes de elaborar una nueva versión de Alaveteli los archivos de traducción se +extraen de Transifex y se añaden al directorio ``locale/`` de Alaveteli en +github, donde se hallan las traducciones más completas para la versión anterior. +Después los archivos ubicados en Transifex se actualizan con las nuevas cadenas de texto +que necesitan ser traducidas para la nueva actualización. En este punto también se eliminan las cadenas de texto +anteriores que ya no se utilizan en la nueva versión. La última +[etiqueta de versión](https://github.com/mysociety/alaveteli/releases) +para una actualización en github debería contener las traducciones más completas procedentes de Transifex para dicha +versión. + +Si utiliza una versión antigua de Alaveteli y desea añadir o modificar las traducciones, +puede editar los archivos .po directamente utilizando un programa local, como +[PoEdit](http://poedit.net/). + +### Cómo añadir nuevas cadenas de texto a la traducción + +Necesita hacer esto en caso de que haya añadido al código nuevas cadenas de texto que necesiten traducirse +(o si ha modificado alguna cadena ya existente). + +Para actualizar los +<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivos `.po` o `.pot`</a> +para cada idioma, ejecute el comando: + + bundle exec rake gettext:store_model_attributes + +seguido del comando: + + bundle exec rake gettext:find + +Si `gettext:find` solo crea el archivo `locale/im-config.pot`, necesitará aplicar +la acción unset a la variable de entorno `TEXTDOMAIN` e intentarlo de nuevo. + +Para obtener más información sobre las traducciones, consulte la página de +[traducción de Alaveteli]({{ page.baseurl }}/docs/customising/translation/). + + +## Detalles de implementación técnica + +### Obtener la localización actual + +Este es un tema complejo debido a que existen dos métodos rivales para definir una +combinación de localización y territorio. El método mediante POSIX (y gettext y Transifex) es +de tipo `en_GB` y el método mediante Rails, de tipo `en-US`. Debido a que utilizamos gettext y +Transifex para las traducciones, debemos lidiar con ambos. + + * Para la versión de localización de Rails seleccionada actualmente, utilice `I18n.locale`. + * Para la versión de localización de POSIX, utilice `FastGettext.locale`. + +## I18n en plantillas + +Antes de añadir cadenas de texto i18n a la fuente, debería leer las +[guías de internacionalización](http://mysociety.github.io/internationalization.html) +que se aplican en todos nuestros proyectos. + +Algunos consejos para añadir cadenas de texto al código de Alaveteli: + +* Cadenas simples: ```<% = _("String to translate") %>``` +* Cadenas que incluyen variables: ayude al traductor mediante la inserción de cadenas + que puedan ser interpoladas, de forma que la variable tenga un significado. Por ejemplo, + ```<%= "Nothing found for '" + h(@query) + "'" %>``` puede convertirse en ```<%= + _("Nothing found for '{{search_terms}}'", :search_terms => h(@query)) %>``` +* Cadenas que incluyen números: ```<%= n_('%d request', '%d requests', @quantity) % @quantity %>``` +* Permitimos algo de código HTML entre líneas cuando proporciona un contexto con significado, por ejemplo: + +``` +_('<a href="{{browse_url}}">Browse all</a> or <a href="{{add_url}}">ask us to add it</a>.', + :browse_url => @browse_url, :add_url => @add_url) +``` + +Pueden aplicarse normas similares a cadenas de texto en el código fuente en Ruby. + +## Acceso programático a entidades PublicBody traducidas + +Además de las plantillas, la única área adicional de i18n actualmente implementada es la de entidades +PublicBody. + +La implementación permite obtener distintas localizaciones de una entidad PublicBody, como: + +```ruby + PublicBody.with_locale("es") do + puts PublicBody.find(230).name + end +``` + +Normalmente este es todo el código que necesita conocer. Existe un método +```self.locale_from_params()```, disponible en todos los modelos, que devuelve una localización +especificada como ```locale=xx``` en la cadena de búsqueda y que retorna a la localización +por defecto, que puede utilizar en conjunto con el método ```with_locale``` +superior. Todas las uniones en las tablas internas de traducción deberían ser gestionadas +normalmente de forma automática, pero existen algunas excepciones, indicadas a continuación. + +### Sobrescribir los mutadores de campos del modelo + +Internamente utilizamos el [complemento Globalize](https://github.com/globalize/globalize) +para localizar campos del modelo. Cuando la columna «foo» ha sido marcada en el modelo como +```:translates```, Globalize sobrescribe ```foo.baz = 12``` para establecer el valor en la columna +```baz``` de la tabla ```foo_translations```. + +Uno de los efectos secundarios de la forma en que esta tarea se lleva a cabo consiste en que, si +desea sobrescribir un mutador de atributo específico, necesitará llamar explícitamente a la maquinaria +de Globalize, más o menos de esta manera: + +```ruby + def name=(name) + globalize.write(self.class.locale || I18n.locale, "name", name) + self["name"] = short_name + # your other stuff here + end +``` + +### Búsqueda + +Los métodos mágicos ```find_first_by_<attr>``` y ```find_all_by_<attr>``` +deberían funcionar. Si desea realizar una búsqueda más programática, necesita unir +la tabla de traducción, por ejemplo: + +```ruby + query = "#{translated_attr_name(someattr) = ? AND #{translated_attr_name('locale')} IN (?)" + locales = Globalize.fallbacks(locale || I18n.locale).map(&:to_s) + find( + :first, + :joins => :translations, + :conditions => [query, value, locales], + :readonly => false + ) +``` + +Es posible que también necesite efectuar algunas uniones o condiciones SQL de bajo nivel. Consulte +```PublicBodyController.list``` para ver un ejemplo de una consulta con una condición explícitamente +dependiente de la localización (busque la variable ```locale_condition```) + +## Traducción y actualizaciones + +El gestor de actualizaciones forzará una detención de la traducción justo antes de que se finalice una nueva +versión. Durante este tiempo, si su trabajo está programado para ser incluido en dicha versión, +no debe introducir nuevas cadenas en el código. Esta detención ofrece a los traductores el tiempo necesario +para completar y revisar sus traducciones respecto a todas las cadenas de texto conocidas. +Consulte más información sobre la [traducción de Alaveteli]({{ page.baseurl }}/docs/customising/translation/). + diff --git a/es/docs/developers/index.md b/es/docs/developers/index.md new file mode 100644 index 000000000..3b7b0eee1 --- /dev/null +++ b/es/docs/developers/index.md @@ -0,0 +1,80 @@ +--- +layout: es/page +title: Para desarrolladores +--- + +# Información para desarrolladores + +<p class="lead"> + Alaveteli es un proyecto de código abierto. Los desarrolladores a tiempo completo de mySociety junto con desarrolladores de todo el mundo contribuyen de forma activa en la base del código. Estos enlaces y notas le ayudarán si también desea ayudar. +</p> + +* El software está escrito en **Ruby on Rails 3.x**. Soportamos postgresql como + sistema gestor de base de datos. Se necesita un agente de transferencia de correo (MTA) + configurado, como exim, para analizar los correos recibidos. Disponemos de servidores de + producción implementados en Debian (Squeeze y Wheezy) y en Ubuntu (12.04 LTS). Por motivos + de rendimiento, recomendamos el uso de [Varnish](https://www.varnish-cache.org). + +* Para ayudarle a entender qué hace el código, le recomendamos que lea esta [vista general + de alto nivel]({{ page.baseurl }}/docs/developers/overview/), que incluye un esquema de + los modelos y las relaciones entre ellos. + +* Consulte la [documentación del API]({{ page.baseurl }}/docs/developers/api/) para averiguar + cómo extraer e introducir datos en Alaveteli. + +* Si necesita modificar o añadir cadenas de texto en la interfaz, consulte nuestras [guías + de internacionalización](http://mysociety.github.io/internationalization.html), + donde encontrará notas sobre nuestro uso de `gettext`. + +* Utilizamos el [modelo de ramas de flujo + de git](http://nvie.com/posts/a-successful-git-branching-model/) con un pequeño cambio: + actualmente nuestra rama `develop` se denomina `rails-3-develop`, por lo que + la última versión de desarrollo siempre se halla en la + [rama + rails-3-develop](https://github.com/mysociety/alaveteli/tree/rails-3-develop). La última + versión estable se encuentra siempre en la [rama + maestra](https://github.com/mysociety/alaveteli). Si tiene previsto colaborar en + la elaboración del software, es posible que las [extensiones de flujo de + git](https://github.com/nvie/gitflow) le resultes prácticas. + +* La instalación del software es un tanto compleja, pero poco a poco se vuelve más sencilla. + Si utiliza Debian o Ubuntu, debería poder poner en funcionamiento una versión en varias horas. + Si dispone de su propio servidor, ejecute el + [script de instalación]({{ page.baseurl }}/docs/installing/script/) o siga las + indicaciones de + [instalación manual]({{ page.baseurl }}/docs/installing/manual_install/). + Alternativamente existe una [AMI EC2 de Alaveteli]({{ page.baseurl }}/docs/installing/ami/) + que puede ayudarle a ponerlo en marcha rápidamente. + [Póngase en contacto]({{ page.baseurl }}/community/) a través de la lista de correo del proyecto o mediante IRC + para obtener ayuda. + +* Un paso inicial estándar en la personalización de su implementación es la [escritura de un + tema]({{ page.baseurl }}/docs/customising/themes/). **Si solo va a leer un apartado, + ¡que sea este!** + +* Al igual que numerosos sitios construidos con Ruby on Rails, el software no proporciona un rendimiento muy elevado (consulte + [estas notas sobre los problemas de rendimiento](https://github.com/mysociety/alaveteli/wiki/Performance-issues) recopiladas a través del tiempo con + WhatDoTheyKnow). El sitio funcionará sobre un servidor con 512 MB de memoria RAM, pero se recomienda un mínimo + de 2 GB. La implementación detrás de [Varnish](https://www.varnish-cache.org) también resulta esencial. Consulte las + [buenas prácticas en el servidor de producción]({{ page.baseurl }}/docs/running/server/) para obtener más información. + +* Existe un conjunto de [proposiciones de mejora](https://github.com/mysociety/alaveteli/wiki/Proposals-for-enhancements), + tales como un mayor número de funcionalidades centradas en el usuario, pero consulte también... + +* ...las [publicaciones de github](https://github.com/mysociety/alaveteli/issues). Marcamos + las publicaciones con la etiqueta **suitable for volunteers** (adecuada para voluntarios) cuando creemos que + son especialmente adecuadas para quien busca una tarea relativamente pequeña a la que dedicarse. + +* Intentamos garantizar que cada modificación confirmada cuente con su publicación correspondiente en el gestor. + Así los registros de modificaciones se vuelven más sencillos, pues podemos reunir todos los cambios propios de + una actualización concreta respecto a un objetivo intermedio en el gestor de publicaciones, [como esta actualización + 0.4](https://github.com/mysociety/alaveteli/issues?milestone=7&state=closed). + +* Si experimenta problemas de memoria, consulte [esta publicación del blog sobre estrategias utilizadas + anteriormente](https://www.mysociety.org/2009/09/17/whatdotheyknow-growing-pains-and-ruby-memory-leaks/). + +* Si edita el código en un Mac, consulte estas [notas de instalación en MacOS X]({{ page.baseurl }}/docs/installing/macos/). <!-- [[OS X Quickstart]] --> + +* Intentamos seguir unas buenas prácticas similares en todos nuestros proyectos: visite + [mysociety.github.io](http://mysociety.github.io/) para obtener información sobre temas tales como nuestros + [estándares de código](http://mysociety.github.io/coding-standards.html). diff --git a/es/docs/developers/overview.md b/es/docs/developers/overview.md new file mode 100644 index 000000000..c24474e4f --- /dev/null +++ b/es/docs/developers/overview.md @@ -0,0 +1,49 @@ +--- +layout: es/page +title: Vista general de alto nivel +--- + +# Vista general de alto nivel + +<p class="lead"> + Esta página describe el proceso y las entidades que forman Alaveteli. + Es una vista de alto nivel sobre cómo trabaja Alaveteli para ayudarle a orientarse respecto al código. +</p> + +_Consulte también el [esquema](#esquema) en la parte inferior de esta página._ + +La entidad principal es **InfoRequest**, que representa una solicitud de información por parte de un +**User** a un **PublicBody**. Una nueva InfoRequest resulta en un **OutgoingMessage** inicial, que +representa el primer correo electrónico. + +Una vez elaborada una InfoRequest, se monitoriza su estado mediante **InfoRequestEvents**. Por +ejemplo, el estado inicial de una nueva InfoRequest es `awaiting_response` y cuenta con un +InfoRequestEvent asociado del tipo `initial_request`. Un evento de InfoRequest puede disponer de +un OutgoingMessage o de un IncomingMessage, así como no tener ninguno asociado. + +Las respuestas son recibidas por el sistema mediante el flujo de mensajes de correo de tipo raw (representados por **RawEmail**) +desde el MTA en un script ubicado en `scripts/mailin`. Esta acción analiza el correo, intenta identificar la +InfoRequest asociada y genera un **IncomingMessage**, que hace referencia tanto al RawEmail como a la InfoRequest. + +Cualquier User puede elaborar **Comments** en las InfoRequests. + +Todos los eventos (por ejemplo, Comments y OutgoingMessages) son monitorizados en InfoRequestEvent. + +Una **TrackThing** consiste en una búsqueda delimitada que permite a los usuarios recibir alertas cuando se encuentran +eventos coincidentes con sus criterios. (Su funcionamiento cambió después de que lo lanzáramos, así que +aún existe código obsoleto propio de características que hemos descartado). + +El **MailServerLog** representa los archivos de registro analizados por el MTA. Las entradas del +MailServerLog son creadas por un administrador de tipo cron que ejecuta +`scripts/load-mail-server-logs`. Esta acción comprueba los correos entrantes y los asocia con las +InfoRequests; después `script/check-recent-requests-send` comprueba estos registros para garantizar que +cuentan con información de remitente (envelope-from) en el encabezado (con el objetivo de combatir el spam). + +## Esquema + +<a href="{{ site.baseurl }}assets/img/railsmodels.png"><img src="{{ site.baseurl }}assets/img/railsmodels.png"></a> + +Este esquema de los modelos de Rails fue generado a partir del código el 19 de diciembre de 2012 utilizando +[Railroad](http://railroad.rubyforge.org/). + +El comando de railroad es: `railroad -M | dot -Tpng > railsmodels.png` diff --git a/es/docs/getting_started.md b/es/docs/getting_started.md new file mode 100644 index 000000000..44d358cb3 --- /dev/null +++ b/es/docs/getting_started.md @@ -0,0 +1,370 @@ +--- +layout: es/page +title: Primeros pasos +--- + +# Primeros pasos con Alaveteli + +<p class="lead"> + Esta guía está dirigida a personas que tienen en mente implementar su propio + sitio web basado en Alaveteli en una nueva jurisdicción. +</p> + +Como inspiración, puede consultar algunos de los sitios existentes basados en Alaveteli: +[tuderechoasaber.es](http://tuderechoasaber.es) (España), +[AskTheEU](http://www.asktheeu.org) (Unión Europea) y +[WhatDoTheyKnow](https://www.whatdotheyknow.com) (Reino Unido). Estos sitios utilizan +el software Alaveteli, además de sus propios temas personalizados instalados sobre la plataforma +para darle un aspecto diferente. + +Ni siquiera necesita elaborar un tema personalizado para empezar. Puede tener un +sitio web con el aspecto del [sitio de demostración](http://demo.alaveteli.org) y +añadir tan solo su propio logotipo. + +El proceso de implementación de su propio sitio web basado en Alaveteli puede durar +desde un solo día hasta tres meses, dependiendo de su nivel de ambición respecto a +la personalización del software, su acceso a habilidades técnicas y su tiempo disponible. + +Puede hacerse una idea de cómo saldrán las cosas leyendo [cómo se implementó un sitio +Alaveteli en España](https://www.mysociety.org/2012/04/16/a-right-to-know-site-for-spain/) +(tenga en cuenta que se llevó a cabo con un desarrollador experto al mando). También +necesitará pensar sobre cómo gestionará el sitio; un sitio basado en Alaveteli +requiere una gran cantidad de esfuerzo constante en su moderación y publicidad +(consulte los pasos 6 y 7 a continuación). + +Le recomendamos que siga estos pasos en el orden indicado para empezar: + +* [Paso cero: reúna a su equipo inicial](#step-0) +* [Paso uno: ponga una versión no personalizada en funcionamiento](#step-1) +* [Paso dos: empiece a recopilar información sobre autoridades públicas](#step-2) +* [Paso tres: personalice el sitio](#step-3) +* [Paso cuatro: traduzca toda la información](#step-4) +* [Paso cinco: pruebe el sitio](#step-5) +* [Paso seis: promocione el sitio en el mercado](#step-6) +* [Paso siete: mantenga el sitio](#step-7) + + +<a name="step-0"> </a> + +## Paso cero: reúna a su equipo inicial + +Es improbable que consiga realizar mucho trabajo en solitario. Necesitará +traductores, personas que obtengan direcciones de correo electrónico de las autoridades y +posiblemente un diseñador, preferentemente un experto técnico que le ayude en la personalización. +Lea primero esta guía y valore qué habilidades necesitará para lanzar y mantener el sitio +de forma satisfactoria. + +Se necesitaron unas [diez personas (traductores incluidos) trabajando durante tres +días](http://groups.google.com/group/alaveteli-dev/msg/1bd4afd3091f8b4f) para +lanzar [Queremos Saber](http://queremossaber.org.br/), una versión brasileña de +Alaveteli. + +> Fue genial implementar este sitio. A pesar de algunos problemas menores +> (la mayoría relacionados con el hecho de que no teníamos a nadie experto en +> Ruby on Rails y Postfix), fue bastante rápido y en menos de una semana +> obtuvimos un sitio web totalmente funcional. +> +> -- _Pedro Markun, Queremos Saber_ + +[AskTheEU](http://www.asktheeu.org), una versión mucho más completa y refinada con +un tema personalizado y otras modificaciones, necesitó un equipo de 2 o 3 personas +durante unos 3 meses (a tiempo parcial) para completarse. + +Pida a los miembros de su equipo que se unan a una de las listas de correo. Si tiene +alguna consulta, estos son los primeros lugares donde preguntar. +[alaveteli-users](http://groups.google.com/group/alaveteli-users) es una lista de +correo para usuarios no técnicos del software. Publique mensajes aquí para solicitar +asistencia sobre cómo iniciar su proyecto, preguntar cómo utilizan los demás el +software y realizar otras consultas. +[alaveteli-dev](http://groups.google.com/group/alaveteli-dev) es el lugar donde +consultar cuestiones técnicas, como problemas de instalación de Alaveteli. + +<a name="step-1"> </a> + +## Paso uno: ponga una versión no personalizada en funcionamiento + +Dispone de dos opciones: instalar su propia copia o solicitar al equipo de Alaveteli +que le proporcione una versión hospedada. + +En caso de instalar su propia copia, tendrá el control completo sobre el sitio web, +su rendimiento, la frecuencia de actualización y otros aspectos. Consideramos que esta +es la mejor opción, pero necesitará disponer de algunos recursos para elegirla. + +Alternativamente tenemos una capacidad muy limitada para gestionar un grupo reducido de sitios +basados en Alaveteli para voluntarios. Deseamos aprender más sobre cómo podemos +apoyar a empresas externas y, por tanto, estamos contentos de ayudar a hospedar sitios de +pequeña envergadura para dos o tres socios. Sin embargo, no ofrecemos ningún acuerdo de servicio, +ninguna garantía ni ninguna disposición específica de nuestro tiempo: si el sitio sufre +una caída mientras estamos de vacaciones, ¡deberá esperar hasta que volvamos! Si desea probar +esta opción, [contacte con nosotros](mailto:international@mysociety.org) para averiguar si contamos +con espacio disponible. + +### Instale su propia copia + +Necesitará encontrar a un técnico con conocimientos sobre el hospedaje de sitios web +mediante Apache y Linux. No es necesario tener experiencia en Ruby on Rails, +aunque representa una gran ventaja. + +También necesitará un servidor de recursos. Debería solicitar ayuda a su asistente técnico +para obtenerlo. Los requisitos mínimos para el funcionamiento de un sitio con poco tráfico son +512 MB de memoria RAM y un disco de 20 GB, aunque lo ideal son 2 GB de memoria RAM. Recomendamos +el último Debian Wheezy (7) o Squeeze (6) de 64 bits o Ubuntu precise (12.04) +como sistema operativo. Rackspace ofrece servidores adecuados en la nube desde unos +25 dólares al mes. Una vez adquirido el servidor, su asistente técnico debería seguir la +[documentación de instalación]({{ page.baseurl }}/docs/installing/). + +Alternativamente puede utilizar los servicios web Amazon Web Services, que cuentan con la +ventaja adicional de que puede utilizar nuestra [AMI EC2 de Alaveteli]({{ page.baseurl }}/docs/installing/ami/) +preconfigurada para una puesta a punto casi instantánea. Sin embargo, este servicio es más caro que Rackspace, +especialmente si desea disponer de mayor memoria RAM. + +### Juegue con ella + +Necesitará entender cómo funciona el sitio web. Mientras su propia copia no esté +disponible, puede probar la copia en funcionamiento en el [servidor de +demostración](http://demo.alaveteli.org) (tenga en cuenta que no garantizamos que +se halle disponible ni en ejecución). + +Ahora mismo no disponemos de una guía, así que debe explorarse libremente. + +Cuando disponga de su propia versión en funcionamiento, pruebe a iniciar sesión en la +interfaz de administración añadiendo `/admin` al final del nombre de su dominio. +Esta ruta le conducirá a la interfaz administrativa. Es muy sencilla y funcional. +Por ejemplo, pruebe añadiendo nuevas autoridades, tal vez con su propia dirección de correo, +de forma que pueda ver qué aspecto tienen las solicitudes recibidas por dichas autoridades. + +Al probar las cosas debe representar varios papeles: el de administrador del sitio, el de +usuario común y el de autoridad pública. Esto puede resultar confuso con varias +direcciones de correo, por lo que un método rápido y sencillo de gestión consiste en el +uso de un servicio de correo de usar y tirar como [Mailinator](http://mailinator.com). + +<a name="step-2"> </a> + +## Paso dos: empiece a recopilar información sobre autoridades públicas + +Uno de los requisitos más importantes antes del lanzamiento consiste en la elaboración +de una lista con todos los organismos a quienes desea dirigir solicitudes de información +pública. + +Es una buena idea crear una hoja de cálculo compartida para solicitar a sus colaboradores que +le ayuden a elaborar el listado. Una plantilla como [esta hoja de cálculo de +Google](https://docs.google.com/spreadsheet/ccc?key=0AgIAm6PdQexvdDJKdzlNdXEtdjBETi1SLVhoUy1QM3c&hl=en_US) resulta ideal. + +Si escribe por correo electrónico a posibles colaboradores para solicitar su ayuda, además de +facilitar su trabajo, también podrá identificar a personas dispuestas que puedan estar interesadas +en ayudarle a mantener y gestionar el sitio web. Hemos redactado [una publicación en nuestro blog +sobre este tema](https://www.mysociety.org/2011/07/29/you-need-volunteers-to-make-your-website-work/). + +La interfaz de administración incluye una página donde puede cargar un archivo en formato CSV (este tipo de archivo +contiene valores separados por comas) para crear o editar autoridades. El formato CSV resulta práctico +(por ejemplo, es sencillo guardar datos de una hoja de cálculo en un archivo CSV). + +<a name="step-3"> </a> + +## Paso tres: personalice el sitio + +### Nombre y medios sociales + +Evidentemente querrá incluir su propio diseño visual en el sitio. Una vez cuente +con un nombre para su proyecto (como WhatDoTheyKnow en el Reino Unido, AskTheEU en la +Unión Europea o InformateZyrtare en Kosovo), registre un código de usuario de Twitter +y un nombre de dominio. Alaveteli confía en que mantenga un blog para su sección de «Noticias», +así que es posible que desee crear un blog gratuito en http://wordpress.com o +http://blogger.com para anunciar su proyecto en una nueva publicación. + +### Marcas y temas + +A continuación medite sobre la identidad visual. Probablemente debería al menos +sustituir el logotipo predeterminado de Alaveteli que puede verse en la parte superior +izquierda de <http://demo.alaveteli.org>. También resulta sencillo modificar el +esquema de colores. + +Si dispone de algo más de tiempo y presupuesto, puede editar en mayor profundidad el diseño, +añadiendo una página de inicio personalizada, distintas fuentes, etc., pero cuanto más personalice +el sitio, más difícil resultará actualizarlo en el futuro y necesitará un desarrollador +y/o un diseñador que le ayude a personalizarlo. Denominamos «tema» al conjunto personalizado de colores, +fuentes, logotipos, etc.; encontrará varias notas para desarrolladores +sobre la [creación de temas]({{ page.baseurl }}/docs/customising/themes/). Es posible que invierta +entre 1 y 15 días en estas funciones. + +### Diferencias legislativas + +Contamos con los usuarios para que ayuden a identificar la categoría de sus propias solicitudes +(por ejemplo, como «satisfactoria» o «rechazada»). A estas categorías las denominamos «estados». +La mayoría de las leyes sobre información pública a nivel mundial son tan similares que probablemente +pueda utilizar los estados de Alaveteli tal como se ofrecen, sin necesidad de modificarlos. + +Además, hemos descubierto que en general no es buena idea intentar implementar las leyes +de forma exacta en la interfaz de usuario, pues a menudo resultan complicadas y confusas para +los usuarios. Debido a que el concepto de Alaveteli consiste en facilitar el ejercicio del +derecho a saber, consideramos mejor implementar el proceso de información pública como *debería* +ser, en lugar de como *es actualmente*. + +Sin embargo, si realmente siente la necesidad de alterar los estados en los que puede hallarse una +solicitud, es posible hacerlo hasta cierto nivel dentro de su tema. Medite sobre qué +se requiere y después envíe un mensaje a la lista de correo de Alaveteli para obtener +comentarios y valorar sus ideas. Necesitará solicitar a su desarrollador que implemente +los estados nuevos. Esto no suele requerir más de un par de días de trabajo, a menudo menos, +pero los flujos de trabajo complejos pueden necesitar un tiempo mayor. + +### Redacte las páginas de ayuda + +Las páginas de ayuda predeterminadas en Alaveteli proceden de WhatDoTheyKnow y, por tanto, +solo son relevantes en el Reino Unido. Puede utilizar estas páginas como inspiración, pero +debería revisar su contenido basándose en su jurisdicción. Las páginas importantes que deben +traducirse son: + +* [Información](https://github.com/mysociety/alaveteli/blob/master/app/views/help/about.rhtml): por qué existe el sitio web, por qué funciona, etc. +* [Contacto](https://github.com/mysociety/alaveteli/blob/master/app/views/help/contact.rhtml): formas de ponerse en contacto. +* [Créditos](https://github.com/mysociety/alaveteli/blob/master/app/views/help/credits.rhtml): quién participa en el sitio. Incluye una sección importante sobre cómo pueden los usuarios colaborar en el proyecto. +* [Agentes](https://github.com/mysociety/alaveteli/blob/master/app/views/help/officers.rhtml): información para los agentes que tratan con la información pública en los distintos organismos. Reciben un enlace que conduce a esta página en los correos que el sitio les envía. +* [Privacidad](https://github.com/mysociety/alaveteli/blob/master/app/views/help/privacy.rhtml): política de privacidad e información que aclara que las solicitudes aparecerán en internet. Informe a los usuarios de que pueden utilizar seudónimos en su jurisdicción. +* [Solicitudes](https://github.com/mysociety/alaveteli/blob/master/app/views/help/requesting.rhtml): la página de ayuda principal para realizar solicitudes. Cómo funciona, cómo decidir a quién escribir, qué se puede esperar en cuanto a respuestas se refiere, cómo efectuar reclamaciones, etc. +* [Descontento](https://github.com/mysociety/alaveteli/blob/master/app/views/help/unhappy.rhtml): los usuarios son dirigidos a esta página cuando una solicitud no ha sido satisfactoria (por ejemplo, si la solicitud ha sido rechazada o cuando el organismo insiste en recibir una solicitud por correo postal). La página debería animarles a continuar intentándolo, por ejemplo, iniciando una nueva solicitud o dirigiéndola a otro organismo. +* [Motivos para utilizar el correo](https://github.com/mysociety/alaveteli/blob/master/app/views/help/_why_they_should_reply_by_email.rhtml): un breve texto informativo que explica a los usuarios por qué deberían insistir en obtener respuestas por correo electrónico. Se muestra junto a las solicitudes que han «pasado al correo postal». + +Las páginas de ayuda contienen código HTML. Su asistente técnico debería poder darle soporte al respecto. + +Una vez redactadas las páginas, solicite a su asistente técnico que las añada a su tema. + +Este es también un buen momento para empezar a pensar sobre algunos de los correos estándar +que enviará como respuesta a consultas comunes de usuarios y tareas administrativas, por +ejemplo, un correo electrónico que se envía a los departamentos informáticos para solicitarles +que añadan a la lista blanca los correos de su sitio web basado en Alaveteli (en caso de que +dichos correos sean marcados como spam o correo no deseado). Consulte el +[manual de administrador]({{ page.baseurl }}/docs/running/admin_manual/) para conocer los detalles +sobre algunas tareas administrativas habituales. Existe una lista de los correos estándar +utilizados por WhatDoTheyKnow en el sitio web de +[FOI Wiki](http://foiwiki.com/foiwiki/index.php/Common_WhatDoTheyKnow_support_responses). + +### Otras personalizaciones de software + +Tal vez le interese una nueva funcionalidad relacionada con la usabilidad que aún no se +encuentra en Alaveteli, como la detección automática del idioma para sitios web multilingües +o la integración con Facebook o con una aplicación para iPhone. + +Tal vez haya encontrado un área relacionada con las traducciones que Alaveteli aún no soporta +en su totalidad (por ejemplo, aún no hemos necesitado implementar un sitio web en un idioma +escrito de derecha a izquierda). + +Tal vez su jurisdicción *requiera* una nueva característica que no se encuentra en Alaveteli, +por ejemplo, el envío de información adicional por parte de los usuarios en sus solicitudes. + +En estos casos necesitará que su asistente técnico (o algún desarrollador de software) +lleve a cabo estas modificaciones. Estas tareas pueden consumir mucho tiempo, pues el desarrollo +de software nuevo, sus pruebas y su despliegue suelen ser complejos. Debería consultar con un +experto sobre la cantidad de tiempo requerido para ello. Normalmente este tipo de cambios pueden +ocupar entre uno y tres meses de la planificación del proyecto. + +<a name="step-4"> </a> + +## Paso cuatro: traduzca toda la información + +¡Este es un trabajo potencialmente grande! + +Si necesita soportar múltiples idiomas en su jurisdicción, deberá traducir: + +* nombres de autoridades públicas, notas, etc. +* organismos públicos +* páginas de ayuda +* todas las indicaciones de la interfaz web en el software + +Resulta algo más sencillo si solo necesita soportar un idioma en su +jurisdicción, pues ya habrá redactado la ayuda y la información sobre autoridades +públicas, por lo que solo necesitará traducir la interfaz web. + +Los nombres de autoridades públicas pueden editarse a través de la interfaz de administración +o cargando una hoja de cálculo. Las páginas de ayuda necesitan una copia guardada para cada idioma, +su asistente técnico las situará en el lugar correspondiente. + +Las traducciones de la interfaz web se gestionan mediante la colaboración de un sitio web +llamado Transifex. Dicho sitio permite que equipos de traducción colaboren en un solo lugar, +utilizando una interfaz sencilla y segura. + +La página de Alaveteli en Transifex se halla en +<https://www.transifex.com/projects/p/alaveteli/>; todas las traducciones se encuentran en +un único archivo de traducción llamado +[`app.pot`](https://www.transifex.com/projects/p/alaveteli/resource/apppot/). + +Puede establecer su propio idioma y proporcionar aquí sus traducciones, así como utilizar +software especializado en su propio ordenador (consulte las páginas de ayuda de Transifex). + +Existen (en el momento en que se redacta este texto) alrededor de 1.000 frases o fragmentos +de frase diferentes (conocidos como «strings» o «cadenas de texto») para traducir. El significado +de la mayor parte de cadenas de texto debería resultar obvio, pero el de otras no tanto. Hasta que +redactemos una guía para traductores, la mejor opción es traducir todo lo posible y después +consultar a su asistente técnico o la lista de correo del proyecto sobre cualquier detalle +que genere dudas. + +Con el tiempo, a medida que se solucionan errores y se añaden nuevas funcionalidades, también +aparecen nuevas cadenas de texto en el archivo. Por tanto, necesita consultar el archivo `app.pot` de vez en cuando +para revisar posibles cadenas de texto pendientes de traducción. + +<a name="step-5"> </a> + +## Paso cinco: pruebe el sitio + +Para el lanzamiento su asistente técnico debería revisar las [buenas prácticas +para el servidor de producción]({{ page.baseurl }}/docs/running/server/). + +Un lanzamiento discreto, informando a solo unas pocas personas de confianza, suele ser +una buena idea. Así puede revisar cómo funciona todo y evaluar las respuestas de las +autoridades. Es probable que las respuestas varíen ampliamente entre jurisdicciones y +dentro de ellas y, por tanto, la forma adecuada de hacer que su sitio web sea un éxito +variará de acuerdo con estas respuestas. + +<a name="step-6"> </a> + +## Paso seis: promocione el sitio en el mercado + +En general la mejor manera de dirigirse a las autoridades consiste en una combinación de +ánimo y exposición. En privado puede explicar que, además de ayudar a llevar a cabo sus requisitos +legales y obligaciones civiles, reducirá su carga de trabajo al evitar solicitudes repetidas. +En público puede trabajar con periodistas para felicitar a los organismos que estén haciendo un +buen trabajo y destacar a los que se niegan a participar. Por tanto, es muy importante contactar +con periodistas interesados en la información pública. + +Otra herramienta de marketing importante es [Google +Grants](http://www.google.com/grants/), un esquema gestionado por Google que ofrece +AdWords (palabras clave) gratuitas a organizaciones benéficas en numerosos países de todo el mundo. +Le resultarán increíblemente prácticas en la captación de tráfico para su sitio web. +Vale la pena darse de alta como organización benéfica solo para poder aprovechar este programa. + +<a name="step-7"> </a> + +## Paso siete: mantenga el sitio + +Para gestionar satisfactoriamente un sitio web basado en Alaveteli se requiere una colaboración +regular y constante. Esto resulta más sencillo si se lleva a cabo entre un pequeño grupo de personas +que comparten tareas. Con suerte será lo bastante afortunado como para recibir subvenciones con las que +pagar a personas por estas tareas. Sin embargo, también es posible que necesite la ayuda de +voluntarios. Hemos escrito [una publicación en nuestro blog sobre la importancia de los +voluntarios](https://www.mysociety.org/2011/07/29/you-need-volunteers-to-make-your-website-work/), que debería leer. + +Necesitará crear una dirección de correo electrónico de grupo para todas las personas que +gestionen el sitio web. Todas las consultas de usuarios del sitio se dirigirán a dicha dirección, +así como las notificaciones automáticas de Alaveteli. Una dirección de grupo es realmente práctica +para coordinar respuestas, debatir sobre las políticas, etc. + +Podría dedicar tan solo una o dos horas semanales para mantenerse al tanto de la +«sala de espera» del sitio, donde se recogen todos los mensajes que el sitio no sabe +cómo gestionar (como correo no deseado, mensajes con un destinatario incorrecto, +etc.). Sin embargo, cuanto más esfuerzo invierta en él, más satisfactorio resultará su sitio web. +Para garantizar su éxito debería llevar a cabo tareas como estas: + +* Responder a las solicitudes de ayuda de los usuarios por correo electrónico +* Monitorizar nuevas solicitudes, buscar personas que puedan necesitar ayuda y publicar comentarios alentadores en sus solicitudes +* Monitorizar las respuestas de las autoridades y buscar a las que intentan evitar responder, ofreciendo ayuda a la persona que realizó la solicitud, + posiblemente generando publicidad «avergonzante» para que la autoridad responda +* Publicar en Twitter sobre solicitudes y respuestas interesantes +* Redactar publicaciones en su blog sobre el progreso del proyecto +* Comentar con periodistas las historias potencialmente interesantes +* Conseguir voluntarios para ayudar en el sitio +* Categorizar las solicitudes no clasificadas + +Consulte también el [manual de administrador]({{ page.baseurl}}/docs/running/admin_manual/), que describe +algunas tareas típicas que deberá llevar a cabo cuando su sitio esté en funcionamiento. + +### ¿Qué más? + +Si considera que sería realmente practico incluir algo más en esta guía de inicio, infórmenos para que podamos añadirlo. diff --git a/es/docs/glossary.md b/es/docs/glossary.md new file mode 100644 index 000000000..e7033d93d --- /dev/null +++ b/es/docs/glossary.md @@ -0,0 +1,733 @@ +--- +layout: es/page +title: Glosario +--- + +Glosario +==================== + +<p class="lead"> + Glosario de términos de Alaveteli, la plataforma de información pública de mySociety. +</p> + +Definiciones +----------- + +<ul class="definitions"> + <li><a href="#alaveteli">Alaveteli</a></li> + <li><a href="#agnostic">imparcial respecto al solicitante</a></li> + <li><a href="#authority">autoridad</a></li> + <li><a href="#blackhole">agujero negro</a></li> + <li><a href="#bounce-message">mensaje rebotado</a></li> + <li><a href="#capistrano">Capistrano</a></li> + <li><a href="#censor-rule">norma de censura</a></li> + <li><a href="#development">servidor de desarrollo</a></li> + <li><a href="#emergency">usuario de emergencia</a></li> + <li><a href="#foi">información pública</a></li> + <li><a href="#git">git</a></li> + <li><a href="#holding_pen">sala de espera</a></li> + <li><a href="#newrelic">New Relic</a></li> + <li><a href="#mta">MTA</a></li> + <li><a href="#po">archivos .po</a></li> + <li><a href="#production">servidor de producción</a></li> + <li><a href="#publish">publicar</a></li> + <li><a href="#recaptcha">recaptcha</a></li> + <li><a href="#redact">editar</a></li> + <li><a href="#regexp">expresión regular</a></li> + <li><a href="#request">solicitud</a></li> + <li><a href="#release">actualización</a></li> + <li><a href="#response">respuesta</a></li> + <li><a href="#rails">Ruby on Rails</a></li> + <li><a href="#sass">Sass</a></li> + <li><a href="#staging">servidor de pruebas</a></li> + <li><a href="#state">estado</a></li> + <li><a href="#theme">tema</a></li> +</ul> + + +<dl class="glossary"> + + <dt> + <a name="alaveteli">Alaveteli</a> + </dt> + <dd> + <strong>Alaveteli</strong> es el nombre de la plataforma de software de código abierto creada + por <a href="https://www.mysociety.org">mySociety</a> para enviar, + gestionar y archivar solicitudes de información pública. + <p> + Se construyó a partir del exitoso proyecto de información pública de Reino Unido + <a href="https://www.whatdotheyknow.com">WhatDoTheyKnow</a>. + Utilizamos el nombre <em>Alaveteli</em> para distinguir el software + que sustenta la plataforma respecto de cualquier sitio web específico que la utilice. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + El sitio web de Alaveteli se halla en <a href="http://www.alaveteli.org">www.alaveteli.org</a>. + </li> + <li> + El nombre «Alaveteli» proviene de + <a href="http://en.wikipedia.org/wiki/Alaveteli,_Finland">Alaveteli, Finlandia,</a> + donde una vez trabajó + <a href="http://en.wikipedia.org/wiki/Anders_Chydenius">un antiguo defensor de la información pública</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="agnostic">imparcial respecto al solicitante</a> + </dt> + <dd> + La ley de <a href="#foi" class="glossary__link">información pública</a> normalmente considera que + las <a href="#response" class="glossary__link">respuestas</a> ofrecidas por las + <a href="#authority" class="glossary__link">autoridades</a> son <strong>imparciales respecto al solicitante</strong>. Esto significa + que la respuesta no debería cambiar en nada en relación a <em>quién</em> haya solicitado + la información. Como consecuencia, la respuesta + puede <a href="#publish" class="glossary__link">publicarse</a>, ya que en teoría <em>todo el mundo</em> + podría preguntar lo mismo y, por ley, debería recibir la misma información. + <p> + A pesar de ello, sigue siendo bastante común a nivel mundial que las autoridades respondan + a las solicitudes de información pública de forma privada, en lugar de publicar ellas mismas sus respuestas. Por tanto, una de las + funciones de Alaveteli consiste en actuar como repositorio público de las respuestas recibidas. + Esto también sirve para reducir solicitudes duplicadas, pues la respuesta es pública y evita que la pregunta + se tenga que repetir de nuevo. + </p> + </dd> + + <dt> + <a name="authority">autoridad</a> + </dt> + <dd> + Llamamos <strong>autoridad</strong> a cualquier organismo, organización, + departamento o compañía a los que los usuarios pueden enviar <a href="#request" class="glossary__link">solicitudes</a>. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Un administrador puede añadir, editar o eliminar autoridades en el apartado de administración. + </li> + <li> + Las autoridades son habitualmente, aunque no siempre, organismos públicos obligados a responder por la ley local de + <a href="#foi" class="glossary__link">información pública</a>. A veces se establece un sitio basado en + Alaveteli en una jurisdicción que aún no cuenta con una ley de información pública. En el Reino Unido + hemos añadido a nuestro sitio <a href="https://www.whatdotheyknow.com">WhaDoTheyKnow</a> algunas autoridades + que no están sujetas a la ley de información pública, pero que se han sometido a ella de forma voluntaria + o creemos que deberían tenerse en cuenta en este ámbito. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="blackhole">agujero negro</a> + </dt> + <dd> + Un <strong>agujero negro</strong> es una dirección de correo electrónico que acepta y destruye + todos los mensajes de correo que recibe. Alaveteli lo utiliza para los mensajes de correo que no + admiten respuestas, normalmente generados de forma automática por sistemas de correo. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Utilice la opción de configuración + <code><a href="{{ page.baseurl }}/docs/customising/config/#blackhole_prefix">BLACKHOLE_PREFIX</a></code> + para especificar el aspecto de esta dirección de correo. + </li> + <li> + Por otra parte, revise + <code><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a></code> + para especificar la dirección que recibirá mensajes de correo de los usuarios (por ejemplo, solicitudes + de soporte). + </li> + </ul> + </div> + </dd> + + <dt> + <a name="bounce-message">mensaje rebotado</a> + </dt> + <dd> + Un <strong>mensaje rebotado</strong> es generado automáticamente por un sistema de correo para informar + al remitente de un mensaje sobre problemas ocurridos en la entrega de dicho mensaje. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + <a href="{{ page.baseurl }}/docs/installing/email">Cómo gestiona el correo Alaveteli</a>. + </li> + <li>Página de wikipedia sobre <a href="http://en.wikipedia.org/wiki/Bounce_message">mensajes rebotados</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="capistrano">Capistrano</a> + </dt> + <dd> + <strong>Capistrano</strong> es una herramienta de implementación y automatización en un servidor remoto escrita en Ruby, + utilizada por el mecanismo opcional de implementación de Alaveteli. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Cómo <a href="{{ page.baseurl }}/docs/installing/deploy/">implementar Alaveteli</a> (y por qué es una buena idea). + </li> + <li> + El <a href="http://capistranorb.com/">sitio web de Capistrano</a> dispone de documentación minuciosa + sobre esta herramienta. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="censor-rule">norma de censura</a> + </dt> + <dd> + Los administradores de Alaveteli pueden definir <strong>normas de censura</strong> para identificar + qué partes de las respuestas deberían ser + <a href="#redact" class="glossary__link">editadas</a>. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte el + <a href="{{ page.baseurl }}/docs/running/admin_manual/">manual de administrador</a> + para obtener más información sobre las normas de censura. + </li> + <li> + Las normas de censura pueden simplemente editar texto que concuerde exactamente con + una frase u oración en particular, así como utilizar + <a href="#regexp">expresiones regulares</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="development">servidor de desarrollo</a> + </dt> + <dd> + Un <strong>servidor de desarrollo</strong> soporta la ejecución de su sitio basado en Alaveteli + para que pueda <a href="{{ page.baseurl }}/docs/customising/">personalizarlo</a>, experimentar + con distintas opciones y ponerlo a prueba hasta conseguir que desempeñe las funciones deseadas. + Es diferente de un + <a href="#production" class="glossary__link">servidor de producción</a>, que es + visitado por usuarios auténticos y funciona con datos reales, así como de un + <a href="#staging" class="glossary__link">servidor de pruebas</a>, + utilizado para probar el código antes de publicarlo. + <p> + En el servidor de desarrollo debe asignar a + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> + el valor <code>1</code>. + </p> + </dd> + + <dt> + <a name="emergency">usuario de emergencia</a> + </dt> + <dd> + Alaveteli incluye la configuración de un <strong>usuario de emergencia</strong>. + Esta configuración ofrece un código de usuario y una contraseña para acceder a la página de administración, incluso + si el usuario no aparece en la base de datos. + <p> + Cuando el sistema ha sido arrancado (es decir, cuando se ha utilizado el usuario de emergencia para + proporcionar a una cuenta de usuario permisos totales de <em>superusuario</em>), el usuario de emergencia + debe deshabilitarse. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + El código de usuario y la contraseña están definidos en los ajustes de configuración + <code><a href="{{ page.baseurl }}/docs/customising/config/#admin_username">ADMIN_USERNAME</a></code> + y + <code><a href="{{ page.baseurl }}/docs/customising/config/#admin_password">ADMIN_PASSWORD</a></code>. + </li> + <li> + Si desea consultar un ejemplo de usuario de emergencia, acceda a la + <a href="{{ page.baseurl }}/docs/installing/next_steps/#cree-una-cuenta-de-administrador-superusuario">creación + de una cuenta de superusuario</a>. + </li> + <li> + Para desactivar el usuario de emergencia, configure la opción + <code><a href="{{ page.baseurl }}/docs/customising/config/#disable_emergency_user">DISABLE_EMERGENCY_USER:</a> true</code>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="foi">Información pública</a> + </dt> + <dd> + Las leyes de <strong>información pública</strong> permiten al público acceder a datos + almacenados por los gobiernos nacionales. Establecen un proceso legal para el derecho a saber, + que permite solicitar información guardada por los gobiernos y recibirla de forma + gratuita por un mínimo coste, salvo excepciones estándar. + <br> + <em>[Wikipedia]</em> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Resumen de Wikipedia sobre <a href="http://en.wikipedia.org/wiki/Freedom_of_information_laws_by_country">las leyes de información pública por países</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="git">git</a> (también llamado «github» o «repositorio git») + </dt> + <dd> + Utilizamos un popular sistema de control de código fuente llamado <strong>git</strong>. Este sistema + nos ayuda a monitorizar los cambios realizados en el código y también facilita a otras personas + la duplicación de nuestro software y la colaboración en su elaboración. + <p> + El sitio web <a href="https://github.com/mysociety">github.com</a> es un lugar público central + donde está disponible nuestro software. Debido a que se trata de código abierto, puede + revisarlo (Alaveteli está en su mayoría escrito en el lenguaje de programación + Ruby) e informar de errores, así como sugerir funcionalidades y otras numerosas características prácticas. + </p> + <p> + El conjunto completo de archivos que forman la plataforma Alaveteli se denomina + <strong>repositorio git</strong>. Al + instalar Alaveteli, está clonando nuestro repositorio en su propio + equipo. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte las <a href="{{ page.baseurl }}/docs/installing/">instrucciones de instalación</a> que clonarán + el repositorio de Alaveteli. + </li> + <li> + Todo sobre git en el <a + href="http://git-scm.com">sitio web oficial</a>. + </li> + <li> + Consulte <a href="https://github.com/mysociety">los proyectos de mySociety en + github</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="holding_pen">sala de espera</a> + </dt> + <dd> + La <strong>sala de espera</strong> es un lugar conceptual donde se almacenan los mensajes + que no se han podido entregar y necesitan ser revisados por un administrador. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte la información incluida en el <a href="{{ page.baseurl }}/docs/running/admin_manual/">manual de administrador</a> + sobre cómo gestionar los mensajes de correo ubicados en la sala de espera. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="mta">MTA</a> (servidor de correo) + </dt> + <dd> + Un <strong>servidor de correo</strong> es un programa que envía y recibe + correo electrónico. Alaveteli envía correo a nombre de sus usuarios y procesa + las <a href="#response" class="glossary__link">respuestas</a> que recibe. + Todos los mensajes pasan por el servidor de correo, que constituye un servicio + independiente de su sistema. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte estas instrucciones para <a href="{{ page.baseurl }}/docs/installing/email/">configurar su MTA</a> + (incluye ejemplos para exim4 y postfix, dos de los más comunes) + </li> + </ul> + </div> + </dd> + + <dt> + <a name="newrelic">New Relic</a> + </dt> + <dd> + Alaveteli puede utilizar la herramienta de monitorización de aplicaciones de <strong>New Relic</strong> para revisar el + rendimiento de su <a href="#production" class="glossary__link">servidor de producción</a>. Si se halla activado, + el sitio web de New Relic recopila datos sobre su aplicación, que puede inspeccionar gracias a + sus herramientas visuales. Sus funcionalidades básicas son gratuitas. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Utilice la opción <code>agent_enabled:</code> del + archivo de configuración <code>newrelic.yml</code> para activar el análisis de New Relic. + Consulte las instrucciones de <a href="{{ page.baseurl }}/docs/installing/manual_install/">instalación manual</a>. + </li> + <li> + Consulte también el <a href="https://github.com/newrelic/rpm">repositorio de github</a> y la + <a href="https://docs.newrelic.com/docs/ruby/">documentación</a> sobre el agente Ruby de New Relic. + </li> + <li> + <a href="http://newrelic.com">Sitio web de New Relic</a>: si tiene este servicio activado, + puede iniciar sesión para revisar los análisis de rendimiento. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="po">archivo <code>.po</code></a> (y archivo <code>.pot</code>) + </dt> + <dd> + Estos son los archivos requeridos por el mecanismo <em>gettext</em> que Alaveteli utiliza para + la localización. Un archivo <code>.pot</code> contiene una lista con todas las cadenas + de texto propias de la aplicación que necesitan ser traducidas. Cada archivo <code>.po</code> + contiene la correspondencia entre estas cadenas, utilizadas como claves, y sus + traducciones para un idioma en concreto. La clave se denomina + <em>msgid</em> y su correspondiente traducción, <em>msgstr</em>. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte la <a href="{{ page.baseurl }}/docs/customising/translation/">traducción de + Alaveteli</a> para obtener una visión general desde el punto de vista de un traductor. + </li> + <li> + Consulte la <a href="{{ page.baseurl }}/docs/developers/i18n/">internacionalización de + Alaveteli</a> para acceder a detalles más técnicos. + </li> + <li> + Alaveteli se halla en el sitio web <a href="https://www.transifex.net/projects/p/alaveteli/">Transifex</a>, + que permite a los traductores trabajar con Alaveteli en un navegador, sin necesidad de + preocuparse por su estructura subyacente. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="production">servidor de producción</a> + </dt> + <dd> + Un <strong>servidor de producción</strong> es aquel donde se mantiene en funcionamiento su sitio web basado en Alaveteli + para usuarios auténticos con datos reales. Es diferente de un + <a href="#development" class="glossary__link">servidor de desarrollo</a>, que se utiliza para llevar a cabo + modificaciones de entorno y personalización e intentar que todo funcione correctamente, así como de un + <a href="#staging" class="glossary__link">servidor de pruebas</a>, utilizado para probar y configurar + el código ya finalizado antes de su publicación. + <p> + Su servidor de producción debe configurarse para funcionar de la forma más eficiente posible. Por + ejemplo, con la memoria caché activada y la depuración desactivada. + <a href="#rails" class="glossary__link">Rails</a> cuenta con un «modo de producción», que se encarga de + ello, solo debe asignar a + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> + el valor <code>0</code>. Tenga en cuenta que si <em>modifica</em> esta opción después de la + implementación, el archivo <code>rails_env.rb</code>, que permite el modo de producción de Rails, + no se creará hasta que ejecute <code>rails-post-deploy</code>. + <p> + Si dispone de un servidor de pruebas, los entornos de sistema de sus servidores de pruebas y de + producción deberían ser idénticos. + </p> + <p> + En ningún caso debería necesitar editar código directamente en su servidor de producción. + Le recomendamos encarecidamente el uso del + <a href="{{ page.baseurl }}/docs/installing/deploy/">mecanismo de implementación</a> de Alaveteli + (mediante Capistrano) para efectuar cambios en su servidor de producción. + </p> + </dd> + + <dt> + <a name="publish">publicar</a> + </dt> + <dd> + Alaveteli trabaja mediante la <strong>publicación</strong> de las + <a href="#response" class="glossary__link">respuestas</a> que recibe para las + <a href="#request" class="glossary__link">solicitudes</a> de + <a href="#foi" class="glossary__link">información pública</a> enviadas por sus usuarios. + Para ello procesa los correos electrónicos recibidos y los presenta como páginas + (una por solicitud) en el sitio. Esto facilita que la gente encuentre, lea, enlace + y comparta la solicitud y la información proporcionada como respuesta. + </dd> + + <dt> + <a name="recaptcha">recaptcha</a> + </dt> + <dd> + El mecanismo <strong>recaptcha</strong> permite detectar a usuarios no humanos, + como robots automatizados, para evitar que envíen solicitudes de forma automática. + Requiere que el usuario (humano) identifique un patrón de letras mostrado + en una imagen, una tarea prácticamente imposible para los robots no humanos. + Alaveteli utiliza esta herramienta para evitar recibir spam. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Utilice las opciones de configuración + <code><a href="{{ page.baseurl }}/docs/customising/config/#recaptcha_public_key">RECAPTCHA_PUBLIC_KEY</a></code> + y + <code><a href="{{ page.baseurl }}/docs/customising/config/#recaptcha_private_key">RECAPTCHA_PRIVATE_KEY</a></code> + para configurarlo. + </li> + <li> + Consulte el <a href="http://www.google.com/recaptcha/">sitio de recaptcha</a> para obtener más información. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="redact">editar</a> (o edición) + </dt> + <dd> + Al <strong>editar</strong> se elimina u oculta parte de un mensaje + para que no pueda leerse, se retira parte de un documento del sitio web. + <p> + Esta tarea puede ser necesaria por diversas razones. Por ejemplo, es posible que + un usuario incluya por error información personal en su solicitud o que una autoridad + la incluya en su respuesta. También es posible que necesite editar partes de + solicitudes y respuestas que resulten difamatorias o puedan herir la sensibilidad. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Consulte el + <a href="{{ page.baseurl }}/docs/running/admin_manual/">manual de administrador</a> + para obtener más detalles sobre cómo y cuándo es posible que necesite editar información. + </li> + <li> + Puede llevar a cabo la edición exclusivamente de texto con las + <a href="#censor-rule" class="glossary__link">normas de censura</a> de Alaveteli. + </li> + <li> + Algunos temas son más sencillos de editar que otros (en particular, los archivos PDF + pueden contener firmas o imágenes difíciles de eliminar de forma parcial). + El tal caso es posible que necesite eliminar el documento en su totalidad. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="regexp">expresión regular</a> + </dt> + <dd> + Una <strong>expresión regular</strong> es una forma concisa de describir un + patrón o secuencia de caracteres, letras o palabras. Un administrador encontrará + prácticas las expresiones regulares cuando necesite definir <a + href="#censor-rule" class="glossary__link">normas de censura</a>. Por ejemplo, en lugar + de <a href="#redact" class="glossary__link">editar</a> solamente una frase específica, + puede describir un conjunto completo de frases <em>similares</em> con una sola + expresión regular. + <p> + Las expresiones regulares pueden resultar complejas, pero también potentes. Si no está + familiarizado con su uso, es fácil cometer errores. ¡Úselas con precaución! + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Por ejemplo, la expresión regular + <code>Jo(e|ey|seph)\s+Blogg?s</code> incluiría + «<code>Joe Bloggs</code>», «<code>Joey Bloggs</code>» y + «<code>Joseph Bloggs</code>», pero no + «<code>John Bloggs</code>». + </li> + <li> + Consulte las <a href="http://en.wikibooks.org/wiki/Regular_Expressions"><em>expresiones + regulares</em> en wikibooks</a> para obtener más información + </li> + </ul> + </div> + </dd> + + <dt> + <a name="release">actualización</a> (o gestor de actualizaciones) + </dt> + <dd> + Publicamos nuevas <strong>actualizaciones</strong> de código para Alaveteli siempre que se + añaden trabajos importantes (nuevas funcionalidades, mejoras, soluciones de errores, etc.) al + código principal. Las actualizaciones se identifican con una etiqueta, que incluye dos o tres + números: mayor, menor y, en caso necesario, el número de parche. + Le recomendamos utilizar siempre la última versión. El proceso es supervisado por el + <strong>gestor de actualizaciones</strong> de Alaveteli, encargado de decidir qué + cambios deben incluirse en la actualización actual y la fecha límite del trabajo. + Actualmente se trata del desarrollador principal de Alaveteli en mySociety. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + La última actualización estable se halla en la + <a href="https://github.com/mysociety/alaveteli/tree/master">rama maestra</a>. + </li> + <li> + Consulte la <a href="https://github.com/mysociety/alaveteli/releases">lista de actualizaciones</a> + y sus etiquetas específicas. + </li> + <li> + También intentamos coordinar las actualizaciones con todos los trabajos activos de traducción. + Consulte la <a href="{{ page.baseurl }}//docs/customising/translation/">traducción de + Alaveteli</a> para obtener más información. + </li> + <li> + Le animamos a utilizar el <a href="{{ page.baseurl }}/docs/installing/deploy/">mecanismo de + implementación</a>, que permite mantener actualizado el servidor de producción con facilidad. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="request">solicitud</a> + </dt> + <dd> + En Alaveteli se denomina <strong>solicitud</strong> a la petición de + <a href="#foi" class="glossary__link">información pública</a> que un + usuario envía y que el sitio manda por correo electrónico a la + <a href="#authority" class="glossary__link">autoridad</a> correspondiente. + Alaveteli <a href="#publish" class="glossary__link">publica</a> automáticamente + las <a href="#response" class="glossary__link">respuestas</a> + a todas las solicitudes enviadas. + </dd> + + <dt> + <a name="response">respuesta</a> + </dt> + <dd> + Se denomina <strong>respuesta</strong> al correo electrónico enviado por una + <a href="#authority" class="glossary__link">autoridad</a> como contestación a + la <a href="#request" class="glossary__link">solicitud</a> de un usuario. + </dd> + + <dt> + <a name="rails">Ruby on Rails</a> (también llamado «Rails») + </dt> + <dd> + Alaveteli está escrito en el lenguaje de programación Ruby mediante la + estructura de aplicación web «Ruby on Rails». + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + Sitio web de <a href="http://rubyonrails.org/">Ruby on Rails</a>. + </li> + <li> + La <a href="{{ page.baseurl }}/docs/developers/directory_structure/">estructura de directorios</a> de + Alaveteli recibe influencias del uso de Ruby on Rails. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="sass">Sass</a> (para la generación de CSS) + </dt> + <dd> + Las hojas de estilo en cascada (CSS) de Alaveteli controlan la apariencia de las páginas y + se definen utilizando <strong>Sass</strong>. Técnicamente se trata de una extensión del lenguaje CSS + y lo utilizamos porque resulta más sencillo que el uso directo de CSS + (por ejemplo, Sass permite realizar un solo cambio y que este se aplique a numerosos + elementos ubicados en todo el sitio). + <a href="#rails" class="glossary__link">Rails</a> detecta los cambios realizados + en cualquier archivo Sass y genera de nuevo automáticamente los archivos CSS utilizados por el sitio. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + <a href="http://sass-lang.com">Sitio web de Sass</a>. + </li> + <li> + Más detalles sobre <a href="{{ page.baseurl }}/docs/customising/themes/#modificar-el-esquema-de-colores">la modificación + de su esquema de colores</a>, que utiliza Sass. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="staging">servidor de pruebas</a> + </dt> + <dd> + Un <strong>servidor de pruebas</strong> se utiliza para probar el código o la configuración + antes de publicar el sitio. Es diferente de un <a href="#development" + class="glossary__link">servidor de desarrollo</a>, donde se modifican el código y las opciones + para conseguir que todo funcione, así como de un + <a href="#production" class="glossary__link">servidor de producción</a>, que es el lugar + visitado por los usuarios donde se hallan los datos reales. + <p> + En el servidor de pruebas debe asignar a + <code><a href="{{ page.baseurl }}/docs/customising/config/#staging_site">STAGING_SITE</a></code> + el valor <code>1</code>. + </p> + <p> + Si dispone de un servidor de pruebas, los entornos de sistema de sus servidores de pruebas y de + producción deberían ser idénticos. + </p> + <p> + En ningún caso debería necesitar editar código directamente en sus servidores de producción y de pruebas. + Le recomendamos encarecidamente el uso del + <a href="{{ page.baseurl }}/docs/installing/deploy/">mecanismo de implementación</a> de Alaveteli + (mediante Capistrano) para efectuar cambios en ellos. + </p> + </dd> + + <dt> + <a name="state">estado</a> + </dt> + <dd> + Cada <a href="#request" class="glossary__link">solicitud</a> pasa por distintos + <strong>estados</strong> a medida que progresa a través del sistema. + Los estados ayudan a los administradores de Alaveteli, así como al público, + a comprender la situación actual respecto a cualquier solicitud y a saber qué + acción se requiere en cada momento. + <p> + Los estados disponibles pueden personalizarse dentro del + <a href="#theme" class="glossary__link">tema</a> de su sitio. + </p> + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + <a href="{{ page.baseurl }}/docs/customising/states/">Estados de ejemplo de WhatDoTheyKnow</a> + (sitio basado en Alaveteli en funcionamiento en el Reino Unido). + </li> + <li> + Como comparación, consulte los <a href="{{ page.baseurl }}/docs/customising/states_informatazyrtare/">estados de ejemplo de InformataZyrtare</a> + (sitio basado en Alaveteli en funcionamiento en Kosovo). + </li> + <li> + Para personalizar o añadir sus propios estados, consulte la <a href="{{ page.baseurl }}/docs/customising/themes/#personalizar-los-estados-de-solicitud">personalización de los estados de solicitud</a>. + </li> + </ul> + </div> + </dd> + + <dt> + <a name="theme">tema</a> + </dt> + <dd> + Se denomina <strong>tema</strong> al conjunto de modificaciones realizadas en las plantillas + y en el código que proporcionan al sitio un aspecto o un comportamiento distintos + al predeterminado. Normalmente necesitará un tema para que Alaveteli muestre su propia marca. + <div class="more-info"> + <p>Más información:</p> + <ul> + <li> + <a href="{{ page.baseurl }}/docs/customising/themes/">Información sobre los temas</a>. + </li> + </ul> + </div> + </dd> + +</dl> diff --git a/es/docs/index.md b/es/docs/index.md new file mode 100644 index 000000000..5347c7382 --- /dev/null +++ b/es/docs/index.md @@ -0,0 +1,33 @@ +--- +layout: es/page +title: Bienvenido +--- + +# Documentación de Alaveteli + +<p class="lead"> + Esta es la documentación de Alaveteli, + una plataforma de información pública de código abierto + creada por <a href="https://www.mysociety.org">mySociety</a>. +</p> + +## ¿Nuevo en Alaveteli? + +Ha encontrado la documentación de Alaveteli. + +* Aprenda sobre el proyecto en [www.alaveteli.org](http://www.alaveteli.org). + +* Lea [Turbo Transparency](/assets/files/Turbo-Transparency-v1.0.pdf), un documento sobre cómo y por qué utilizar Alaveteli para sistemas de información pública. + +* Lea la [guía de inicio]({{ page.baseurl }}/docs/getting_started/). + +**La documentación incluye la +[instalación]({{ page.baseurl }}/docs/installing/), la +[personalización]({{ page.baseurl }}/docs/customising/) y el +[funcionamiento]({{ page.baseurl }}/docs/running/) de su propio sitio basado en Alaveteli.** + +Si desea efectuar cambios en el código fuente, también contamos con la +[documentación para desarrolladores]({{ page.baseurl }}/docs/developers/). + +Si representa a una organización que desea utilizar Alaveteli en su jurisdicción o es usted un desarrollador interesado en colaborar en la elaboración del software, +[contacte con nosotros]({{ page.baseurl }}/community/). diff --git a/es/docs/installing/ami.md b/es/docs/installing/ami.md new file mode 100644 index 000000000..3c91aaf74 --- /dev/null +++ b/es/docs/installing/ami.md @@ -0,0 +1,159 @@ +--- +layout: es/page +title: Instalación desde el AMI +--- + +# Instalación con EC2 de Amazon + +<p class="lead"> + Hemos creado una Amazon Machine Image (AMI) para que pueda efectuar el despliegue + rápidamente en EC2 de Amazon. Resulta práctico si, por ejemplo, solamente desea evaluar Alaveteli. +</p> + +Existen [otras formas de instalar Alaveteli]({{ page.baseurl }}/docs/installing/). + +## Instalación con nuestra AMI + +Para ayudarle a probar Alaveteli, hemos creado una AMI con una instalación básica de +Alaveteli, que puede utilizar para crear un servidor funcional en una implementación de EC2 +de Amazon. Se creará una implementación que funcionará como +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">servidor de desarrollo</a>. +Si desea crear un +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">servidor de producción</a>, +deberá +[modificar la configuración]({{ page.baseurl }}/docs/customising/config/#staging_site). + +<div class="attention-box"> + <p> + <strong>Qué incluye el AMI:</strong> + El AMI le ofrece exactamente lo mismo que el + <a href="{{ page.baseurl }}/docs/installing/script/">script de instalación</a>. + Obtiene un sitio web basado en Alaveteli implementado con Rails en el servidor + de aplicaciones Thin con Nginx, utilizando la base de datos PostgreSQL. Todo ello + sobre los servidores EC2 de Amazon, listo para ser + <a href="{{ page.baseurl }}/docs/customising/">configurado y personalizado</a>. + </p> +</div> + +Las implementaciones de Amazon se clasifican por tamaños. Lamentablemente la implementación *Micro* +no tiene memoria suficiente para que Alaveteli funcione y este es el único tamaño disponible +en Amazon para su uso gratuito. Necesitará la implementación *Small* o una superior, por la que +Amazon le facturará el importe correspondiente. + +### Uso de los servicios web de Amazon + +Para ello necesitará: + + * Una cuenta de Amazon + * Un par de claves SSL (las pantallas del servicio web de Amazon le guiarán al respecto) + +Si aún no dispone de estos elementos, deberá crearlos. Consulte la introducción de Amazon sobre el +[funcionamineto de un servidor virtual en AWS](http://docs.aws.amazon.com/gettingstarted/latest/awsgsg-intro/gsg-aws-virtual-server.html). + +### Lance la implementación + +Una vez haya iniciado sesión en el servicio de Amazon y haya navegado hasta la consola +**EC2 Management Console**, puede lanzar la implementación. Si prefiere hacerlo manualmente, +encontrará el AMI en la región «EU West (Ireland)» con el ID +`ami-baf351cd` y el nombre «Basic Alaveteli installation 2014-10-06». +Alternativamente puede utilizar este enlace: + +<p class="action-buttons"> + <a href="https://console.aws.amazon.com/ec2/home?region=eu-west-1#launchAmi=ami-baf351cd" class="button">Lanzar + implementación con AMI de instalación de Alaveteli</a> +</p> + +Cuando se lance la implementación, lo primero que deberá elegir es el *tipo* de implementación. +Recuerde que el tipo *Micro* no dispone de memoria suficiente para ejecutar +Alaveteli, así que deberá elegir al menos *Small* o *Medium*. Estos tipos no están +disponibles en Amazon para su uso gratuito. + +Una vez creada la implementación, la interfaz de Amazon le ofrecerá numerosas opciones +de configuración. En general puede aceptar las opciones predeterminadas para todo, +excepto para los grupos de seguridad. Resulta seguro hacer clic en **Review and +Launch** directamente (más que configurar manualmente todos los detalles de la +implementación) debido a que aún puede tener la oportunidad de configurar los grupos +de seguridad. Haga clic en **Edit Security Groups** en la página de resumen antes de +pulsar el gran botón **Launch**. + +Deberá elegir grupos de seguridad que permitan al menos HTTP, HTTPS y SSH entrantes +y también SMTP, si desea probar el correo entrante. Los ajustes de Amazon disponibles +aquí le permiten especificar las direcciones IP desde las que su implementación aceptará +solicitudes. Es una buena práctica restringirlas (si duda, elija una fuente *Source* +de «My IP» para todas ellas, excepto para las conexiones HTTP entrantes, para las que +deberá definir *Source* como «Anywhere»). Puede modificar cualquiera de estas opciones más +adelante, si necesita hacerlo. + +### Inicie sesión en el servidor (shell) + +Necesitará acceso a la consola shell de línea de comando del servidor para controlar y +configurar su sitio basado en Alaveteli. + +Para acceder al servidor, utilice `ssh` y el archivo `.pem` de su par de claves SSL. +Modifique el archivo `.pem` y el ID de implementación para que concuerden con los suyos en +este comando, que conecta con su servidor y le registra como el usuario llamado `ubuntu`. +Utilice este comando desde su propio equipo para iniciar sesión en el servidor: + + ssh -i path-to/your-key-pair.pem ubuntu@instance-id.eu-west-1.compute.amazonaws.com + +No se le solicitará ninguna contraseña porque el archivo `.pem` suministrado con la +opción `-i` contiene la autorización que concuerda con la ubicada en el otro extremo, +en el servidor. Iniciará sesión en el terminal shell de su nuevo servidor de Alaveteli +y podrá introducir comandos Unix en él. + +### Prueba de humo: inice Alavateli + +Debe configurar su sitio basado en Alavateli, pero si solo desea ver si su implementación +funciona correctamente, *puede* arrancarla directamente. Lo ideal sería omitir este +paso e ir directamente a la configuración... Pero sabemos que la mayoría de personas +prefieren ver algo en el navegador primero. ;-) + +En el terminal shell de línea de comando, como usuario `ubuntu`, inicie Alaveteli ejecutando: + + sudo service alaveteli start + +Encuentre la URL de «DNS público» en su implementación de EC2 desde la consola AWS y acceda a +ella en el navegador. Tendrá la forma +`http://your-ec2-hostname.eu-west-1.compute.amazonaws.com`. Aquí verá su sitio basado en +Alaveteli. + +Su sitio aún no está configurado, así que *esto no es seguro* (por ejemplo, aún no ha +definido sus propias contraseñas para acceder a la interfaz de administración), así que, una vez +haya visto el sitio en funcionamiento, detenga el sitio basado en Alaveteli con: + + sudo service alaveteli stop + + +### Usuarios de shell: `ubuntu` y `alaveteli` + +Cuando inicia sesión en la consola shell de línea de comando de su implementación, debe hacerlo +como usuario `ubuntu`. Este usuario puede utilizar los permisos `sudo` libremente para ejecutar comandos +como root. Sin embargo, el código en realidad es propiedad (y se ejecuta a través) del usuario `alaveteli`. + +Necesitará +[personalizar la configuración del sitio]({{ page.baseurl }}/docs/customising/config/). +Para ello, inicie sesión en su servidor de EC2 y edite el archivo de configuración `general.yml`. + +El archivo de configuración que necesita editar es +`/var/www/alaveteli/alaveteli/config/general.yml`. Por ejemplo, utilice el +editor `nano` (como usuario `alaveteli`) de este modo: + + ubuntu@ip-10-58-191-98:~$ sudo su - alaveteli + alaveteli@ip-10-58-191-98:~$ cd alaveteli + alaveteli@ip-10-58-191-98:~/alaveteli$ nano config/general.yml + +Tras efectuar los cambios en este archivo, necesitará iniciar el servidor de aplicaciones +(utilice `restart` en lugar de `start` si ya se halla en funcionamiento): + + alaveteli@ip-10-58-191-98:~/alaveteli$ logout + ubuntu@ip-10-58-191-98:~$ sudo service alaveteli start + +Su sitio estará funcionando en la URL de nuevo, que tiene la forma +`http://your-ec2-hostname.eu-west-1.compute.amazonaws.com`. + +Si tiene algún problema o alguna consulta, indíquelo en al [lista de correo de desarrollo de Alaveteli](https://groups.google.com/forum/#!forum/alaveteli-dev) o [informe de un error](https://github.com/mysociety/alaveteli/issues?state=open). + + +##¿Qué hacer ahora? + +Consulte los [siguientes pasos]({{ page.baseurl }}/docs/installing/next_steps/). diff --git a/es/docs/installing/deploy.md b/es/docs/installing/deploy.md new file mode 100644 index 000000000..aa90ca479 --- /dev/null +++ b/es/docs/installing/deploy.md @@ -0,0 +1,194 @@ +--- +layout: es/page +title: Despliegue +--- + +# Despliegue de Alaveteli + +<p class="lead"> + A pesar de que puede instalar Alaveteli y simplemente modificar la plataforma cuando lo necesite, + le recomendamos adoptar una forma de <strong>despliegue</strong> automático, + especialmente en su + <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">servidor de producción</a>. + Alaveteli proporciona un mecanismo de despliegue mediante el uso de Capistrano. +</p> + +## ¿Por qué realizar un despliegue? + +A pesar de que puede [instalar Alaveteli]({{ page.baseurl }}/docs/installing/) de diversas +maneras, una vez se halle en funcionamiento, tarde o temprano necesitará efectuar cambios +en el sitio. Un ejemplo común es la actualización del sitio cuando publicamos una nueva +versión. + +El mecanismo de despliegue se encarga de situar todos los archivos necesarios en su lugar +correspondiente, de forma que cuando necesite publicar los cambios no corra el riesgo de +olvidar actualizar todos los archivos modificados ni de romper la configuración accidentalmente. +En su lugar, el despliegue hace todo esto de forma automática. También es más eficiente +debido a que resulta más rápido que llevar a cabo los cambios o la copia de archivos manualmente, +de forma que su sitio dejará de funcionar durante el menor tiempo posible. + +Le **recomendamos encarecidamente** que utilice un mecanismo de despliegue para su +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">servidor de producción</a> +y, si utiliza uno, para su +<a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">servidor de pruebas</a> también. + +## Capistrano + +<a href="{{ page.baseurl }}/docs/glossary/#capistrano" class="glossary__link">Capistrano</a> +se incluye en Alaveteli como un sistema de despliegue estándar. + +El principio básico de Capistrano consiste en ejecutar comandos `cap [do-something]` +en su equipo local y Capistrano se conecta con el servidor (mediante +`SSH`) y efectua en él la tarea correspondiente en su lugar. + +### Configuración + +Capistrano requiere la configuración de ciertos detalles en ambos extremos, es decir, +en el servidor donde desea que funcione Alaveteli y en su equipo local. + +* *El servidor* es la máquina en la que se pondrá en funcionamiento la implementación de + de Alaveteli que está desplegando. + +* Su *equipo local* puede ser su portátil o un dispositivo similar, así como aquellos que + pertenezcan a cualquier miembro de su equipo con permisos para realizar despliegues. + +Para permitir que el mecanismo de despliegue de Capistrano funcione, necesitará configurar +el servidor de modo que la aplicación de Alaveteli reciba servicio desde un directorio llamado +`current`. Una vez hecho esto, desplegar una nueva versión consistirá esencialmente +en crear un directorio hermano con marca de tiempo respecto al directorio `current` y +cambiar el enlace simbólico `current` desde el antiguo directorio con marca de tiempo al nuevo. +Las opciones que deban persistir entre despliegues, como archivos de configuración, se mantendrán +en un directorio compartido `shared` ubicado en el mismo nivel y enlazado simbólicamente desde cada +directorio de despliegue con marca de tiempo. + +Estamos [trabajando para facilitar este proceso](https://github.com/mysociety/alaveteli/issues/1596), +pero de momento, este es el proceso manual que necesita seguir para configurar este mecanismo de +despliegue. Recuerde que solo debe hacer esto una vez para configurarlo y que después podrá +efectuar despliegues con gran facilidad (consulte el [uso a continuación](#uso)). + +En primer lugar, en el servidor: + +* [Instale Alaveteli]({{ page.baseurl }}/docs/installing/). +* Otorgue al usuario de Unix que ejecuta Alaveteli la capacidad de conectar a su servidor por SSH. Puede darle una contraseña o, preferentemente, definir claves SSH para que pueda acceder mediante SSH desde su equipo local al servidor: + * Para proporcionarle una contraseña (si aún no dispone de una): `sudo passwd [UNIX-USER]`. Almacene esta contraseña de forma segura en su equipo local, por ejemplo, en un gestor de contraseñas. + * Para definir claves SSH, siga las instrucciones de la [documentación de Capistrano](http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/). No hay necesidad de configurar claves SSH para el repositorio de git, ya que es público. +* Asegúrse de que el usuario de Unix que pone en funcionamiento Alaveteli tiene permisos de escritura en el directorio raíz de su aplicación Alaveteli. +* Mueva la aplicación Alaveteli a un lugar temporal del servidor, como su directorio de inicio + (temporalmente su sitio no será accesible hasta que el despliegue ubique los nuevos archivos + en su lugar correspondiente). + +A continuación, en su equipo local: + +* Instale Capistrano: + * Capistrano requiere Ruby 1.9 o superior y puede instalarse con RubyGems. + * Ejecute `gem install capistrano`. +* Instale bundler si aún no lo ha hecho. Para ello ejecute: `gem install bundler`. +* Compruebe el [repositorio de Alaveteli](https://github.com/mysociety/alaveteli/) + (necesita algunos de los archivos disponibles localmente, incluso aunque no ejecute + Alaveteli en esta máquina). +* Copie el archivo de ejemplo `config/deploy.yml.example` a `config/deploy.yml`. +* Ahora personalice las opciones de despliegue en dicho archivo: edite + `config/deploy.yml` adecuadamente, por ejemplo, editando el nombre del + servidor. Modifique también `deploy_to` para que coincida con la ruta actual de + instalación de Alaveteli en el servidor. Si ha utilizado el script de instalación, + será `/var/www/[HOST or alaveteli]/alaveteli`. Si utiliza el servidor de + aplicaciones Thin en lugar de Passenger (así será si ha ejecutado el script + de instalación), necesitará configurar `rails_app_server` como `thin` y + `rails_app_port` como el puerto en el que esté funcionando. Si ha utilizado el + script, será 3300. + + +* Cambie con el comando `cd` al repositorio de Alaveteli de destino (en caso contrario, los comandos `cap` que ejecutará + ahora no funcionarán). +* Aún en su equipo local, ejecute `cap -S stage=staging deploy:setup` para configurar Capistrano en el servidor. + +Si obtiene un error `SSH::AuthenticationFailed` y no se le solicita la contraseña del usuario de despliegue, puede tratarse de [un error](http://stackoverflow.com/questions/21560297/capistrano-sshauthenticationfailed-not-prompting-for-password) en la versión del paquete gem net-ssh 2.8.0. +Pruebe a instalar la versión 2.7.0 en su lugar: + + gem uninstall net-ssh + + gem install net-ssh -v 2.7.0 + +De vuelta en el servidor: + +* Copie los siguientes archivos de configuración desde la copia temporal de Alaveteli efectuada + al principio (tal vez en su directorio de inicio) al directorio `shared` que + Capistrano acaba de crear en el servidor: + * `general.yml` + * `database.yml` + * `rails_env.rb` + * `newrelic.yml` + * `aliases` ← si está utilizando Exim como MTA +* Si utiliza Exim como MTA, edite el archivo de alias `aliases` que acaba de copiar + para que la ruta hacia Alaveteli incluya el elemento `current`. Si es, por ejemplo, + `/var/www/alaveteli/alaveteli/script/mailin`, ahora deberá ser + `/var/www/alaveteli/alaveteli/current/script/mailin`. +* Copie los siguientes directorios desde su copia temporal de Alaveteli al directorio + `shared` creado por Capistrano en el servidor: + * `cache/` + * `files/` + * `lib/acts_as_xapian/xapiandbs` (copie este directorio directamente en `shared` de forma que se convierta en `shared/xapiandbs`) + * `log/` + +Ahora, de vuelta en su equipo local: + +* Asegúrese de que aún se halla en el repositorio de Alaveteli (si no es así, vuelva a él con el comando `cd`). +* Ejecute `cap -S stage=staging deploy:update_code` para obtener la salida del código en el servidor. +* Cree un directorio de despliegue en el servidor ejecutando *uno* de estos comandos: + * `cap deploy` si está desplegando un <a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">servidor de pruebas</a>. + * `cap -S stage=production deploy` para <a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">producción</a>. + +De vuelta en el servidor: + +* Actualice la configuración del servidor web (con Apache o Nginx) para añadir el elemento `current` + a la ruta desde la que está sirviendo a Alaveteli. Si ha efectuado la instalación utilizando el + script, esta acción consistirá en sustituir `/var/www/alaveteli/alaveteli/` por + `/var/www/alaveteli/alaveteli/current` en `/etc/nginx/sites-available/default`. +* Edite el archivo crontab del servidor para que las rutas que apuntan a los procesos cron también incluyan el + elemento `current`. Si ha utilizado el script de instalación, el archivo crontab se hallará en + `etc/cron.d/alaveteli`. +* Acutalice la configuración del MTA para que incluya el elemento `current` en las rutas que utiliza. + Si ha utilizado el script de instalación, el MTA será Postfix y deberá editar + `/etc/postfix/master.cf` para sustituir `argv=/var/www/alaveteli/alaveteli/script/mailin` por + `argv=/var/www/alaveteli/alaveteli/current/script/mailin`. + Si utiliza Exim como MTA, edite `etc/exim4/conf.d/04_alaveteli_options` + y actualice la variable `ALAVETELI_HOME` con la nueva ruta de Alaveteli. + Reinicie el MTA después de efectuar los cambios. + +* También necesitará actualizar la ruta hacia Alaveteli en sus [scripts init]({{ page.baseurl }}/docs/installing/manual_install/#demonios-y-procesos-cron). + Debería tener un script para ejecutar los tracks de alerta + (`/etc/init.d/foi-alert-tracks`) y, posiblemente, scripts para purgar + la caché de Varnish (`/etc/init.d/foi-purge-varnish`) y reiniciar el + servidor de aplicaciones (`/etc/init.d/alaveteli`). + +¡Buf, hemos terminado! + +Ahora puede eliminar la copia temporal de Alaveteli (tal vez ubicada en su directorio de inicio). + +### Uso + +Antes de lanzar ningún comando de Capistrano, cambie con el comando `cd` al destino del repositorio de +Alaveteli en su equipo local (porque buscará en él la configuración que ha definido). + +Asegúrese de que dispone de un archivo `config/deploy.yml` con los ajustes correctos para su +sitio. Si hay otras personas en su equipo que necesiten efectuar un despliegue, deberá +compartirlo con ellas también. Puede ser una buena idea mantener la última versión en un +[Gist](http://gist.github.com/). + +* Para efectuar un despliegue en un servidor de pruebas, ejecute sencillamente `cap deploy`. +* Para efectuar un despliegue en producción, ejecute `cap -S stage=production deploy`. + +Es posible que, después del despliegue, vea que el antiguo directorio de despliegue sigue ahí, +es decir, el que era `current` antes de sustituirlo por el nuevo. Por defecto el mecanismo +de despliegue guarda los cinco últimos despliegues. Ejecute +`cap deploy:cleanup` para eliminar versiones antiguas. + +Para obtener instrucciones de uso adicionales, consulte el [sitio web +de Capistrano](http://capistranorb.com/). + +### Esto no es lo que esperaba + +Si un despliegue falla o si descubre después de efectuarlo que en realidad la última versión +no estaba lista, ¡que no surja el pánico! Ejecute `cap deploy:rollback` +y devolverá `current` al despliegue anterior. + diff --git a/es/docs/installing/email.md b/es/docs/installing/email.md new file mode 100644 index 000000000..51b43c9c3 --- /dev/null +++ b/es/docs/installing/email.md @@ -0,0 +1,628 @@ +--- +layout: es/page +title: Instalación del MTA +--- + +# Instalación del MTA + +<p class="lead"> + Alaveteli envía y recibe correo. Necesitará configurar su servidor + de correo (MTA) para gestionarlo adecuadamente. Aquí ofrecemos ejemplos + para Postfix y Exim4, dos de los MTA más populares. +</p> + +## Cómo gestiona el correo Alaveteli + +### Correo de solicitud + +Cuando alguien realiza una solicitud de información pública a una autoridad a través de +Alaveteli, la aplicación envía un correo con la solicitud a la autoridad. + +La dirección `reply-to` del correo es un campo especial que indica que toda respuesta +debe dirigirse automáticamente de vuelta a Alaveteli, para que Alaveteli pueda +distinguir en qué solicitud debe mostrarse la respuesta recibida. Este comportamiento +requiere cierta configuración del MTA en el servidor donde se halla Alaveteli para +encaminar todos los correos a esta dirección especial con el objetivo de que Alaveteli +los gestione mediante su script `script/mailin`. Las direcciones especiales tienen +la siguiente estructura: + + <foi+request-3-691c8388@example.com> + +Partes de esta dirección son controladas con opciones incluidas en +`config/general.yml`: + + INCOMING_EMAIL_PREFIX = 'foi+' + INCOMING_EMAIL_DOMAIN = 'example.com' + +Si se produce algún error en Rails durante el procesamiento del correo, el script `script/mailin` devuelve un código de salida `75` al MTA. Postfix y Exim (y tal vez otros) entienden esta acción como una señal para que el MTA lo vuelva a intentar más tarde. Además, se envía por correo el rastro de pila a `CONTACT_EMAIL`. + +Las instalaciones de [producción]({{ page.baseurl }}/docs/glossary/#production) de Alaveteli deberían realizar copias de seguridad de los correos enviados a direcciones especiales. Puede configurar su MTA para realizar estas copias en un buzón de correo independiente. + +### Correo transaccional + +Alaveteli también envía correos a usuarios sobre sus solicitudes, para informarles cuando alguien ha respondido o solicitarles que realicen alguna acción. + +Configure la dirección desde la que se envían estos mensajes en la opción [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) de `config/general.yml`: + + CONTACT_EMAIL = 'team@example.com' + +La dirección contenida en [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) también es visible en varios lugares del sitio para que los usuarios puedan ponerse en contacto con el equipo que gestiona el sitio web. + +Debe configurar su MTA de forma que entregue el correo enviado a estas direcciones a los administradores del sitio para que puedan responder en consecuencia. + +### Correo de tracks + +Los usuarios suscritos a las actualizaciones del sitio, denominadas `tracks`, reciben correos cuando hay novedades que pueden interesarles. + +Configure la dirección desde la que se envían estos mensajes en la opción [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) ubicada en `config/general.yml`: + + TRACK_SENDER_EMAIL = 'track@example.com' + +### Gestión de rebotado automático (opcional) + +Debido a que [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) y [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) aparecen en la cabecera `From:` de los correos enviados desde Alaveteli, a veces reciben correos de respuesta, incluidos <a href="{{ page.baseurl }}/docs/glossary/#bounce-message">mensajes rebotados</a> y notificaciones de tipo «fuera de oficina». + +Alaveteli proporciona un script (`script/handle-mail-replies`) que gestiona los mensajes rebotados y las notificaciones de tipo «fuera de oficina» y reenvía los correos genuinos a los administradores. + +También evita que se sigan enviando correos de tracks a direcciones de correo de usuarios que parezcan tener problemas permanentes de entrega. + +Para utilizar la gestión automática de mensajes rebotados, asigne a [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) y a [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email) una dirección que filtrará a través de `script/handle-mail-replies`. Los mensajes que no sean de rebote o «fuera de oficina» se reenviarán a [`FORWARD_NONBOUNCE_RESPONSES_TO`]({{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to), opción en la que debe definir un alias de correo que apunte a la lista de administradores del sitio. + +Consulte las indicaciones específicas para su MTA sobre cómo llevar esto a cabo con [Exim]({{ page.baseurl }}/docs/installing/email#filtre-los-mensajes-entrantes-hacia-direcciones-de-administracin) y [Postfix]({{ page.baseurl }}/docs/installing/email#filtre-mensajes-entrantes-en-las-direcciones-de-administracin-del-sitio). + +_Nota:_ La gestión de rebotado no se aplica a los [correos de solicitud]({{ page.baseurl }}/docs/installing/email#correo-de-solicitud). Los mensajes rebotados de autoridades se añaden a la página de la solicitud para que el usuario pueda ver lo ocurrido. Los usuarios pueden pedir ayuda a los administradores del sitio para que se vuelva a enviar la solicitud, si es necesario. + + +--- + +<div class="attention-box"> + <ul> + <li>Los comandos incluidos en este manual requieren permisos de usuario root.</li> + <li>Los comandos deben ejecutarse en el terminal o mediante SSH.</li> + </ul> +</div> + +Asegúrese de seguir las indicaciones correctas para el MTA específico que utilice: + +* [Postfix](#configuracin-de-ejemplo-con-postfix) +* [Exim4](#configuracin-de-ejemplo-con-exim4) + +## Configuración de ejemplo con Postfix + +Esta sección muestra un ejemplo de configuración de su MTA con +**Postfix**. Si utiliza Exim4 en lugar de Postfix, consulte la +[configuración de ejemplo con Exim4](#configuracin-de-ejemplo-con-exim4). + +### Instale Postfix + + # Instale debconf para poder configurar de forma no interactiva + apt-get -qq install -y debconf >/dev/null + + # Establezca la configuración predeterminada «Internet Site» + echo postfix postfix/main_mailer_type select 'Internet Site' | debconf-set-selections + + # Defina el nombre de host (sustituya example.com por su nombre de host) + echo postfix postfix/mail_name string "example.com" | debconf-set-selections + + # Instale Postfix + DEBIAN_FRONTEND=noninteractive apt-get -qq -y install postfix >/dev/null + +### Configure Postfix + + +#### Redirija el correo entrante de solicitudes en Alaveteli + +Si el usuario de Unix que va a poner el sitio en funcionamiento +es `alaveteli` y el directorio donde está instalado Alaveteli es +`/var/www/alaveteli`, cree una ruta para la recepción de correos +de solicitudes: + + cat >> /etc/postfix/master.cf <<EOF + alaveteli unix - n n - 50 pipe + flags=R user=alaveteli argv=/var/www/alaveteli/script/mailin + EOF + +El usuario de Unix debe tener permisos de escritura en el directorio de instalación de Alaveteli. + +Configure Postfix para que acepte mensajes de entrega local cuando los destinatarios sean: + + - definidos por una expresión regular en `/etc/postfix/transports` + - cuentas locales de UNIX + - alias locales especificados como expresiones regulares en `/etc/postfix/recipients` + +<!-- Comment to enable markdown to render code fence under list --> + + cat >> /etc/postfix/main.cf <<EOF + transport_maps = regexp:/etc/postfix/transports + local_recipient_maps = proxy:unix:passwd.byname regexp:/etc/postfix/recipients + EOF + +Actualice la línea `mydestination` ubicada en `/etc/postfix/main.cf` (encargada de definir a qué dominios se efectuarán entregas locales). Añada su dominio, no `example.com`, al principio de la lista: + + mydestination = example.com, localhost.localdomain, localhost + +<div class="attention-box"> +Este manual presupone que ha definido <a href="{{ page.baseurl }}/docs/customising/config/#incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> como <code>foi+</code> en <code>config/general.yml</code> +</div> + +Redirija todo el correo entrante cuya dirección `To:` empiece por `foi+` hacia la ruta de `alaveteli` (`/var/www/alaveteli/script/mailin`, como se especifica en `/etc/postfix/master.cf` en el inicio de esta sección): + + cat > /etc/postfix/transports <<EOF + /^foi.*/ alaveteli + EOF + +#### Realice copias de seguridad de los correos de solicitudes + +Puede copiar todo el correo entrante de Alaveteli en una cuenta para copias de seguridad ubicada en un buzón independiente, por si se produce algún problema. + +Cree un usuario de Unix `backupfoi`: + + adduser --quiet --disabled-password \ + --gecos "Alaveteli Mail Backup" backupfoi + +Añada la siguiente línea a `/etc/postfix/main.cf`: + + recipient_bcc_maps = regexp:/etc/postfix/recipient_bcc + +Configure el correo enviado a una dirección con el prefijo `foi+` para que se envíe al usuario de la copia de seguridad: + + cat > /etc/postfix/recipient_bcc <<EOF + /^foi.*/ backupfoi + EOF + + +#### Defina los destinatarios válidos para su dominio + +Cree `/etc/postfix/recipients` con el siguiente comando: + + cat > /etc/postfix/recipients <<EOF + /^foi.*/ this-is-ignored + /^postmaster@/ this-is-ignored + /^user-support@/ this-is-ignored + /^team@/ this-is-ignored + EOF + +La columna de la izquierda de este archivo especifica las expresiones regulares que +definen direcciones para las que se aceptará correo. Los valores de la parte derecha +son ignorados por Postfix. Aquí permitimos que Postfix acepte correos hacia +direcciones especiales de Alaveteli y hacia `postmaster@example.com`, +`user-support@example.com` y `team@example.com`. + +El dominio `@example.com` se define en `mydestination`, como se ha mostrado anteriormente. Esta variable debería incluir su propio dominio. + +#### Defina grupos de destinatarios de correo de contacto + +Para definir los grupos de destinatarios de las direcciones de correo `postmaster@`, `team@` y `user-support@` en su dominio, añada registros de alias para ellos en `/etc/aliases`: + + cat >> /etc/aliases <<EOF + team: user@example.com, otheruser@example.com + user-support: team + EOF + +#### Descarte correo entrante no deseado + +Configure Postfix para que descarte los mensajes enviados a la dirección [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix), cuyo valor por defecto es `do-not-reply-to-this-address`: + + cat >> /etc/aliases <<EOF + # Utilizamos esta opción como campo remitente para algunos mensajes + # en los que no nos interesa la confirmación de entrega + do-not-reply-to-this-address: /dev/null + EOF + +Si dispone de una dirección [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix), sustituya `do-not-reply-to-this-address` con la dirección que ha configurado. + +#### Filtre mensajes entrantes en las direcciones de administración del sitio + +Puede utilizar la [gestión automática de rebotado]({{ page.baseurl }}/docs/installing/email/#gestin-de-rebotado-automtico-opcional) de Alaveteli para filtrar mensajes rebotados enviados a [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) +y a [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email). + + +<div class="attention-box"> +Este manual presupone que ha configurado las opciones siguientes en <code>config/general.yml</code>: + + <ul> + <li><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> + </ul> + +Modifique los siguientes ejemplos con las direcciones que ha configurado: +</div> + +Cree un nuevo flujo de gestión de respuestas: + + cat >> /etc/postfix/master.cf <<EOF + alaveteli_replies unix - n n - 50 pipe + flags=R user=alaveteli argv=/var/www/alaveteli/script/handle-mail-replies + EOF + +_Nota:_ Sustituya `/var/www/alaveteli` con la ruta correcta de Alaveteli, si es necesario. + +Redirija el correo enviado a `user-support@example.com` hacia `alaveteli_replies`: + + cat >> /etc/postfix/transports <<EOF + /^user-support@*/ alaveteli_replies + EOF + +Finalmente, edite `/etc/aliases` para eliminar `user-support`: + + team: user@example.com, otheruser@example.com + +#### Registro + +Para que los registros de Postfix sean leídos correctamente desde +`script/load-mail-server-logs`, necesita aplicarles la función logrotate con una fecha +en el nombre de archivo. Como esta acción creará numerosos archivos de tipo logrotate (uno por día), +se recomienda almacenarlos en un directorio específico para ellos. + +También necesitará indicarle a Alaveteli dónde se almacenan los archivos de registro y que se hallan en formato +Postfix. Actualice +[`MTA_LOG_PATH`]({{ page.baseurl }}/docs/customising/config/#mta_log_path) y +[`MTA_LOG_TYPE`]({{ page.baseurl }}/docs/customising/config/#mta_log_type) en `config/general.yml`: + + MTA_LOG_PATH: '/var/log/mail/mail.log-*' + MTA_LOG_TYPE: "postfix" + +Configure Postfix para que efectúe los registros en su propio directorio: + +##### Debian + +En `/etc/rsyslog.conf`, defina: + + mail.* -/var/log/mail/mail.log + + +##### Ubuntu + +En `/etc/rsyslog.d/50-default.conf`, defina: + + mail.* -/var/log/mail/mail.log + +##### Configure logrotate + +Configure logrotate para que rote los archivos de registro en el formato requerido: + + cat >> /etc/logrotate.d/rsyslog <<EOF + /var/log/mail/mail.log + { + rotate 30 + daily + dateext + missingok + notifempty + compress + delaycompress + sharedscripts + postrotate + reload rsyslog >/dev/null 2>&1 || true + endscript + } + EOF + +#### Aplique los cambios + +Como usuario root, aplique todos estos cambios con los siguientes comandos: + + service rsyslog restart + + newaliases + postmap /etc/postfix/transports + postmap /etc/postfix/recipients + postmap /etc/postfix/recipient_bcc + postfix reload + +#### Solución de problemas (Postfix) + +Para probar la entrega de correo, ejecute: + + $ /usr/sbin/sendmail -bv foi+request-1234@example.com + +Asegúrese de sustituir `example.com` por su dominio. Este comando indica +si el envío de correo a `foi\+.*example.com` y a la cuenta de la copia de seguridad +funciona (no envía ningún correo para probarlo). Si funciona, debería recibir +un correo de informe de entrega con un texto similar a: + + <foi+request-1234@example.com>: delivery via alaveteli: + delivers to command: /var/www/alaveteli/script/mailin + <backupfoi@local.machine.name>: delivery via local: delivers to mailbox + +También puede probar otros alias que haya configurado para su dominio en +esta sección, con el objetivo de comprobar si entregarán el correo tal como espera. Por +ejemplo, puede probar el redireccionamiento de mensajes rebotados del mismo modo. El texto +de este informe de entrega debería ser similar a: + + <user-support@example.com>: delivery via alaveteli_replies: delivers to command: /var/www/alaveteli/script/handle-mail-replies + + +Es posible que necesite instalar el paquete `mailutils` para leer el informe +de entrega utilizando el comando `mail` en un nuevo servidor: + + apt-get install mailutils + +Si los correos no son recibidos por su instalación de Alaveteli, encontrará más consejos +sobre errores de correo entrante en el apartado de [solución de problemas generales de correo]({{ page.baseurl }}/docs/installing/email#solucin-de-problemas-generales-de-correo). + + + +## Configuración de ejemplo con Exim4 + +Esta sección muestra un ejemplo de configuración de su MTA con +**Exim4**. Si utiliza Postfix en lugar de Exim4, consulte la +[configuración de ejemplo con Postfix](#configuracin-de-ejemplo-con-postfix). + + +### Instale Exim4 + +Instale Exim4: + + apt-get install exim4 + + +### Configure Exim4 + +#### Configure Exim para que reciba correo desde otros servidores + +Edite `/etc/exim4/update-exim4.conf.conf`. Defina las siguientes opciones (utilice su nombre de host, no `example.com`): + + dc_eximconfig_configtype='internet' + dc_other_hostnames='example.com' + dc_local_interfaces='0.0.0.0 ; ::1' + dc_use_split_config='true' + +Esta última línea indica a Exim que utilice los archivos de `/etc/exim4/conf.d` para configurarse a sí mismo. + +#### Defina las variables generales y las opciones de registro + +Cree `/etc/exim4/conf.d/main/04_alaveteli_options` con el comando: + + cat > /etc/exim4/conf.d/main/04_alaveteli_options <<'EOF' + ALAVETELI_HOME=/var/www/alaveteli + ALAVETELI_USER=alaveteli + log_file_path=/var/log/exim4/exim-%slog-%D + MAIN_LOG_SELECTOR==+all -retry_defer + extract_addresses_remove_arguments=false + EOF + +Esta acción configura `ALAVETELI_HOME` y `ALAVETELI_USER` para su uso en otros archivos de configuración y define las opciones de registro. + +- **`ALAVETELI_HOME`:** define el directorio de instalación de Alaveteli. +- **`ALAVETELI_USER`:** debería ser el usuario de Unix que va a poner en funcionamiento su sitio. Debe tener permisos de escritura en `ALAVETELI_HOME`. +- **`log_file_path`:** El nombre y la ubicación de los archivos de registro creados por Exim deben coincidir con los esperados por el script `load-mail-server-logs`. +- **`MAIN_LOG_SELECTOR`:** El script `check-recent-requests-sent` espera que los registros contengan la información de remitente `from=<...>`, por lo que aumentamos la minuciosidad de los registros. +- **`extract_addresses_remove_arguments`:** si se le asigna el valor `false`, cuando el paquete gem `mail` utilice la opción de línea de comando `-t` para especificar las direcciones de entrega, Exim interpretará que dichas direcciones deben añadirse, no eliminarse. Consulte [esta publicación de `mail`](https://github.com/mikel/mail/issues/70) para obtener más información. + +<div class="attention-box"> +Nota: Si está editando una configuración existente de Exim en lugar de crear una nueva, compruebe la opción <code>untrusted_set_sender</code> en <code>/etc/exim4/conf.d/main/02_exim4-config_options</code>. Por defecto, los usuarios que no son de confianza en Exim solo pueden definir una dirección de remitente vacía para declarar que un mensaje no debe generar nunca ningún rebote. <code>untrusted_set_sender</code> puede definirse como una lista de patrones de dirección, de forma que los usuarios que no sean de confianza puedan definir direcciones de remitente que concuerden con alguno de los patrones listados. Si especifica una lista de patrones, también necesitará añadir <code>ALAVETELI_USER</code> a la lista <code>MAIN_TRUSTED_USERS</code> para permitir que se defina la ruta de retorno del correo saliente. Esta opción también se encuentra en <code>/etc/exim4/conf.d/main/02_exim4-config_options</code> en una configuración dividida. Busque la línea que empieza por <code>MAIN_TRUSTED_USERS</code>, similar a: + + <pre><code>MAIN_TRUSTED_USERS = uucp</code></pre> + +y añada el usuario de Alaveteli: + + <pre><code>MAIN_TRUSTED_USERS = uucp : alaveteli</code></pre> + + Si <code>untrusted_set_sender</code> está definido como <code>*</code>, los usuarios que no sean de confianza podrán establecer direcciones de remitente sin restricciones, así que no será necesario añadir <code>ALAVETELI_USER</code> a la lista <code>MAIN_TRUSTED_USERS</code>. +</div> + + +#### Redirija el correo entrante de solicitudes desde Exim hacia Alaveteli + +En esta sección añadiremos una configuración al flujo de correo entrante para direcciones +especiales de Alaveteli hacia Alaveteli y también las enviaremos al buzón local de la copia de +seguridad. + +Cree el usuario de Unix `backupfoi`: + + adduser --quiet --disabled-password \ + --gecos "Alaveteli Mail Backup" backupfoi + +Especifique un `router` de Exim para las direcciones especiales de Alaveteli, que redirigirá los mensajes hacia Alaveteli mediante una ruta de transporte local: + + cat > /etc/exim4/conf.d/router/04_alaveteli <<'EOF' + alaveteli_request: + debug_print = "R: alaveteli for $local_part@$domain" + driver = redirect + data = ${lookup{$local_part}wildlsearch{ALAVETELI_HOME/config/aliases}} + pipe_transport = alaveteli_mailin_transport + EOF + +Cree `/etc/exim4/conf.d/transport/04_alaveteli`, que define las propiedades de la rita de transporte `transport` que entregará el correo a Alaveteli: + + cat > /etc/exim4/conf.d/transport/04_alaveteli <<'EOF' + alaveteli_mailin_transport: + driver = pipe + command = $address_pipe ${lc:$local_part} + current_directory = ALAVETELI_HOME + home_directory = ALAVETELI_HOME + user = ALAVETELI_USER + group = ALAVETELI_USER + EOF + + +<div class="attention-box"> + Este manual presupone que ha definido <a href="/docs/customising/config/#incoming_email_prefix"><code>INCOMING_EMAIL_PREFIX</code></a> como <code>foi+</code> en <code>config/general.yml</code>. +</div> + +Cree el archivo `config/aliases` que el `router` `alaveteli_request` de Exim obtendrá. Este archivo redirige el correo desde direcciones especiales a `script/mailin` y al usuario `backupfoi`. + + cat > /var/www/alaveteli/config/aliases <<'EOF' + ^foi\\+.*: "|/var/www/alaveteli/script/mailin", backupfoi + EOF + +_Nota:_ Sustituya `/var/www/alaveteli` con la ruta correcta de Alaveteli, si es necesario. + +#### Defina sus grupos de correo de destinatarios de contacto + +Para definir grupos de destinatarios de las direcciones de correo `team@` y `user-support@` de su dominio, añada registros de alias para ellos en `/var/www/alaveteli/config/aliases`: + + cat >> /var/www/alaveteli/config/aliases <<EOF + team: user@example.com, otheruser@example.com + user-support: team + EOF + +#### Descarte correo entrante no deseado + +Configure Exim para que descarte todos los mensajes enviados a la dirección [`BLACKHOLE_PREFIX`]({{ page.baseurl }}/docs/customising/config/#blackhole_prefix), cuyo valor predeterminado es `do-not-reply-to-this-address`. + + cat >> /var/www/alaveteli/config/aliases <<EOF + # Utilizamos esta opción como campo remitente para algunos mensajes + # en los que no nos interesa la confirmación de entrega + do-not-reply-to-this-address: :blackhole: + EOF + +_Nota:_ Sustituya `/var/www/alaveteli` con la ruta correcta de Alaveteli, si es necesario. + +#### Filtre los mensajes entrantes hacia direcciones de administración + +Puede utilizar la [gestión de rebotado automática]({{ page.baseurl }}/docs/installing/email/#gestin-de-rebotado-automtico-opcional) de Alaveteli para filtrar mensajes rebotados enviados a [`TRACK_SENDER_EMAIL`]({{ page.baseurl }}/docs/customising/config/#track_sender_email) +y a [`CONTACT_EMAIL`]({{ page.baseurl }}/docs/customising/config/#contact_email). + +<div class="attention-box"> +Este manual presupone que ha configurado lo siguiente en <code>config/general.yml</code>: + + <ul> + <li><a href="{{ page.baseurl }}/docs/customising/config/#contact_email">CONTACT_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#track_sender_email">TRACK_SENDER_EMAIL</a>: <code>user-support@example.com</code></li> + <li><a href="{{ page.baseurl }}/docs/customising/config/#forward_nonbounce_responses_to">FORWARD_NONBOUNCE_RESPONSES_TO</a>: <code>team@example.com</code></li> + </ul> + +Modifique los siguientes ejemplos con las direcciones que haya configurado. +</div> + +Modifique la línea `user-support` ubicada en `/var/www/alaveteli/config/aliases`: + + user-support: |/var/www/alaveteli/script/handle-mail-replies + +#### Registro + +Deberá indicar a Alaveteli dónde se almacenan los archivos de registro y que se hallan en formato Exim. Actualice [`MTA_LOG_PATH`]({{ page.baseurl }}/docs/customising/config/#mta_log_path) y [`MTA_LOG_TYPE`]({{ page.baseurl }}/docs/customising/config/#mta_log_type) en `config/general.yml`: + + MTA_LOG_PATH: '/var/log/exim4/exim-mainlog-*' + MTA_LOG_TYPE: 'exim' + + +#### Aplique los cambios en Exim + +Finalmente, ejecute los comandos: + + update-exim4.conf + service exim4 restart + +Si existe el archivo `/etc/exim4/exim4.conf`, `update-exim4.conf` +silenciosamente no hará nada. Algunas distribuciones incluyen este archivo. Si +es su caso, necesitará eliminarlo o renombrarlo antes de ejecutar `update-exim4.conf`. + + +#### Solución de problemas (Exim) + +Para probar la entrega de correo, ejecute como usuario con permisos (sustituyendo `example.com` por su nombre de dominio): + + exim4 -bt foi+request-1234@example.com + +Este comando debería indicarle qué routers están siendo procesados. Debería mostrarse algo similar a: + + $ exim4 -bt foi+request-1234@example.com + R: alaveteli for foi+request-1234@example.com + foi+request-1234@example.com -> |/var/www/alaveteli/script/mailin + transport = alaveteli_mailin_transport + R: alaveteli for backupfoi@your.machine.name + R: system_aliases for backupfoi@your.machine.name + R: userforward for backupfoi@your.machine.name + R: procmail for backupfoi@your.machine.name + R: maildrop for backupfoi@your.machine.name + R: lowuid_aliases for backupfoi@your.machine.name (UID 1001) + R: local_user for backupfoi@your.machine.name + backupfoi@your.machine.name + <-- foi+request-1234@example.com + router = local_user, transport = mail_spool + +Esta información indica que la parte encargada del redireccionamiento (que hace que los correos hacia +`foi\+.*@example.com` se reenvíen al script `mailin` de Alaveteli y a la cuenta +local de copia de seguridad) está funcionando. Puede probar el redireccionamiento +de los mensajes rebotados del mismo modo: + + exim4 -bt user-support@example.com + R: alaveteli for user-support@example.com + user-support@example.com -> |/var/www/alaveteli/script/handle-mail-replies + transport = alaveteli_mailin_transport + +Si los correos no son recibidos por su instalación de Alaveteli, encontrará más consejos sobre +errores de correo entrante en la siguiente sección. También existe una +fantástica [hoja de referencia de Exim](http://bradthemad.org/tech/notes/exim_cheatsheet.php) +en línea, que puede resultarle útil. + +## Solución de problemas generales de correo + +Primero necesita comprobar si su MTA está entregando los correos entrantes +correspondientes al comando `script/mailin`. Existen varios formas de +configurar su MTA para que lo haga. Hemos documentado una forma de hacerlo +[en Exim]({{ page.baseurl }}/docs/installing/email/#configuracin-de-ejemplo-con-exim4), incluyendo [un comando que puede utilizar]({{ page.baseurl }}/docs/installing/email/#solucin-de-problemas-exim) +para comprobar que el redireccionamiento del correo está configurado correctamente. +También hemos documentado una forma de configurar [Postfix]({{ page.baseurl }}/docs/installing/email/#configuracin-de-ejemplo-con-postfix), con un [comando de depuración]({{ page.baseurl }}/docs/installing/email/#solucin-de-problemas-postfix) similar. + +En segundo lugar necesitará probar que el propio script de correo está funcionando +correctamente mediante su ejecución desde la línea de comando. Para ello, encuentre +una dirección "To" válida para una solicitud en su sistema. Puede hacer esto a través +de la interfaz de administración de su sitio o desde la línea de comando, de este modo: + + $ ./script/console + Loading development environment (Rails 2.3.14) + >> InfoRequest.find_by_url_title("why_do_you_have_such_a_fancy_dog").incoming_email + => "request-101-50929748@localhost" + +Ahora tome el origen de un correo válido (hay algunos correos de muestra en +`spec/fixtures/files/`), edite la cabecera `To:` para que concuerde con dicha dirección +y después rediríjalo a través del script de correo. Un código de salida distinto de +cero significa que se ha producido un error. Por ejemplo: + + $ cp spec/fixtures/files/incoming-request-plain.email /tmp/ + $ perl -pi -e 's/^To:.*/To: <request-101-50929748@localhost>/' /tmp/incoming-request-plain.email + $ ./script/mailin < /tmp/incoming-request-plain.email + $ echo $? + 75 + +El script `mailin` envía por correo los detalles de todo error a +`CONTACT_EMAIL` (definido en el archivo `general.yml`). Un problema común +consiste en que el usuario que ejecuta el MTA to tiene permisos de escritura en +`files/raw_emails/`. + +Si todo parece correcto a nivel local, deberá comprobar también desde otro ordenador +conectado a internet que el servidor DNS para su dominio indica que su servidor +de Alaveteli está gestionando el correo y que su servidor está recibiendo correo +en el puerto 25. El siguiente comando es una consulta para preguntar qué servidor +está gestionando el correo para el dominio `example.com`, que recibe como respuesta +`mail.example.com`. + + $ host -t mx example.com + example.com mail is handled by 5 mail.example.com. + +Este comando siguiente prueba la conexión con el puerto 25, el puerto SMTP +estándar, en `mail.example.com`, y es rechazada. + + $ telnet mail.example.com 25 + Trying 10.10.10.30... + telnet: connect to address 10.10.10.30: Connection refused + +La siguiente transcripción muestra una conexión satisfactoria en la que el servidor +acepta el correo para su entrega (los comandos que debe introducir se indican con +el carácter `$`): + + $ telnet 10.10.10.30 25 + Trying 10.10.10.30... + Connected to 10.10.10.30. + Escape character is '^]'. + 220 mail.example.com ESMTP Exim 4.80 Tue, 12 Aug 2014 11:10:39 +0000 + $ HELO X + 250 mail.example.com Hello X [10.10.10.1] + $ MAIL FROM: <test@local.domain> + 250 OK + $ RCPT TO:<foi+request-1234@example.com> + 250 Accepted + $ DATA + 354 Enter message, ending with "." on a line by itself + $ Subject: Test + $ + $ Este es un correo de prueba. + $ . + 250 OK id=1XHA03-0001Vx-Qn + QUIT + diff --git a/es/docs/installing/index.md b/es/docs/installing/index.md new file mode 100644 index 000000000..29de03dad --- /dev/null +++ b/es/docs/installing/index.md @@ -0,0 +1,65 @@ +--- +layout: es/page +title: Instalación +--- + +# Instalación de Alaveteli + +<p class="lead"> + Existen diversas formas de instalar Alaveteli. + Hemos elaborado una Amazon Machine Image (AMI) para que pueda desplegar rápidamente + en EC2 de Amazon (práctico si solamente desea evaluarlo, por ejemplo). + Si prefiere utilizar su propio servidor, existe un script de instalación que + efectúa la mayor parte del trabajo, o también puede seguir las instrucciones de + instalación manual. +</p> + +## Antes de empezar + +Importante: necesita decidir si está instalando Alaveteli para su +<a href="{{ page.baseurl }}/docs/glossary/#development" class="glossary__link">desarrollo</a> o su +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">producción</a>. + +Un servidor de **desarrollo** en aquel donde modificará, personalizará y tal vez +experimentará mientras lo pone en funcionamiento. Siempre debería hacer esto en primer +lugar. En este entorno podrá ver mensajes de depuración y no necesitará preocuparse +demasiado sobre la eficiencia y el rendimiento del sitio (pues en realidad no +recibe gran cantidad de tráfico). + +Un servidor de **producción** es diferente: le interesa que el servidor de producción funcione +de la forma más eficiente posible, así que opciones tales como la memoria caché se activan +y otras como los mensajes de depuración se desactivan. Es importante que pueda implementar cambios +rápida y eficientemente en un servidor de producción, por lo que recomendamos que considere también + el uso de un [mecanismo de despliegue]({{ page.baseurl }}/docs/installing/deploy/). + +Lo ideal sería que también tuviera un +<a href="{{ page.baseurl }}/docs/glossary/#staging" class="glossary__link">servidor de pruebas</a>, +utilizado exclusivamente para probar el código nuevo en un entorno idéntico a su servidor +de producción antes de publicarlo. + +Si tiene dudas, probablemente deba utilizar un servidor de desarrollo. Póngalo en marcha, juegue +con él, personalícelo y, más adelante, puede instalarlo como un servidor de producción. + +## Despliegue + +Si está utilizando un servidor de producción, le **recomendamos encarecidamente** el +uso del [mecanismo de despliegue]({{ page.baseurl }}/docs/installing/deploy/) Capistrano +incluido en Alaveteli. Configúrelo y nunca tendrá que editar archivos en estos servidores, +pues Capistrano se encargará de ello en su lugar. + +## Instalación del código principal + +* [Instalación en un entorno de desarrollo virtual de Vagrant]({{ page.baseurl }}/docs/installing/vagrant/): una buena elección para desarrollo y para poder jugar con el sitio. +* [Instalación con EC2 de Amazon]({{ page.baseurl }}/docs/installing/ami/) utilizando nuesta AMI. +* [Instalación utilizando el script]({{ page.baseurl }}/docs/installing/script/) que efectúa la instalación completa en su propio servidor. +* [Instalación manual]({{ page.baseurl }}/docs/installing/manual_install/): instrucciones paso a paso. + +Si está configurando un servidor de desarrollo en MacOS X, también disponemos de +[instrucciones de instalación para MacOS]({{ page.baseurl }}/docs/installing/macos/). + +## Otros datos sobre la instalación + +Alaveteli necesita poder enviar y recibir correo. Si efectúa la instalación manual, necesitará [configurar su +MTA (servidor de correo) en consecuencia]({{ page.baseurl }}/docs/installing/email/). Los otros métodos de instalación lo harán automáticamente. + +* [Instalación del MTA]({{ page.baseurl }}/docs/installing/email/). diff --git a/es/docs/installing/macos.md b/es/docs/installing/macos.md new file mode 100644 index 000000000..4909fda53 --- /dev/null +++ b/es/docs/installing/macos.md @@ -0,0 +1,164 @@ +--- +layout: es/page +title: Instalación en MacOS X +--- + +# Instalación en MacOS X + +<p class="lead"> + No recomendamos el uso de OS X en producción, pero si desea configurar + Alaveteli en su Mac para su desarrollo, estas indicaciones le serán + de ayuda. +</p> + +Existen [otras formas de instalar Alaveteli]({{ page.baseurl }}/docs/installing/). + +## MacOS X 10.7 + +Siga estas instrucciones para poner en marcha Alaveteli localmente en una máquina con OS X. Estas instrucciones se han probado con Xcode 4.1 en OS X Lion (10.7). No recomendamos el uso de OS X en producción. + +**Nota:** Este manual está incompleto actualmente. Ayúdenos publicando problemas en [el grupo de Google alaveteli-dev](https://groups.google.com/group/alaveteli-dev) o enviando solicitudes pull. + +## Xcode + +Si utiliza OS X Lion, descargue *Command Line Tools for Xcode* de [Apple](https://developer.apple.com/downloads/index.action). Se trata de un nuevo paquete de Apple que proporciona las herramientas integradas de línea de comando independientemente del resto de Xcode. Necesitará registrar una cuenta gratuita de desarrollador de Apple. + +**Nota:** En Xcode 4.2 ya no se incluye una versión de GCC sin LLVM. Homebrew ha actuado ante esta circunstancia [cambiando a Clang](https://github.com/mxcl/homebrew/issues/6852). Sin embargo, es posible que encuentre errores al instalar RVM. *Informe de ellos en la [lista de correo](https://groups.google.com/group/alaveteli-dev).* Las siguientes instrucciones se han probado con Xcode 4.1. En caso necesario, puede instalar GCC de Xcode 4.1 ejecutando: + + brew install https://github.com/adamv/homebrew-alt/raw/master/duplicates/apple-gcc42.rb + +## Homebrew + +Homebrew es un gestor de paquetes para OS X. Es el preferido frente a otras alternativas como MacPorts y Fink. Si todavía no tiene instalado Homebrew, ejecute el comando: + + ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go) + +A continuación instale los paquetes requeridos por Alaveteli: + + brew install catdoc elinks gnuplot gs imagemagick libmagic libyaml links mutt poppler tnef wkhtmltopdf wv xapian unrtf + + +### Instale PostgreSQL + +Alaveteli utiliza PostgreSQL por defecto. Si ha probado Alaveteli con MySQL o SQLite, infórmenos en el [grupo de Google alaveteli-dev](https://groups.google.com/group/alaveteli-dev). + + brew install postgresql + initdb /usr/local/var/postgres + mkdir -p ~/Library/LaunchAgents + cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/ + launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist + +## PDF Toolkit + +[Descargue el paquete de instalación](https://github.com/downloads/robinhouston/pdftk/pdftk.pkg) y ejecútelo. + +## Ruby + +### Instale RVM + +RVM es la forma preferida de instalar numerosas versiones de Ruby en OS X. Alaveteli utiliza Ruby 1.8.7. Los siguientes comandos presuponen que está utilizando Bash. + + curl -L https://get.rvm.io | bash -s stable + +Lea las notas `rvm notes` y los requisitos `rvm requirements` con cuidado para obtener más instrucciones. Después, instale Ruby: + + rvm install 1.8.7 + rvm install 1.9.3 + rvm use 1.9.3 --default + +### Instale mahoro y pg con flags + +Los paquetes gem `mahoro` y `pg` necesitas comandos de instalación especiales. Rubygems debe atrasarse a la versión 1.6.2 para evitar advertencias sobre funcionalidades obsoletas al efectuar las pruebas. + + rvm 1.8.7 + gem update --system 1.6.2 + gem install mahoro -- --with-ldflags="-L/usr/local/Cellar/libmagic/5.09/lib" --with-cppflags="-I/usr/local/Cellar/libmagic/5.09/include" + env ARCHFLAGS="-arch x86_64" gem install pg + +#### Actualización + +Con fecha de 22 de agosto de 2012 o anterior, puede instalar `mahoro` en Ruby 1.9.3 en OS X 10.7 Lion mediante: + + brew install libmagic + gem install mahoro + +## Alaveteli + +La siguiente información procede en gran parte del [proceso de instalación manual]({{ page.baseurl }}/docs/installing/manual_install). + +### Configure la base de datos + +Cree una base de datos para su usuario de Mac, ya que Homebrew no crea uno por defecto: + + createdb + +Cree un usuario `foi` desde la línea de comando, de este modo: + + createuser -s -P foi + +_Nota:_ Dejar la contraseña en blanco puede causar gran confusión si no está familiarizado con PostgreSQL. + +Cree una plantilla para nuestras bases de datos de Alaveteli: + + createdb -T template0 -E UTF-8 template_utf8 + echo "update pg_database set datistemplate=true where datname='template_utf8';" | psql + +A continuación, cree las bases de datos: + + createdb -T template_utf8 -O foi alaveteli_production + createdb -T template_utf8 -O foi alaveteli_test + createdb -T template_utf8 -O foi alaveteli_development + +### Clone Alaveteli + +No deseamos Rails comerciales porque causan problemas localmente. + + git clone https://github.com/mysociety/alaveteli.git + cd alaveteli + git submodule init + + sed -i~ 's/\\[submodule "vendor\/rails"\\]//' .git/config + + sed -i~ 's/url = git:\/\/github.com\/rails\/rails.git//' .git/config + git submodule update + +**Nota:** Debido a errores de Markdown, el primer comando `sed` anterior no se estará mostrando correctamente si aparece entre comillas. + +### Configure Alaveteli + +Copie los archivos de ejemplo de configuración y configure `database.yml`. + + cp -f config/general.yml-example config/general.yml + cp -f config/memcached.yml-example config/memcached.yml + cp -f config/database.yml-example config/database.yml + sed -i~ 's/<username>/foi/' config/database.yml + sed -i~ 's/<password>/foi/' config/database.yml + sed -i~ 's/ port: 5432//' config/database.yml + sed -i~ 's/ # PostgreSQL 8.1 pretty please//' config/database.yml + +### Bundler + +Instale los paquetes gem y finalice la configuración de Alaveteli. + + rvm 1.8.7 + bundle + bundle exec rake db:create:all + bundle exec rake db:migrate + bundle exec rake db:test:prepare + +## Solución de problemas + +### Versión de Ruby + +Asegúrese de estar utilizando la última versión de Ruby. Por ejemplo, algunas versiones de Ruby 1.8.7 fallarán en la segmentación, por ejemplo: + +``` +/Users/james/.rvm/gems/ruby-1.8.7-p357/gems/json-1.5.4/ext/json/ext/json/ext/parser.bundle: [BUG] Segmentation fault +ruby 1.8.7 (2011-12-28 patchlevel 357) [i686-darwin11.3.0] +``` + +La ejecución de `rvm install 1.8.7` debería instalar el último nivel de parche de Ruby 1.8.7. Recuerde cambiar a la última versión de Ruby antes de continuar. + +### Tareas rake + +Recuerde ejecutar las tareas rake con `bundle exec`. Para ello, por ejemplo, ejecute `bundle exec rake`. diff --git a/es/docs/installing/manual_install.md b/es/docs/installing/manual_install.md new file mode 100644 index 000000000..fdf559cbf --- /dev/null +++ b/es/docs/installing/manual_install.md @@ -0,0 +1,894 @@ +--- +layout: es/page +title: Instalación manual +--- + + +# Instalación manual + +<p class="lead"> + Las siguientes instrucciones describen el proceso paso a paso para la + instalación de Alaveteli. <em>No es obligatorio hacerlo de este modo</em>, + normalmente resulta más sencillo utilizar el + <a href="{{ page.baseurl }}/docs/installing/script/">script de instalación</a> + o el + <a href="{{ page.baseurl }}/docs/installing/ami/">AMI EC2 de Amazon</a>. +</p> + +Existen [otras maneras de instalar Alaveteli]({{ page.baseurl }}/docs/installing/). + +<div class="attention-box"> + <ul> + <li>Los comandos incluidos en este manual requieren permisos de usuario root.</li> + <li>Los comandos deben ejecutarse en el terminal o mediante SSH.</li> + </ul> +</div> + +## Configuración el sistema operativo + +### Sistema operativo objetivo + +Estas instrucciones corresponden a una versión de 64 bits de Debian 6 (Wheezy), Debian 7 (Squeeze) +o Ubuntu 12.04 LTS (Precise). Debian es la plataforma de implementación con mejor soporte. También +tenemos instrucciones para la [instalación en MacOS]({{ page.baseurl }}/docs/installing/macos/). + +### Defina la localización + +**Debian Wheezy o Squeeze** + +Siga el [manual de Debian](https://wiki.debian.org/Locale#Standard) para configurar la localización del sistema operativo. + +Genere las localizaciones que desea tener disponibles. Cuando la pantalla interactiva solicite que escoja una localización predeterminada, elija «None», pues la sesión SSH proporcionará la localización requerida. + + dpkg-reconfigure locales + +Inicie una nueva sesión SSH para utilizar su localización de SSH. + +**Ubuntu Precise** + +Desactive la localización predeterminada, ya que la sesión SSH debería proporcionar la localización requerida. + + update-locale LC_ALL= + +Inicie una nueva sesión SSH para utilizar su localización de SSH. + +### Actualice el sistema operativo + +Actualice el sistema operativo con los últimos paquetes: + + apt-get update -y + apt-get upgrade -y + +`sudo` no está instalado de forma predeterminada en Debian. Instálelo junto con `git` (la herramienta de control de versiones que utilizaremos para obtener una copia del código de Alaveteli). + + apt-get install -y sudo git-core + +### Prepare la instalación de dependencias del sistema utilizando paquetes del sistema operativo + +Estos son paquetes de los que el software depende: software de terceros utilizado para +analizar documentos, hospedar el sitio, etc. En el siguiente paso también hay paquetes que contienen +encabezados necesarios para compilar parte de las dependencias gem. + +#### Utilice otros repositorios para obtener paquetes más recientes + +Añada los siguientes repositorios a `/etc/apt/sources.list`: + +**Debian Squeeze** + + cat > /etc/apt/sources.list.d/debian-extra.list <<EOF + # Mirror de Debian que incluye contrib y non-free: + deb http://the.earth.li/debian/ squeeze main contrib non-free + deb-src http://the.earth.li/debian/ squeeze main contrib non-free + + # Actualizaciones de seguridad: + deb http://security.debian.org/ squeeze/updates main non-free + deb-src http://security.debian.org/ squeeze/updates main non-free + + # Backports de Debian + deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free + deb-src http://backports.debian.org/debian-backports squeeze-backports main contrib non-free + + # Wheezy + deb http://ftp.uk.debian.org/debian wheezy main contrib non-free + EOF + +El repositorio squeeze-backports proporciona una versión más reciente de RubyGems y el repositorio de Wheezy proporciona bundler. Debería configurar la opción package-pinning para reducir la prioridad del repositorio de Wheezy con el objetivo de evitar que se le soliciten otros paquetes. + + cat >> /etc/apt/preferences <<EOF + + Package: bundler + Pin: release n=wheezy + Pin-Priority: 990 + + Package: * + Pin: release n=wheezy + Pin-Priority: 50 + EOF + +**Debian Wheezy** + + cat > /etc/apt/sources.list.d/debian-extra.list <<EOF + # Mirror de Debian que incluye contrib y non-free: + deb http://the.earth.li/debian/ wheezy main contrib non-free + deb-src http://the.earth.li/debian/ wheezy main contrib non-free + + # Actualizaciones de seguridad: + deb http://security.debian.org/ wheezy/updates main non-free + deb-src http://security.debian.org/ wheezy/updates main non-free + EOF + +**Ubuntu Precise** + + cat > /etc/apt/sources.list.d/ubuntu-extra.list <<EOF + deb http://de.archive.ubuntu.com/ubuntu/ precise multiverse + deb-src http://de.archive.ubuntu.com/ubuntu/ precise multiverse + deb http://de.archive.ubuntu.com/ubuntu/ precise-updates multiverse + deb-src http://de.archive.ubuntu.com/ubuntu/ precise-updates multiverse + deb http://de.archive.ubuntu.com/ubuntu/ trusty universe + deb-src http://de.archive.ubuntu.com/ubuntu/ trusty universe + EOF + +Aquí se utiliza el repositorio trusty para obtener una versión más reciente de bundler. Debería configurar la opción package-pinning para reducir la prioridad del repositorio de Wheezy con el objetivo de evitar que se le soliciten otros paquetes. + + cat >> /etc/apt/preferences <<EOF + + Package: ruby-bundler + Pin: release n=trusty + Pin-Priority: 990 + + Package: * + Pin: release n=trusty + Pin-Priority: 50 + EOF + + +#### Paquetes personalizados por mySociety + +Si utiliza Debian o Ubuntu, debería añadir el archivo de Debian de mySociety a sus fuentes +apt. Los paquetes de mySociety actualmente solo se construyen para Debian de 64 bits. + +**Debian Squeeze, Wheezy o Ubuntu Precise** + + cat > /etc/apt/sources.list.d/mysociety-debian.list <<EOF + deb http://debian.mysociety.org squeeze main + EOF + +El repositorio anterior le permite instalar `wkhtmltopdf-static` y `pdftk` (para Squeeze) utilizando `apt`. + +Añada la clave GPG del +[repositorio de paquetes de Debian de mySociety](http://debian.mysociety.org/): + + wget -O - https://debian.mysociety.org/debian.mysociety.org.gpg.key | apt-key add - + +**Solamente para Ubuntu Precise** + + cat > /etc/apt/sources.list.d/mysociety-launchpad.list <<EOF + deb http://ppa.launchpad.net/mysociety/alaveteli/ubuntu precise main + deb-src http://ppa.launchpad.net/mysociety/alaveteli/ubuntu precise main + EOF + +El repositorio anterior le permite instalar una versión reciente de `pdftk` utilizando `apt`. + +Añada la clave GPG del +[repositorio de paquetes de Ubuntu para Alaveteli de mySociety](https://launchpad.net/~mysociety/+archive/ubuntu/alaveteli). + + apt-get install -y python-software-properties + add-apt-repository -y ppa:mysociety/alaveteli + +**Debian Wheezy o Ubuntu Precise** + +También debería configurar la opción package-pinning para reducir la prioridad del +repositorio de Debian de mySociety. Solo nos interesa obtener wkhtmltopdf-static +de mySociety. + + cat >> /etc/apt/preferences <<EOF + + Package: * + Pin: origin debian.mysociety.org + Pin-Priority: 50 + EOF + +**Debian Squeeze** + +No se requiere la adición de ningún paquete especial. + +#### Otras plataformas +Si utiliza otra plataforma basada en Linux, puede instalar, opcionalmente, +estas dependencias de forma manual, como se describe a continuación: + +1. Si desea que los usuarios puedan obtener archivos PDF agradables como parte del +archivo comprimido descargable del historial de su solicitud, instale +[wkhtmltopdf](http://code.google.com/p/wkhtmltopdf/downloads/list). +Recomendamos descargar la última versión compilada estáticamente del sitio web +del proyecto, ya que permite su ejecución sin cabeceras (es decir, sin utilizar +una interfaz gráfica) en Linux. Si instala `wkhtmltopdf`, necesitará editar una opción +en el archivo de configuración para añadir el puntero correspondiente (encontrará más información a continuación). +Si no instala esta herramienta, todo funcionará correctamente, pero los usuarios +obtendrán versiones poco atractivas en texto sin formato de sus solicitudes al descargarlas. + +2. La versión 1.44 de `pdftk` contiene un error que causa un bucle infinito en ciertas +condiciones radicales. Este problema se soluciona en el paquete estándar 1.44.7, disponible en Wheezy (Debian) y Raring (Ubuntu). + +Si no puede obtener una versión oficial con esta reparación para su sistema operativo, puede +tener la esperanza de que no se produzca el problema (bloquea un proceso de Rails de forma infinita +y es necesario matarlo), aplicar un parche por su cuenta o utilizar los paquetes de +[Debian](http://debian.mysociety.org/dists/squeeze/main/binary-amd64/) +o +[Ubuntu](https://launchpad.net/~mysociety/+archive/ubuntu/alaveteli/+packages) +compilados por mySociety. + +#### Actualice las fuentes + +Actualice las fuentes tras añadir los repositorios adicionales. + + apt-get -y update + +### Cree un usuario de Alaveteli + +Cree un nuevo usuario de Linux para ejecutar la aplicación de Alaveteli: + + adduser --quiet --disabled-password --gecos "Alaveteli" alaveteli + +## Obtenga Alaveteli + +Cree el directorio de destino y clone el código fuente de Alaveteli en este directorio: + + mkdir -p /var/www/alaveteli + chown alaveteli:alaveteli /var/www + chown alaveteli:alaveteli /var/www/alaveteli + cd /home/alaveteli + sudo -u alaveteli git clone --recursive \ + --branch master \ + https://github.com/mysociety/alaveteli.git /var/www/alaveteli + +Estos comandos clonan la rama maestra, que siempre contiene la última versión estable. Si desea probar el código más reciente (con posibles errores), puede cambiar a la rama `rails-3-develop`. + + pushd /var/www/alaveteli + sudo -u alaveteli git checkout rails-3-develop + sudo -u alaveteli git submodule update + popd + +La opción `--recursive` instala las librerías comunes de mySociety requeridas para el funcionamiento de Alaveteli. + +## Instale las dependencias + +Instale los paquetes correspondientes para su sistema: + + # Debian Wheezy + apt-get -y install $(cat /var/www/alaveteli/config/packages.debian-wheezy) + + # Debian Squeeze + apt-get -y install $(cat /var/www/alaveteli/config/packages.debian-squeeze) + + # Ubuntu Precise + apt-get -y install $(cat /var/www/alaveteli/config/packages.ubuntu-precise) + +Algunos de los archivos también tienen un número de versión listado en config/packages, compruebe +que tiene instaladas las versiones correctas. Algunas también ofrecen una selección de paquetes +listados con «`|`». + +<div class="attention-box"> + +<strong>Nota:</strong> Para instalar las dependencias de Ruby de Alaveteli, necesita instalar bundler. En +Debian y Ubuntu se proporciona como paquete (instalado como parte del proceso de +instalación de paquetes anterior). Para otros sistemas operativos, puede instalarlo también como gem: + + <pre><code> gem install bundler --no-rdoc --no-ri</code></pre> + +</div> + + +## Configure la base de datos + +Se ha trabajado para intentar conseguir que el código funcione con otras bases de datos +(por ejemplo, SQLite), pero la base de datos soportada actualmente es PostgreSQL +(«postgres»). + +Cree un usuario `foi` desde la línea de comando, de este modo: + + sudo -u postgres createuser -s -P foi + +_Nota:_ Dejar la contraseña en blanco puede causar gran confusión si no está familiarizado con +PostgreSQL. + +Cree una plantilla para nuestras bases de datos de Alaveteli: + + sudo -u postgres createdb -T template0 -E UTF-8 template_utf8 + echo "update pg_database set datistemplate=true where datname='template_utf8';" > /tmp/update-template.sql + sudo -u postgres psql -f /tmp/update-template.sql + rm /tmp/update-template.sql + +A continuación, cree las bases de datos: + + sudo -u postgres createdb -T template_utf8 -O foi alaveteli_production + sudo -u postgres createdb -T template_utf8 -O foi alaveteli_test + sudo -u postgres createdb -T template_utf8 -O foi alaveteli_development + +## Configure el correo electrónico + +Necesitará definir un servidor de correo (MTA) para enviar y recibir +correo electrónico. + +La configuración completa de un MTA va más allá del alcance de este documento. Consulte el manual de [configuración de los servidores Exim4 y Postfix]({{ page.baseurl }}/docs/installing/email/). + +En el modo de desarrollo el correo es gestionado por [`mailcatcher`](http://mailcatcher.me/) por defecto para +que pueda visualizar los correos en un navegador. Inicie mailcatcher ejecutando `bundle exec mailcatcher` en el directorio de aplicaciones. + +## Configure Alaveteli + +Alaveteli tiene tres archivos principales de configuración: + + - `config/database.yml`: configuración de la comunicación entre Alaveteli y la base de datos. + - `config/general.yml`: ajustes generales de la aplicación de Alaveteli. + - `config/newrelic.yml`: configuración del servicio de monitorización de [NewRelic](http://newrelic.com). + +Copie los archivos de configuración y actualice sus permisos: + + cp /var/www/alaveteli/config/database.yml-example /var/www/alaveteli/config/database.yml + cp /var/www/alaveteli/config/general.yml-example /var/www/alaveteli/config/general.yml + cp /var/www/alaveteli/config/newrelic.yml-example /var/www/alaveteli/config/newrelic.yml + chown alaveteli:alaveteli /var/www/alaveteli/config/{database,general,newrelic}.yml + chmod 640 /var/www/alaveteli/config/{database,general,newrelic}.yml + +### database.yml + +Ahora necesitará definir el archivo de configuración de la base de datos para que la aplicación +pueda conectar con la base de datos de Postgres. + +Edite cada sección para apuntar a la base de datos local de PostgreSQL correspondiente. + +Sección `development` de ejemplo de `config/database.yml`: + + development: + adapter: postgresql + template: template_utf8 + database: alaveteli_development + username: foi + password: secure-password-here + host: localhost + port: 5432 + +Asegúrese de que el usuario especificado en `database.yml` existe y tiene permisos completos +en las bases de datos. + +Como el usuario requiere la capacidad de desactivar restricciones durante la ejecución de las pruebas, necesita permisos de superusuario. Si no desea que el usuario de su base de datos tenga permisos de superusuario, puede añadir esta línea a la sección `test` de `database.yml` (como puede ver en `config/database.yml-example`): + + constraint_disabling: false + +### general.yml + +Tenemos un [manual completo de configuración de Alaveteli]({{ page.baseurl }}/docs/customising/config/), que abarca todas las opciones incluidas en `config/general.yml`. + +_Nota:_ Si está configurando Alaveteli para su funcionamiento en producción, asigne a la variable [`STAGING_SITE`]({{ page.baseurl }}/docs/customising/config/#staging_site) el valor `0` en `/var/www/alaveteli/config/general.yml`. + + STAGING_SITE: 0 + +Los ajustes predeterminados para los ejemplos de páginas frontales están diseñados para trabajar con +los datos de muestra incluidos en Alaveteli; una vez disponga de datos reales, deberá editar estos ajustes. + +El tema por defecto es el [tema «Alaveteli»](https://github.com/mysociety/alavetelitheme). Al ejecutar `rails-post-deploy` (consulte la información siguiente), este tema se instala automáticamente. + +### newrelic.yml + +Este archivo contiene información de configuración para el sistema de gestión +de mantenimiento de New Relic. La gestión es desactivada por defecto mediante la opción +`agent_enabled: false`. Consulte las instrucciones de [análisis de rendimiento remoto](https://github.com/newrelic/rpm) de New Relic para activarlo +para análisis locales y remotos. + +## Implementación + +Debería ejecutar el script `rails-post-deploy` después de cada actualización de software: + + sudo -u alaveteli RAILS_ENV=production \ + /var/www/alaveteli/script/rails-post-deploy + +Este comando instala las dependencias de Ruby, instala/actualiza temas, efectúa migraciones +de bases de datos, actualiza directorios compartidos y lleva a cabo otras tareas necesarias +después de una actualización de software, como la precompilación de atributos estáticos +para una instalación en producción. + +La primera ejecución de este script puede requerir *mucho* tiempo, ya que debe +compilar las dependencias nativas de `xapian-full`. + +Cree el índice para el motor de búsqueda (Xapian): + + sudo -u alaveteli RAILS_ENV=production \ + /var/www/alaveteli/script/rebuild-xapian-index + +Si esta acción falla, el sitio debería funcionar en gran parte, pero se trata de un componente principal, +así que debería hacer lo posible para que funcione. + +<div class="attention-box"> + Hemos definido <code>RAILS_ENV=production</code>. Utilice + <code>RAILS_ENV=development</code> si está instalando Alaveteli para + efectuar cambios en el código. +</div> + +## Configure el servidor de aplicaciones + +Alaveteli puede funcionar con numerosos servidores de aplicaciones. mySociety recomienda +el uso de [Phusion Passenger](https://www.phusionpassenger.com) (alias +mod_rails) o [thin](http://code.macournoyer.com/thin). + +### Con Phusion Passenger + +Passenger es el servidor de aplicaciones recomendado, ya que se ha probado a conciencia +en entornos de producción. Está implementado como un módulo de Apache, así que no puede +ejecutarse de forma independiente. + + apt-get install -y libapache2-mod-passenger + +Consulte más adelante en el manual cómo configurar el servidor web de Apache con Passenger. + +### Con Thin + +Thin es un servidor de aplicaciones más ligero que puede ejecutarse con independencia del +servidor web. Thin se instalará en el paquete de la aplicación y se utilizará para gestionar +Alaveteli por defecto. + +Ejecute lo siguiente para poner el servidor en marcha: + + cd /var/www/alaveteli + bundle exec thin \ + --environment=production \ + --user=alaveteli \ + --group=alaveteli \ + start + +El servidor escucha todas las interfaces de forma predeterminada. Puede restringirlo a la interfaz de +localhost añadiendo `--address=127.0.0.1`. + +El servidor debería haber indicado la dirección URL de acceso desde el navegador, +para que pueda observar el sitio en acción. + +Puede demonizar el proceso iniciándolo con la opción `--daemonize`. + +Más adelante en este manual crearemos un demonio SysVinit para gestionar la aplicación, así que puede detener todos los procesos thin que haya empezado a crear. + +## Demonios y procesos cron + +Los scripts crontab e init utilizan el formato de archivo `.ugly`, que es un extraño formato +de plantillas utilizado por mySociety. + +El formato `ugly` utiliza una sustitución simple de variables. Una variable tiene este +`!!(*= $aspecto *)!!`. + +### Genere el archivo crontab + +`config/crontab-example` contiene los procesos cron que se ejecutan en +Alaveteli. Escriba de nuevo el archivo de ejemplo para sustituir las variables +y después guárdelo en la carpeta `/etc/cron.d/` del servidor. + +**Variables de la plantilla:** + +* `vhost_dir`: ruta completa del directorio destino de Alaveteli. + Por ejemplo, si la salida se halla en `/var/www/alaveteli`, indique `/var/www`. +* `vcspath`: nombre del directorio que contiene el código de Alaveteli. + Por ejemplo, `alaveteli`. +* `user`: usuario con el que se ejecuta el software. +* `site`: cadena de texto que identifica su implementación de Alaveteli. +* `mailto`: dirección de correo electrónico o cuenta local a la que se enviará la salida cron. La configuración de una dirección de correo depende de que su MTA haya sido configurado para el envío remoto. + +Existe una tarea rake que le ayudará a escribir de nuevo este archivo para que le resulte útil. +Este ejemplo envía la salida cron al usuario local `alaveteli`. Modifique las variables para adaptarlas a su instalación. + + pushd /var/www/alaveteli + bundle exec rake config_files:convert_crontab \ + DEPLOY_USER=alaveteli \ + VHOST_DIR=/var/www \ + VCSPATH=alaveteli \ + SITE=alaveteli \ + MAILTO=alaveteli \ + CRONTAB=/var/www/alaveteli/config/crontab-example > /etc/cron.d/alaveteli + popd + + chown root:alaveteli /etc/cron.d/alaveteli + chmod 754 /etc/cron.d/alaveteli + +### Genere el demonio de la aplicación + +Genere un demonio basado en el servidor de aplicaciones instalado. Este demonio permitirá utilizar +el comando `service` nativo para detener, iniciar y reiniciar la aplicación. + +#### Passenger + +**Variables de la plantilla:** + +* `vhost_dir`: ruta completa del directorio destino de Alaveteli. + Por ejemplo, si la salida se halla en `/var/www/alaveteli`, indique `/var/www`. +* `vcspath`: nombre del directorio que contiene el código de Alaveteli. + Por ejemplo, `alaveteli`. +* `site`: cadena de texto que identifica su implementación de Alaveteli. +* `user`: usuario con el que se ejecuta el software. + +Existe una tarea rake que le ayudará a escribir de nuevo este archivo para que le resulte útil. +Este ejemplo envía la salida cron al usuario local `alaveteli`. Modifique las variables para adaptarlas a su instalación. + + pushd /var/www/alaveteli + bundle exec rake config_files:convert_init_script \ + DEPLOY_USER=alaveteli \ + VHOST_DIR=/var/www \ + VCSPATH=alaveteli \ + SITE=alaveteli \ + SCRIPT_FILE=/var/www/alaveteli/config/sysvinit-passenger.ugly > /etc/init.d/alaveteli + popd + + chown root:alaveteli /etc/init.d/alaveteli + chmod 754 /etc/init.d/alaveteli + +Inicie la aplicación: + + service alaveteli start + +#### Thin + +**Variables de la plantilla:** + +* `vhost_dir`: ruta completa del directorio destino de Alaveteli. + Por ejemplo, si la salida se halla en `/var/www/alaveteli`, indique `/var/www`. +* `vcspath`: nombre del directorio que contiene el código de Alaveteli. + Por ejemplo, `alaveteli`. +* `site`: cadena de texto que identifica su implementación de Alaveteli. +* `user`: usuario con el que se ejecuta el software. + +Existe una tarea rake que le ayudará a escribir de nuevo este archivo para que le resulte útil. +Este ejemplo envía la salida cron al usuario local `alaveteli`. Modifique las variables para adaptarlas a su instalación. + + pushd /var/www/alaveteli + bundle exec rake config_files:convert_init_script \ + DEPLOY_USER=alaveteli \ + VHOST_DIR=/var/www \ + VCSPATH=alaveteli \ + SITE=alaveteli \ + SCRIPT_FILE=/var/www/alaveteli/config/sysvinit-thin.ugly > /etc/init.d/alaveteli + popd + + chown root:alaveteli /etc/init.d/alaveteli + chmod 754 /etc/init.d/alaveteli + +Inicie la aplicación: + + service alaveteli start + +### Genere el demonio de alerta + +Uno de los procesos cron hace referencia a un script en `/etc/init.d/alaveteli-alert-tracks`. Se trata +de un script init, que puede generarse a partir de la plantilla +`config/alert-tracks-debian.ugly`. Este script envía correos a usuarios suscritos a actualizaciones del sitio, denominados [`tracks`]({{ page.baseurl }}/docs/installing/email/#correo-de-tracks), cuando existe algo nuevo que concuerda con sus intererses. + +**Variables de la plantilla:** + +* `daemon_name`: nombre del demonio, establecido por la tarea rake. +* `vhost_dir`: ruta completa del directorio destino de Alaveteli. + Por ejemplo, si la salida se halla en `/var/www/alaveteli`, indique `/var/www`. +* `vcspath`: nombre del directorio que contiene el código de Alaveteli. + Por ejemplo, `alaveteli`. +* `site`: cadena de texto que identifica su implementación de Alaveteli. +* `user`: usuario con el que se ejecuta el software. + +Existe una tarea rake que le ayudará a escribir de nuevo este archivo para que le resulte útil. +Este ejemplo envía la salida cron al usuario local `alaveteli`. Modifique las variables para adaptarlas a su instalación. + + pushd /var/www/alaveteli + bundle exec rake RAILS_ENV=production config_files:convert_init_script \ + DEPLOY_USER=alaveteli \ + VHOST_DIR=/var/www \ + VCSPATH=alaveteli \ + SITE=alaveteli \ + SCRIPT_FILE=/var/www/alaveteli/config/alert-tracks-debian.ugly > /etc/init.d/alaveteli-alert-tracks + popd + + chown root:alaveteli /etc/init.d/alaveteli-alert-tracks + chmod 754 /etc/init.d/alaveteli-alert-tracks + +Inicie el demonio de tracks de alerta: + + service alaveteli-alert-tracks start + +### Genere el demonio de purga de Varnish + +`config/purge-varnish-debian.ugly` es un script init similar, que es opcional +e innecesario si elige no ejecutar su sitio con Varnish (más información a continuación). Notifica a Varnish sobre páginas en caché que necesitan ser purgadas de la caché de Varnish. No funcionará si Varnish no está instalado. + +**Variables de la plantilla:** + +* `daemon_name`: nombre del demonio, establecido por la tarea rake. +* `vhost_dir`: ruta completa del directorio destino de Alaveteli. + Por ejemplo, si la salida se halla en `/var/www/alaveteli`, indique `/var/www`. +* `vcspath`: nombre del directorio que contiene el código de Alaveteli. + Por ejemplo, `alaveteli`. +* `site`: cadena de texto que identifica su implementación de Alaveteli. +* `user`: usuario con el que se ejecuta el software. + +Existe una tarea rake que le ayudará a escribir de nuevo este archivo para que le resulte útil. +Este ejemplo envía la salida cron al usuario local `alaveteli`. Modifique las variables para adaptarlas a su instalación. + + pushd /var/www/alaveteli + bundle exec rake RAILS_ENV=production config_files:convert_init_script \ + DEPLOY_USER=alaveteli \ + VHOST_DIR=/var/www \ + VCSPATH=alaveteli \ + SITE=alaveteli \ + SCRIPT_FILE=/var/www/alaveteli/config/purge-varnish-debian.ugly > /etc/init.d/alaveteli-purge-varnish + popd + + chown root:alaveteli /etc/init.d/alaveteli-purge-varnish + chmod 754 /etc/init.d/alaveteli-purge-varnish + +Inicie el demonio de tracks de alerta: + + service alaveteli-purge-varnish start + + +## Configure el servidor web + +En casi todos los escenarios recomendamos ejecutar la aplicación en Rails de Alaveteli +detrás de un servidor web. Así, el servidor web puede ofrecer contenido estático sin recorrer +la pila de Rails, proporcionando un mejor rendimiento. + +Recomendamos dos combinaciones principales de aplicación y servidor web: + +- Apache y Passenger +- Nginx y Thin + +Hay formas de ejecutar Passenger con Nginx y, por supuesto, Thin con Apache, pero +no se tienen en cuenta en este manual. Si desea hacer algo que no está documentado aquí, +contacte con [alaveteli-dev](https://groups.google.com/forum/#!forum/alaveteli-dev) y +estaremos encantados de ayudarle en la puesta en marcha. + +Si ha seguido este manual, ya debería tener instalado un servidor de aplicaciones, así que +ahora deberá eleigr el servidor web adecuado para configurarlo. + +### Apache (con Passenger) + +Instale Apache con el contenedor Suexec: + + apt-get install -y apache2 + apt-get install -y apache2-suexec + +Active los módulos requeridos: + + a2enmod actions + a2enmod expires + a2enmod headers + a2enmod passenger + a2enmod proxy + a2enmod proxy_http + a2enmod rewrite + a2enmod suexec + +Cree un directorio para la configuración opcional de Alaveteli: + + mkdir -p /etc/apache2/vhost.d/alaveteli + +Copie el ejemplo de archivo de configuración de VirtualHost. Necesitará modificar todas +las ocurrencias de `www.example.com` por su URL. + + cp /var/www/alaveteli/config/httpd.conf-example \ + /etc/apache2/sites-available/alaveteli + +Desactive el sitio predeterminado y active el VirtualHost `alaveteli`: + + a2dissite default + a2ensite alaveteli + +Compruebe la configuración y solucione posibles problemas: + + apachectl configtest + +Reinicie Apache para cargar una nueva configuración de Alaveteli: + + service apache2 graceful + +Se recomienda encarecidamente que su sitio funcione con SSL. (Asigne a `FORCE_SSL` el +valor «true» en `config/general.yml`). Para ello necesitará un certificado SSL para su dominio. + +Active el módulo SSL de Apache: + + a2enmod ssl + +Copie la configuración SSL, cambiando de nuevo `www.example.com` por su dominio, +y active el VirtualHost: + + cp /var/www/alaveteli/config/httpd-ssl.conf.example \ + /etc/apache2/sites-available/alaveteli_https + a2ensite alaveteli_https + +Fuerce las solicitudes HTTPS desde el VirtualHost HTTP: + + cp /var/www/alaveteli/config/httpd-force-ssl.conf.example \ + /etc/apache2/vhost.d/alaveteli/force-ssl.conf + +Si está probando Alaveteli o configurando un sitio interno de pruebas, genere +certificados SSL autofirmados. **No utilice certificados autofirmados para un +servidor de producción**. Sustituya `www.example.com` por su nombre de dominio. + + openssl genrsa -out /etc/ssl/private/www.example.com.key 2048 + chmod 640 /etc/ssl/private/www.example.com.key + + openssl req -new -x509 \ + -key /etc/ssl/private/www.example.com.key \ + -out /etc/ssl/certs/www.example.com.cert \ + -days 3650 \ + -subj /CN=www.example.com + chmod 640 /etc/ssl/certs/www.example.com.cert + +Compruebe la configuración y solucione posibles problemas: + + apachectl configtest + +Reinicie Apache para cargar una nueva configuración de Alaveteli. También se reiniciará +Passenger (el servidor de la aplicación). + + service apache2 graceful + +### Nginx (con Thin) + +Instale Nginx: + + apt-get install -y nginx + +#### Funcionamiento con SSL + +Se recomienda encarecidamente que el sitio funcione con SSL. (Asigne a `FORCE_SSL` el valor +«true» en `config/general.yml`). Para ello necesitará un certificado SSL para su dominio. + +Copie la configuración SSL, cambiando de nuevo `www.example.com` por su dominio, +active el servidor `alaveteli_https` y desactive el sitio predeterminado. + + cp /var/www/alaveteli/config/nginx-ssl.conf.example \ + /etc/nginx/sites-available/alaveteli_https + rm /etc/nginx/sites-enabled/default + ln -s /etc/nginx/sites-available/alaveteli_https \ + /etc/nginx/sites-enabled/alaveteli_https + +<div class="attention-box"> + <strong>Nota:</strong> Por motivos de historial, <code>nginx-ssl.conf.example</code> establece la ruta de Alaveteli como <code>/var/www/alaveteli/alaveteli</code>; necesitará modificarla manualmente a <code>/var/www/alaveteli</code> o a la raíz de su instalación de Alaveteli. +</div> + +Si está probando Alaveteli o configurando un sitio interno de pruebas, genere +certificados SSL autofirmados. **No utilice certificados autofirmados para un +servidor de producción**. Sustituya `www.example.com` por su nombre de dominio. + + openssl genrsa -out /etc/ssl/private/www.example.com.key 2048 + chmod 640 /etc/ssl/private/www.example.com.key + + openssl req -new -x509 \ + -key /etc/ssl/private/www.example.com.key \ + -out /etc/ssl/certs/www.example.com.cert \ + -days 3650 \ + -subj /CN=www.example.com + chmod 640 /etc/ssl/certs/www.example.com.cert + +Compruebe la configuración y solucione posibles problemas: + + service nginx configtest + +Cargue la nueva configuración de Nginx y reinicie la aplicación: + + service nginx reload + service alaveteli restart + +#### Funcionamiento sin SSL + +Asigne a `FORCE_SSL` el valor +«false» en `config/general.yml`. Copie el ejemplo de configuración de Nginx: + + cp /var/www/alaveteli/config/nginx.conf.example \ + /etc/nginx/sites-available/alaveteli + +<div class="attention-box"> + <strong>Nota:</strong> Por motivos de historial, <code>nginx.conf.example</code> establece la ruta de Alaveteli como <code>/var/www/alaveteli/alaveteli</code>; necesitará modificarla manualmente a <code>/var/www/alaveteli</code> o a la raíz de su instalación de Alaveteli. +</div> + +Desactive el sitio por defecto y active el servidor `alaveteli`: + + rm /etc/nginx/sites-enabled/default + ln -s /etc/nginx/sites-available/alaveteli \ + /etc/nginx/sites-enabled/alaveteli + +Compruebe la configuración y solucione posibles problemas: + + service nginx configtest + +Inicie la aplicación de Rails con Thin (si aún no lo ha hecho). + + service alaveteli start + +Cargue de nuevo la configuración de Nginx: + + service nginx reload + + +--- + +## Añada Varnish como acelerador HTTP + +En todas las cargas, excepto las ligeras, se recomienda encarecidamente que el servidor funcione con +un acelerador HTTP, como Varnish. Se suministra un VCL de muestra de Varnish en +`conf/varnish-alaveteli.vcl`. + +Si utiliza SSL necesitará configurar un terminador de SSL delante de +Varnish. Si ya utiliza Apache como servidor web, puede utilizarlo +también como terminador SSL. + +Tenemos algunas [notas sobre buenas prácticas para el servidor +de producción]({{ page.baseurl }}/docs/running/server/). + +## ¿Qué hacer ahora? + +Consulte los [siguientes pasos]({{ page.baseurl }}/docs/installing/next_steps/). + +## Solución de problemas + +* **Efectúe las pruebas** + + Asegúrese de que todo está bien. Como usuario de Alaveteli, ejecute: + + bundle exec rake spec + + Si se produce algún error, algo ha fallado en los pasos anteriores + (consulte la próxima sección sobre problemas y soluciones comunes). Es posible que + pueda avanzar a los [siguientes pasos]({{ page.baseurl }}/docs/installing/next_steps/), según la gravedad del problema, + pero lo ideal sería que intentara averiguar la causa del error. + + +<div class="attention-box"> + <strong>Nota:</strong> Si ha configurado su instalación de Alaveteli para producción, necesitará eliminar temporalmente el archivo <code>config/rails_env.rb</code>, utilizado para forzar el entorno de rails en producción, y editar su archivo <code>.bundle/config</code> para eliminar la línea <code>BUNDLE_WITHOUT</code>, que excluye las dependencias de desarrollo. Una vez hecho esto, como usuario de Alaveteli, ejecute la instalación <code>bundle install</code>. También necesitará convertir Alaveteli en propietario de <code>/var/www/alaveteli/log/development.log</code> y llevar a cabo las migraciones de bases de datos. + + <pre><code>chown alaveteli:alaveteli /var/www/alaveteli/log/development.log +sudo -u alaveteli bundle exec rake db:migrate</code></pre> + +Debería haber podido ejecutar las pruebas. No olvide restaurar <code>config/rails_env.rb</code> cuando haya terminado. Probablemente verá algunos errores de procesos cron, ya que se estarán ejecutando en el modo de desarrollo. + +</div> + + +* **No aparecen los correos entrantes en mi instalación de Alaveteli** + + Consulte el [manual general de solución de problemas de correo]({{ page.baseurl }}/docs/installing/email#solucin-de-problemas-generales-de-correo). + +* **Varias pruebas muestran el error «*Your PostgreSQL connection does not support + unescape_bytea. Try upgrading to pg 0.9.0 or later*»** + + Tiene una versión antigua de `pg`, el controlador de Postgres de Ruby. En + Ubuntu, por ejemplo, es proporcionado por el paquete `libdbd-pg-ruby`. + + Pruebe actualizando la instalación `pg` de su sistema o instalando el paquete gem pg + con `gem install pg` + +* **Algunas de las pruebas relacionadas con el correo están fallando con mensajes tales como + «*when using TMail should load an email with funny MIME settings' + FAILED*»** + + Parece que las pruebas se están efectuando en el entorno `production` + en lugar de en el entorno `test` por algún motivo. + +* **Los caracteres que no pertenecen al código ASCII se muestran como asteriscos en mis mensajes entrantes** + + Utilizamos `elinks` para convertir los correos HTML en texto sin formato. + Normalmente la codificación debería funcionar, pero en algunas circunstancias parece que + `elinks` ignora los parámetros recibidos desde Alaveteli. + + Para forzar que `elinks` siempre trate las entradas como UTF8, añada lo siguiente + a `/etc/elinks/elinks.conf`: + + set document.codepage.assume = "utf-8" + set document.codepage.force_assumed = 1 + + También debería comprobar que su localización está configurada correctamente. Consulte + [esta publicación de seguimiento](https://github.com/mysociety/alaveteli/issues/128#issuecomment-1814845) + para obtener más información. + +* **Recibo `rake: command not found` al ejecutar el script posterior a la instalación** + + El script utiliza `rake`. + + Es posible que las librerías binarias instaladas por bundler no se ubiquen en la + ruta `PATH` del sistema; por tanto, para poder ejecutar `rake` (necesario para los + despliegues), deberá utilizar un comando similar a este: + + ln -s /usr/lib/ruby/gems/1.8/bin/rake /usr/local/bin/ + + + diff --git a/es/docs/installing/next_steps.md b/es/docs/installing/next_steps.md new file mode 100644 index 000000000..d20c06675 --- /dev/null +++ b/es/docs/installing/next_steps.md @@ -0,0 +1,122 @@ +--- +layout: es/page +title: Siguientes pasos +--- +# Siguientes pasos + +<p class="lead"> + Bien, ha instalado una copia de Alaveteli y puede visualizar el sitio en un navegador. ¿Qué debe hacer ahora? +</p> + +## Cree una cuenta de administrador superusuario + +Alaveteli incluye un +<a href="{{ page.baseurl }}/docs/glossary/#emergency" class="glossary__link">usuario de emergencia</a> +que tiene acceso a la interfaz de administración. Así, cuando acabe de crear un sitio, deberá +registrarse para crear su propia cuenta y después iniciar sesión en la interfaz de administración +con el usuario de emergencia para ascender su nueva cuenta a administrador con permisos de *superusuario*. + +Una vez hecho esto, desactive el usuario de emergencia, pues no necesitará utilizarlo más: lo habrá +reemplazado con su nueva cuenta de administrador. + +Alaveteli incluye datos de muestra con un usuario administrador llamado «Joe +Admin». Si los datos de muestra se han cargado en la base de datos (depende del tipo +de instalación elegido), deberá revocar también los permisos de administrador de Joe, pues +utilizará su propia cuenta de administrador en su lugar. + +### Paso a paso: + +En primer lugar, en el navegador: + +* Acceda a `/profile/sign_in` y cree un usuario siguiendo el proceso de registro. +* Consulte su correo y confirme su cuenta. +* Acceda a `/admin?emergency=1`, inicie sesión con el código de usuario y la contraseña + que ha especificado en [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) + y [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password). + Puede consultar estos ajustes en `config/general.yml`. +* Ahora se encontrará en la página de adminsitración de Alaveteli. +* Haga clic en **Users** (en el menú de navegación superior de la página) y eliga + su nombre en el listado de usuarios. En *esa* página, haga clic en **Edit**. +* Modifique su *Admin level* a «super» y haga clic en **Save**. +* A partir de ahora, al iniciar sesión en su sitio basado en Alavateli, tendrá acceso + a la interfaz de administración (en `/admin`). Es más, verá enlaces a páginas administrativas + externas al sitio principal (que no son visibles para usuarios comunes). + +Si su instalación ha cargado los datos de muestra, habrá un usuario de prueba en su base +de datos llamado «Joe Admin» también con permisos de administrador. Deberá eliminar estos +permisos para que no exista riesgo de que se utilice para acceder a la administración de su +sitio. Puede hacer esto mientras tiene la sesión iniciada como usuario de emergencia o más tarde, +iniciando su propia sesión: + +* Acceda a `/admin/users` o haga clic en **Users** en el menú de navegación de la + página de administración. +* Busque «Joe Admin» en el listado de usuarios y haga clic en el nombre para ver los + detalles del usuario. En *esa* página, haga clic en **Edit**. +* Modifique su *Admin level* de «super» a «none» y haga clic en **Save**. +* Joe Admin ya no tendrá permisos de administrador. + +Ahora que su cuenta corresponde a un superusuario administrador, no necesita permitir el +acceso del usuario de emergencia a la interfaz de administración. En la línea de comando, edite +`/var/www/alaveteli/alaveteli/config/general.yml`: + +* Es importante que modifique la contraseña del usuario de emergencia (e, idealmente, + también el código de usuario) que se incluye en Alavateli, pues es públicos y + consecuentemente no seguro. En `general.yml`, cambie + [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password) + (y tal vez [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) + también) por un valor nuevo exclusivo. +* También puede desactivar totalmente el usuario de emergencia. En condiciones + normales no lo necesitará, pues a partir de ahora utilizará el usuario administrador que + acaba de crear. + Asigne a [`DISABLE_EMERGENCY_USER`]({{ page.baseurl }}/docs/customising/config/#disable_emergency_user) + el valor `true`. +* Para aplicar estos cambios, reinicie el servicio como usuario con permisos root: + `sudo service alaveteli restart` + +Puede utilizar el mismo proceso (con su sesión de administrador iniciada) para añadir o eliminar +permisos de superusuario administrador de cualquier usuario que añada en su sitio. +Si elimina accidentalmente los permisos de administrador de todas las cuentas (¡pero intente que +esto no ocurrra!), puede activar el usuario de emergencia editando el archivo `general.yml` +y reiniciando Alaveteli. + +## Cargue los datos de muestra + +Si desea tener algunos datos de muestra con los que probar, puede intentar cargar los elementos comunes que utiliza +la suite de pruebas en su base de datos de desarrollo. Como usuario `alaveteli`, ejecute: + + script/load-sample-data + +Si los datos de muestra ya se han cargado en la base de datos, este comando no hará nada, sino que +<abbr title='PG::Error: ERROR: permission denied: "RI_ConstraintTrigger_XXXXXX" is a system trigger'>generará un error</abbr>. + +Si ha añadido los datos de muestra, actualice después el índice de búsqueda de Xapian: + + script/update-xapian-index + +Recuerde que los datos de muestra incluyen un usuario con permisos de administrador en su sitio. +Debería revocar estos permisos para que no pueda utilizarse en el acceso a su sitio: siga +los pasos descritos en la sección anterior. + +## Pruebe el proceso de solicitud + +* Cree una nueva autoridad pública en la interfaz de administración, dele un nombre tal como + «Autoridad de prueba». Defina el correo de solicitud con una dirección que le pertenezca. + +* Desde la interfaz principal del sitio, efectúe una solicitud a la nueva autoridad. + +* Debería recibir el correo de la solicitud, intente responder a él. Su correo de respuesta + debería aparecer en Alaveteli. ¿No funciona? Consulte nuestros + [consejos para la solución de problemas]({{ page.baseurl }}/docs/installing/manual_install/#solucin-de-problemas). + Si no es suficiente, [póngase en contacto]({{ page.baseurl }}/community/) mediante + la [lista de correo de desarrollo](https://groups.google.com/forum/#!forum/alaveteli-dev) o por [IRC](http://www.irc.mysociety.org/) + para obtener ayuda. + +## Importe las autoridades públicas + +Alaveteli puede importar un listado de autoridades públicas y sus direcciones de correo de contacto desde un archivo CSV. + +Encontrará el cargador en la pestaña «Authorities» de la sección de administración o accediendo directamente a `/admin/body/import_csv`. + +## Empiece a pensar en la personalización de Alaveteli + +Consulte [nuestro manual]({{ page.baseurl }}/docs/customising/). diff --git a/es/docs/installing/script.md b/es/docs/installing/script.md new file mode 100644 index 000000000..c07c7de89 --- /dev/null +++ b/es/docs/installing/script.md @@ -0,0 +1,76 @@ +--- +layout: es/page +title: Script de instalación +--- + +# Script de instalación + +<p class="lead"> + Si prefiere utilizar su propio servidor, hemos elaborado un script de instalación, que efectúa la mayor parte del trabajo en su lugar. +</p> + +Existen [otras formas de instalar Alaveteli]({{ page.baseurl }}/docs/installing/). + +## Instalación con el script de instalación + +Si dispone de una instalación limpia de Debian Squeeze de 64 bits o Ubuntu Precise, puede +utilizar un script de instalación de nuestro repositorio commonlib para configurar una implementación +funcional de Alaveteli. Esta opción no es válida para producción (funciona, por ejemplo, en modo +de desarrollo), pero deberá llevar a cabo una instalación funcional del sitio, que pueda +enviar y recibir correo. + +**Advertencia: utilice este script solamente en un servidor recién instalado, pues efectuará +cambios significativos en la configuración de su servidor, incluidas modificaciones en la configuración +de Nginx, la creación de una cuenta de usuario, la generación de una base de datos y la instalación +de nuevos paquetes.** + +Para descargar el script, ejecute el siguiente comando: + + curl -O https://raw.githubusercontent.com/mysociety/commonlib/master/bin/install-site.sh + +Si ejecuta este script con `sh install-site.sh`, verá su mensaje de uso: + + Usage: ./install-site.sh [--default] <SITE-NAME> <UNIX-USER> [HOST] + HOST is only optional if you are running this on an EC2 instance. + --default means to install as the default site for this server, + rather than a virtualhost for HOST. + +En este caso `<SITE-NAME>` debería ser `alaveteli`. `<UNIX-USER>` es el nombre del +usuario de Unix que será propietario del código y lo podrá en funcionamiento +(este usuario será creado por el script). + +El parámetro `HOST` es un nombre de host para el servidor que podrá ser utilizado +externamente. El script creará un host virtual para este nombre, a menos que +haya especificado la opción `--default`. Este parámetro es opcional si se halla en +una implementación de EC2, en cuyo caso se utilizará el nombre de host de dicha implementación. + +Por ejemplo, si desea utilizar un nuevo usuario llamado `alaveteli` y el nombre de host +`alaveteli.127.0.0.1.xip.io`, creando un host virtual solamente para este nombre de host, +puede descargar y ejecutar el script con: + + sudo sh install-site.sh alaveteli alaveteli alaveteli.127.0.0.1.xip.io + +([xip.io](http://xip.io/) es un dominio útil para desarrollo) + +O, si desea configurarlo como el sitio por defecto en una implementación de EC2, puede +descargar el script, convertirlo en ejecutable y después invocarlo con: + + sudo ./install-site.sh --default alaveteli alaveteli + +Si tiene problemas o consultas, pregunte en el [grupo de Google de + Alaveteli](https://groups.google.com/forum/#!forum/alaveteli-dev) o [informe de un + problema](https://github.com/mysociety/alaveteli/issues?state=open). + +## Qué hace el script de instalación + +Una vez ha finalizado el script, debería disponer de una copia funcional del sitio web, +accesible a través del nombre de host suministrado al script. Por tanto, para este ejemplo, podrá acceder al sitio desde un navegador en `http://alaveteli.10.10.10.30.xip.io`. El sitio funciona utilizando el servidor de aplicaciones Thin y el servidor web Nginx. Por defecto Alaveteli se instalará en `/var/www/[HOST]` dentro del servidor. + +El servidor también estará configurado para aceptar respuestas a correos de solicitud de información (simpre que el registro MX del dominio apunte al servidor). La gestión del correo entrante se configura utilizando Postfix como MTA. + +##¿Qué hacer a continuación? + +Consulte los [siguientes pasos]({{ page.baseurl }}/docs/installing/next_steps/). + + + diff --git a/es/docs/installing/vagrant.md b/es/docs/installing/vagrant.md new file mode 100644 index 000000000..451265c3b --- /dev/null +++ b/es/docs/installing/vagrant.md @@ -0,0 +1,70 @@ +--- +layout: es/page +title: Vagrant +--- +# Alaveteli con Vagrant + +<p class="lead"> +Vagrant proporciona un método sencillo para configurar entornos de desarrollo virutales; para +obtener más información, consulte <a href="http://www.vagrantup.com">el sitio web de Vagrant</a>. +Incluimos un archivo Vagrantfile de ejemplo en el repositorio, que ejecuta el +<a href="{{ page.baseurl }}/docs/installing/script/">script de instalación</a> automáticamente. +</p> + +Esta es solo una de las [diversas maneras de instalar Alaveteli]({{ page.baseurl }}/docs/installing/). + +Los pasos incluidos utilizarán Vagrant para crear un entorno de desarrollo +donde podrá poner en funcionamiento la suite de pruebas y el servidor de desarrollo, así +como modificar la base del código. + +El proceso básico consiste en crear una máquina virtual de base y después proporcionarle +los paquetes de software y la configuración que necesita. Los +scripts suministrados crearán una máquina virtual de Vagrant basada en la edición de servidor de +Ubuntu 12.04 LTS que contiene todo lo necesario para trabajar con Alaveteli. + +1. Obtenga una copia de Alaveteli desde GitHub y cree la implementación de Vagrant. + Esta acción abastecerá al sistema y puede necesitar cierto tiempo, normalmente un mínimo + de 20 minutos. + + # en su máquina + $ git clone git@github.com:mysociety/alaveteli.git + $ cd alaveteli + $ git submodule update --init + $ vagrant --no-color up + +2. Ahora debería poder utilizar SSH en el sistema operativo invitado de Vagrant y arrancar + la suite de pruebas: + + $ vagrant ssh + + # Ahora se halla en un terminal de la máquina virtual + $ cd /home/vagrant/alaveteli + $ bundle exec rake spec + + +3. Ejecute el servidor de Rails y visite la aplicación en el navegador de su host, en + http://10.10.10.30:3000 + + # en el terminal de la máquina virtual + bundle exec rails server + +## ¿Qué hacer a continuación? + +Consulte los [siguientes pasos]({{ page.baseurl }}/docs/installing/next_steps/). + +## Personalice la implementación de Vagrant + +El archivo Vagrantfile permite la personalización de algunos aspectos de la máquina virtual. Consulte las opciones de personalización en el archivo [`Vagrantfile`](https://github.com/mysociety/alaveteli/blob/master/Vagrantfile#L30) ubicado en el nivel superior del repositorio de Alaveteli. + +Las opciones pueden configurarse bien indicando como prefijo el comando de Vagrant o bien +exportándolo al entorno. + + # Prefijo con el comando + $ ALAVETELI_VAGRANT_MEMORY=2048 vagrant up + + # Exportación al entorno + $ export ALAVETELI_VAGRANT_MEMORY=2048 + $ vagrant up + +Ambos casos producen el mismo resultado, pero la exportación mantendrá la variable durante la duración completa de su sesión. + diff --git a/es/docs/running/admin_manual.md b/es/docs/running/admin_manual.md new file mode 100644 index 000000000..9099ed242 --- /dev/null +++ b/es/docs/running/admin_manual.md @@ -0,0 +1,458 @@ +--- +layout: es/page +title: Manual de administrador +--- + +# Manual de administrador de Alaveteli + +<p class="lead"> + ¿Cómo se gestiona un sitio basado en Alaveteli? Esta guía explica qué puede esperar + y los tipos de problemas que puede encontrar. Incluye ejemplos de cómo + gestiona mySociety su propio sitio de <a href="{{ page.baseurl }}/docs/glossary/#foi" + class="glossary__link">información pública</a>, <a + href="https://www.whatdotheyknow.com">whatdotheyknow.com</a>. +</p> + +Este manual incluye: + +<ul class="toc"> + <li><a href="#cules-son-las-implicaciones">¿Cuáles son las implicaciones?</a></li> + <li><a href="#soporte-al-usuario">Soporte al usuario</a> + <ul> + <li><a href="#gestionar-correos-que-no-llegan-a-la-autoridad">Gestionar correos que no llegan a la autoridad</a></li> + <li><a href="#solicitudes-para-retirar-informacin">Solicitudes para retirar información</a></li> + <li><a href="#direccin-incorrecta">Dirección incorrecta</a></li> + <li><a href="#peticin-de-asesoramiento">Petición de asesoramiento</a></li> + <li><a href="#soporte-general-requerido">Soporte general requerido</a></li> + <li><a href="#usuarios-irritantes">Usuarios irritantes</a></li> + <li><a href="#errores-de-importacin-de-correo">Errores de importación de correo</a></li> + </ul> + <li><a href="#mantenimiento">Mantenimiento</a></li> + <ul> + <li><a href="#permisos-de-administrador-y-acceso-a-la-interfaz-de-administracin">Permisos de administrador y acceso a la interfaz de administración</a></li> + <li><a href="#eliminar-un-mensaje-de-la-sala-de-espera">Eliminar un mensaje de la sala de espera</a></li> + <li><a href="#editar-y-cargar-direcciones-de-correo-de-organismos-pblicos">Editar y cargar direcciones de correo de organismos públicos</a></li> + <li><a href="#bloquear-usuarios">Bloquear usuarios</a></li> + <li><a href="#eliminar-una-solicitud">Eliminar una solicitud</a></li> + <li><a href="#ocultar-una-solicitud">Ocultar una solicitud</a></li> + <li><a href="#ocultar-un-mensaje-entrante-o-saliente">Ocultar un mensaje entrante o saliente</a></li> + <li><a href="#editar-un-mensaje-saliente">Editar un mensaje saliente</a></li> + <li><a href="#ocultar-texto-concreto-de-una-solicitud">Ocultar texto concreto de una solicitud</a></li> + </ul> + </li> +</ul> + +## ¿Cuáles son las implicaciones? + +El gasto general en la gestión de un sitio web de información pública exitoso es +bastante elevado. Richard, un voluntario, escribió una [publicación en el +blog](https://www.mysociety.org/2009/10/13/behind-whatdotheyknow/) sobre este tema en 2009. + +WhatDoTheyKnow normalmente tiene 3 voluntarios activos en todo momento gestionando +el soporte, además de otras personas menos activas que ayudan en distintos momentos. + +Las tareas de administración pueden dividirse en +[**mantenimiento**]({{ page.baseurl }}/docs/running/admin_manual/#mantenimiento) y +[**soporte al usuario**]({{ page.baseurl }}/docs/running/admin_manual/#soporte-al-usuario). +La frontera entre estas tareas es bastante difusa; la diferencia principal +consiste en que la primera se lleva a cabo exclusivamente a través de la interfaz de +administración, mientras que la segunda se gestiona por correo electrónico directamente +con usuarios finales (pero a menudo resulta en acciones llevadas a cabo a través de la +interfaz de administración). + +En una semana de diciembre de 2010 escogida al azar, el equipo de soporte trabajó en 66 +eventos diferentes, que comprendieron 44 correos de **soporte** al usuario y 22 +tareas de **mantenimiento**. + +La mayoría de los correos de soporte requieren algo de tiempo de investigación; algunos +(por ejemplo, los que tienen implicaciones legales) requieren gran cantidad de discusión sobre +políticas para conseguir gestionarlos. Las tareas de mantenimiento suelen ser bastante +más directas, aunque algunas veces requieren conocimientos expertos (por ejemplo, sobre +mensajes rebotados por el servidor de correo). + +Durante esta semana, las tareas surgieron de la siguiente manera: + +### Tareas comunes de mantenimiento + +* 18 respuestas no entregadas o mal encaminadas (por ejemplo, recibidas en la sala de espera) +* 4 solicitudes no clasificadas 21 días después de la respuesta, a la espera de clasificación +* 2 solicitudes marcadas para revisión por parte de un administrador +* 2 ocurrencias marcadas como errores (mensajes rechazados por el servidor por spam, bandeja de entrada llena, etc.) pendientes de reparar + +### Tareas de soporte al usuario + +* 16 tareas administrativas generales cotidianas: por ejemplo, ocurrencias resultantes en acciones administrativas en el sitio + (rebotes, respuestas mal encaminadas, etc.) +* 14 elementos gestionados de forma incorrecta (por ejemplo, enviados al equipo de soporte en lugar de a una autoridad) +* 6 usuarios en necesidad de soporte para utilizar el sitio web (problemas para encontrar autoridades o autoridades con problemas de seguimiento) +* 4 usuarios solicitando información sobre protección de datos o información pública +* 3 solicitudes para editar información personal +* 2 solicitudes para editar información difamatoria + +## Soporte al usuario + +A continuación se ofrece un desglose de los métodos más comunes de soporte al usuario, +a modo de guía sobre el tipo de políticas y formación que un equipo de soporte necesita +para su desarrollo. + +### Gestionar correos que no llegan a la autoridad + +Es posible que los correos no lleguen a la autoridad en primer lugar por una serie +de motivos: + +* El dominio del destinatario ha marcado el correo como spam y no lo ha enviado. +* Se ha incluido en la carpeta de spam a causa de la configuración del cliente de correo. +* El destinatario cuenta con una configuración de filtros de correo que de algún modo omite la bandeja de entrada. + +El primer motivo es el más común. La solución consiste en enviar un correo estándar +al departamento informático del destinatario para que añadan a la lista blanca los correos +de su servicio (y, por supuesto, enviar un mensaje al destinatario original sobre este tema). +La interfaz de administración de Alaveteli incluye una opción para reenviar cualquier mensaje. + +Un administrador de Alaveteli solo detectará este problema cuando una solicitud haya superado +significativamente el tiempo de espera sin recibir ningún tipo de correspondencia por parte +de la autoridad. Algunas veces el servidor de correo de la autoridad rebotará el correo, en +cuyo caso aparecerá en la interfaz de administración a la espera de revisión por parte de un +administrador. + +### Solicitudes para retirar información + +#### Acciones legales + +En este caso alguien nos indica que cierta información del sitio puede ser objeto de +acciones legales. El escenario variará en las distintas jurisdicciones legales. +En el Reino Unido este tipo de solicitud está habitualmente relacionada con la +difamación. + +##### Acciones + +* Reciba la notificación por correo en una dirección central de soporte para que + quede constancia por escrito. +* Actúe de acuerdo a las medidas legales estándar (por ejemplo, es posible que deba retirar + temporalmente las solicitudes mientras evalúa el caso, incluso aunque considere que deberían + seguir funcionando, o tal vez pueda editarlas temporalmente en lugar de retirarlas). +* Registre centralmente la conversación completa y las acciones que ha llevado a cabo. +* Obtenga asesoramiento legal adicional cuando lo necesite. Por ejemplo, puede obtener + una estimación de riesgos que sugiera que puede publicar de nuevo la solicitud o mostrarla + con ediciones limitadas. + +#### Derechos de autor/comerciales + +A veces las autoridades públicas no acaban de entender que sus respuestas son +públicas y, al descubrirlo, no les gusta este tema, por lo que reclaman derechos de autor. +Ocasionalmente también se efectúan otras reclamaciones de derechos de autor sobre el contenido, +pero este caso es el más habitual. Los datos «comercialmente delicados» también pueden +considerarse como datos personales. + +##### Acciones + +* En caso de recibir advertencias sobre acciones legales, consulte el punto anterior. +* En caso contrario, trate la reclamación en primer lugar como un caso de defensa basado en + que las solicitudes de información pública pueden ser repetidas por cualquiera, en que + los datos deberían ser públicos de todas maneras y en que su publicación en realidad + evita gastos innecesarios a la autoridad. + +##### Ejemplo de correo electrónico dirigido a la autoridad + +> Como ya debe saber, nuestra ley de información pública es imparcial respecto a los solicitantes, +> así que cualquier persona del mundo puede solicitar el mismo documento y obtener una copia. +> Para ahorrar dinero a los contribuyentes evitando solicitudes duplicadas y para contar con +> buenas relaciones públicas, le recomendamos que no solicite eliminar la información ni +> la aplicación de una licencia. También me gustaría destacar que <nombre_autoridad> +> permite la reutilización de respuestas de información pública a través de nuestro sitio +> desde el año pasado sin ninguna incidencia al respecto. + + +#### Datos personales + +Aquí se incluyen desde datos personales revelados de forma inadvertida, como +información de identificación personal sobre personas que reclaman beneficios, +hasta el nombre de un usuario del sitio que más adelante no desea aparecer en +los resultados de búsqueda de Google. + +##### Acciones + +* Evalúe la solicitud con referencia a las leyes locales de protección de datos. No + de por hecho automáticamente que debe retirar cierta información, valore la molestia + y el daño causados al individuo que se sentiría aliviado al retirar el material + frente al interés público en publicar o continuar publicando el material. Los datos + personales delicados requerirán normalmente un nivel de interés público mucho mayor. +* [WhatDoTheyKnow considera](https://www.whatdotheyknow.com/help/privacy#takedown) que + existe un fuerte interés público en mantener los nombres de los oficiales o agentes + de las autoridades públicas. +* Para usuarios que desean que se elimine su nombre totalmente del sitio, intente persuadirlos + para no hacerlo: +* Averigüe por qué desean que su nombre se elimine. +* Explique que el sitio es un archivo permanente y que es complicado eliminar información + de internet cuando ya se ha publicado. +* Encuentre ejemplos de solicitudes valiosas que han realizado para mostrar por qué + interesa mantenerlas. +* Explique las dificultades técnicas de la eliminación (si son relevantes). +* En las solicitudes persistentes, considere modificar el nombre de su cuenta o + abreviar su nombre con la primera inicial para evitar confundir en exceso las solicitudes + existentes. En caso de verse afectada la seguridad personal, el nombre debe eliminarse y + sustituirse por el correspondiente texto editado. +* En casos en que la edición resulte compleja (por ejemplo, la eliminación de una firma + escaneada en un archivo PDF), solicite que el usuario reenvíe la respuesta con la edición + correspondiente incluida. Esta solución ofrece la ventaja de entrenar a los usuarios + para que no repitan este comportamiento en el futuro. +* En caso de llevar a cabo ediciones, se recomienda añadir una nota en la solicitud. + + +### Dirección incorrecta + +Correos que llegan a la dirección del equipo de soporte, pero que no deberían haberlo hecho. +Existen dos tipos principales: + +* usuarios que creen que el sitio es un lugar donde contactar con agencias directamente (por ejemplo, + personas en procesos de inmigración y asilo político que desean contactar con la oficina de aduanas) +* usuarios que envían correos a la dirección de soporte en lugar de utilizar el formulario en línea, + normalmente porque han respondido a un correo del sistema en lugar de acceder al enlace incluido en el + mensaje + +#### Acciones + +Responda al usuario y facilite la dirección correcta. + +##### Mensaje de ejemplo: + +> Me gustaría obtener información sobre mi solicitud EEA2 enviada en julio de +> 2010. Aún no tengo respuesta... Por favor, dígame qué debo hacer. + +##### Respuesta de ejemplo: + +> Ha escrito al equipo responsable del sitio web WhatDoTheyKnow.com. +> Nosotros solo gestionamos el sitio y no formamos parte del gobierno de Reino Unido. +> +> Está consultando sobre sus propias circunstancias personales, así que debe contactar +> con UKBA directamente; su información de contacto está disponible en: +> +> http://www.bia.homeoffice.gov.uk/contact/contactspage/ +> http://www.ukba.homeoffice.gov.uk/contact/contactspage/contactcentres/ +> +> También puede interesarle contactar con el miembro del parlamento de su localidad. Puede preguntar +> en el consejo o en la oficina de atención ciudadana si existe algún centro de soporte +> de inmigración en su ubicación. + +##### Mensaje de ejemplo: + +> ¿Se financia a sí misma la recogida de residuos vegetales? Sospecho por el +> bajo número de residentes que la utilizan. ¿Cuál es el valor real de la recogida? +> ¿Es probable que se descarte el programa? + +##### Respuesta de ejemplo: + +> Ha escrito al equipo responsable del sitio web WhatDoTheyKnow.com, no a +> <nombre_autoridad>. +> +> Si desea efectuar una solicitud de información pública, puede hacerlo, +> de forma pública, en nuestro sitio. Para empezar, haga clic en «efectuar una nueva +> solicitud de información pública» en: +> +> https://www.whatdotheyknow.com/body/<nombre_autoridad> + +### Petición de asesoramiento + +Dos ejemplos típicos son: + +* Un usuario no está seguro de adónde dirigir su solicitud. +* Desea saber la mejor forma de preguntar a una autoridad qué datos personales tiene sobre él. + +##### Solicitud de ejemplo: + +> Me gustaría saber en este punto, bajo la ley de información pública, si puedo +> pedir cierta información directamente a la embajada nacional o a la alta comisión de extranjería +> o si debo contactar con el Ministerio de Asuntos Exteriores a través de este sitio. + +##### Respuesta de ejemplo: + +> Le recomiendo que efectúe su solicitud directamente al Ministerio de Asuntos Exteriores, pues se trata del organismo +> técnicamente sujeto a la ley de información pública. +> +> Al realizar su solicitud, se enviará al equipo central de información pública del Ministerio de Asuntos Exteriores, +> que se encargará de coordinar la respuesta con las partes relevantes de su organización. + + +### Soporte general requerido + +Puede deberse a numerosos motivos, por ejemplo: + +* Alguien ha cancelado su solicitud y la autoridad ha respondido después, + abriéndola de nuevo. +* Correcciones sugeridas para nombres de autoridades o detalles de usuarios + y de autoridades. +* Se ha incluido una respuesta automática en la solicitud incorrecta. + +### Usuarios irritantes + +Algunos usuarios utilizan continuamente el sitio de forma incorrecta. Un sitio basado en Alaveteli +debería contar con una política sobre el bloqueo de usuarios, por ejemplo, para darles un primer +aviso, informarles sobre la política de moderación, etc. + +### Errores de importación de correo + +Este tipo de errores se da actualmente en un índice de unos dos mensuales. A veces la causa +principal parece ser el bloqueo en la base de datos cuando se reciben dos correos a la vez +para la misma solicitud, mientras que otras veces se debe simplemente a la superación del tiempo +límite de entrada/salida si el servidor está ocupado. Cuando ocurre un error de importación de correo, +el gestor de correo (Exim) recibe un código de salida de 75 y debería intentar enviar el correo +de nuevo. Se envía un correo a la dirección de soporte del sitio indicando que se ha producido +un error, adjuntando el error y el correo entrante. Normalmente Exim reenviará el correo a la +aplicación. En las raras ocasiones en que no lo haga, puede importarlo manualmente situando el correo +de tipo raw (como el adjunto del error enviado a la dirección de soporte del sitio) en un archivo sin la +primera línea «De:» e incorporando el contenido de dicho archivo separado por barras verticales en +el script de gestión de correo, por ejemplo: +```cat missing_mail.txt | script/mailin``` + + +## Mantenimiento + +### Permisos de administrador y acceso a la interfaz de administración + +La interfaz administrativa se halla en la URL `/admin`. + +Solo los usuarios con nivel de administración `super` pueden acceder a la interfaz de administración. +Los usuarios crean sus propias cuentas de la forma habitual y los administradores pueden proporcionarles +permisos `super` de superusuario. + +Exite una cuenta de usuario de emergencia, accesible mediante +`/admin?emergency=1`, utilizando las credenciales `ADMIN_USERNAME` y +`ADMIN_PASSWORD` definidas en `general.yml`. Para crear las primeras cuentas +de nivel `super` necesitará iniciar sesión como el usuario de emergencia. +Puede desactivar la cuenta del usuario de emergencia asignando a `DISABLE_EMERGENCY_USER` +el valor `true` en `general.yml`. + +Los usuarios con permisos de superusuario también disponen de permisos adicionales +en la interfaz del sitio web para, por ejemplo, clasificar cualquier solicitud, visualizar +elementos que se han ocultado en las búsquedas y acceder a enlaces de administración +junto a los comentarios y solicitudes individuales en la interfaz de usuario. + +Es posible anular completamente la autenticación de administrador asignando a +`SKIP_ADMIN_AUTH` el valor `true` en `general.yml`. + +### Eliminar un mensaje de la sala de espera + +Un mensaje se halla en la sala de espera porque no puede asociarse automáticamente con la solicitud a la que responde. El correo debe moverse de la sala de espera a la solicitud correspondiente. + +En primer lugar, inicie sesión en la interfaz de administración ubicada en `/admin`. Verá mensajes ubicados en la sala de espera bajo el título «Put misdelivered responses with the right request». Haga clic en el chevrón para visualizar los mensajes individuales. + +Si hace clic en un mensaje de la sala de espera, es posible que vea una estimación efectuada por Alaveteli sobre a qué solicitud pertenece el mensaje. Compruebe dicha solicitud. Si no es la correcta o si Alaveteli no ha hecho ninguna estimación, necesitará consultar la dirección del destinatario `To:` y el contenido del mensaje en el correo en formato raw para poder averiguar a qué solicitud pertenece. Puede navegar y buscar entre las solicitudes desde la interfaz de administración mediante el elemento «Requests» del menú. + +Una vez identificada la solicitud a la que corresponde el mensaje, necesitará volver atrás a la página de la sala de espera. Pegue el `id` o el `url_title` de la solicitud en el cuadro situado debajo de «Actions» dentro de «Incoming Message». El `id` de la solicitud puede encontrarse en la URL de la solicitud desde la interfaz de administración; se trata de la parte mostrada después de `/show/`. En la URL `/admin/request/show/118` de administración de la solicitud, el `id` de dicha solicitud es `118`. El `url_title` puede verse en la URL de la solicitud ubicada en la interfaz principal; se trata de la parte situada después de `/request/`. En la URL `/request/documents_relating_to_meeting` corresponde a `documents_relating_to_meeting`. Después haga clic en la opción «Redeliver to another request». + +Ahora el mensaje estará asociado al a solicitud correcta y aparecerá en la página pública de la solicitud. + +### Editar y cargar direcciones de correo de organismos públicos + + + +### Bloquear usuarios + +Es posible que desee bloquear completamente a un usuario del sitio web (como un remitente de spam o un trol, por ejemplo). Necesitará iniciar sesión en la interfaz de administración ubicada en `/admin`. En la fila superior de enlaces, localice y haca clic en la opción «Users». + +Encuentre al usuario que desea bloquear en el listado y haga clic sobre su nombre. Una vez se halle en la página del usuario, seleccione la opción «edit». + +Introduzca algún texto en el cuadro «Ban text» para explicar por qué ha sido bloqueado. Tenga en cuenta que esta información es visible públicamente desde la cuenta del usuario. Después haga clic en el botón de guardado y el usuario será bloqueado. + +### Eliminar una solicitud + +Puede eliminar una solicitud completamente mediante la interfaz de administración. Principalmente solo necesitará hacer esto si alguien ha publicado información privada. Acceda a la página de administración para la solicitud buscándola o navegando en la sección «Requests» de la interfaz de administración. En el primer apartado, haga clic en el botón «Edit metadata». En la parte inferior de la página siguiente, haga clic en el botón rojo «Destroy request entirely». + +### Ocultar una solicitud + +Puede ocultar una solicitud completa desde la interfaz de administración. Inicie sesión en +la interfaz de administración ubicada en `/admin`. En la fila superior de enlaces, localice +y haga clic en «Requests». Busque o navegue para encontrar la página de administración +correspondiente a la solicitud que desea ocultar. Puede acceder directamente a esta página +siguiendo un enlace «admin» desde la página pública de la solicitud. Puede ocultar la solicitud +de una de las siguientes dos maneras: + + * <strong>Ocultar una solicitud irritante o no relacionada con la información pública y + notificar al solicitante:</strong> + Desplácese hacia la sección «actions» de la página de administración + de la solicitud. Seleccione una de las opciones junto a «Hide the request and + notify the user:» y personalice el texto del correo que se enviará al + usuario para hacerle saber las acciones tomadas. Una vez esté preparado, + haga clic en el botón «Hide request». + * <strong>Ocultar una solicitud o hacerla visible solamente para el solicitante + sin notificar a dicho solicitante:</strong> + En la sección «Request metadata» de la página de administración de la + solicitud, haga clic en «Edit metadata». Asigne a «Prominence» el valor + «requester_only» para permitir solo al solicitante la visualización de la + solicitud o el valor «hidden» para ocultar la solicitud a todo el mundo, + excepto a los administradores del sitio. Cuando esté preparado, haga clic + en el botón «Save changes» en la parte inferior del apartado «Edit + metadata». No se enviará ningún correo al usuario para notificarle de + las acciones realizadas. + +### Ocultar un mensaje entrante o saliente + +Es posible que necesite ocultar un mensaje entrante o saliente específico en +la página pública de una solicitud, tal vez porque alguien haya incluido datos +personales en él. Puede efectuar esta tarea desde la página de mensajes de la +interfaz de administración. Puede acceder a la página de administración de mensajes +siguiendo los enlaces de las secciones «Outgoing messages» o «Incoming messages» en +la página de administración de la solicitud, o directamente desde la página pública +de la solicitud, haciendo clic en el enlace «admin» de dicho mensaje. Una vez en la +página de administración del mensaje, puede cambiar su relevancia. Asigne el valor +«hidden» para ocultarlo a todo el mundo, excepto a los administradores del sitio, +o el valor «requester_only» para que solo pueda verlo el solicitante (y los administradores +del sitio). Si es posible, añada un texto en el cuadro «Reason for prominence». +Este texto se mostrará como parte de la información en la página de la solicitud +donde se hallaba el mensaje, indicando la razón por la que se ha ocultado. + +### Editar un mensaje saliente + +Puede tener la necesidad de editar un mensaje saliente debido a que el solicitante haya incluido accidentalmente datos personales que no desea que se publiquen en el sitio. Puede seguir uno de los enlaces «admin» de la página pública de la solicitud en el sitio o buscar la solicitud desde la interfaz de administración, en la sección «Requests». + +Desplácese hacia abajo, hasta el apartado «Outgoing Messages», y haga clic en «Edit». + +En la siguiente página podrá editar el mensaje y guardarlo. La versión editada aparecerá en el sitio basado en Alaveteli, pero la versión sin editar se habrá enviado a la autoridad. + + +### Ocultar texto concreto de una solicitud + +Pueden añadirse normas de censura a una solicitud o a un usuario. Estas normas definen +porciones que deben eliminarse, bien de la solicitud (y todos los archivos asociados, por ejemplo, +adjuntos en mensajes entrantes) o bien de todas las solicitudes asociadas a un usuario, y +un texto de sustitución. En los archivos binarios el texto de sustitución será siempre una serie +de «x» caracteres de longitud idéntica al texto sustituido para mantener la longitud del +archivo. La censura de adjuntos no funciona de forma consistente, pues resulta complejo +redactar normas que coincidan con los contenidos exactos del archivo subyacente, así que +deberá comprobar siempre los resultados. Asegúrese también de añadir normas de censura +para el texto real y compruebe la opción «View as HTML»; esta opción es actualmente +(septiembre de 2013) generada a partir de archivos PDF u otros archivos binarios sin censura. + +Puede hacer que una norma de censura se aplique como una [expresión +regular](http://en.wikipedia.org/wiki/Regular_expression) activando la casilla +«Is it regexp replacement?» en la interfaz de administración de normas de censura. +En caso contrario solo sustituirá literalmente las ocurrencias en el texto introducido. +Al igual que las normas de censura comunes basadas en texto regular, las normas basadas +en expresiones regulares se ejecutarán también en archivos binarios relacionados con la +solicitud, así que una expresión regular algo ambigua puede resultar en consecuencias +inesperadas si también concuerda con la secuencia subyacente de caracteres de un archivo +binario. Además, las expresiones regulares complejas o ambiguas pueden tener un coste de +ejecución muy elevado (en algunos casos pueden congelar la aplicación por completo). +Por tanto: + +* Restrinja su uso a los casos que no puedan cubrirse con facilidad de otro modo. +* Manténgalas simples y específicas en la medida de lo posible. + +<strong>Para añadir una norma de censura a una solicitud</strong>, acceda a la página de +administración de dicha solicitud, desplácese hacia la parte inferior de la página y haga +clic en el botón «New censor rule (for this request only)». En la página siguiente, +introduzca el texto que desea sustituir, por ejemplo, «información privada», el texto con el +que desea sustituirlo, por ejemplo, «[información privada oculta]», y un comentario indicando +a otros administradores por qué ha ocultado esta información. + +<strong>Para añadir una norma de censura a un usuario</strong>, de forma que se aplique +a todas las solicitudes efectuadas por dicho usuario, acceda a la página del usuario en la +interfaz de administración. Puede hacerlo mediante un clic en la sección «Users» y buscar +al usuario que desea o siguiendo el enlace «admin» de la interfaz pública del usuario. Una +vez se encuentre en la página de administración del usuario, desplácese hasta la parte inferior +de la página y haga clic en el botón «New censor rule». En la siguiente página, introduzca +el texto que desea sustituir, por ejemplo «mi nombre real es Bruce Wayne», el texto con el que +que desea sustituirlo, por ejemplo, «[información privada oculta]», y un comentario indicando +a otros administradores por qué ha ocultado esta información. + + diff --git a/es/docs/running/index.md b/es/docs/running/index.md new file mode 100644 index 000000000..dc9a242fe --- /dev/null +++ b/es/docs/running/index.md @@ -0,0 +1,30 @@ +--- +layout: es/page +title: Ejecución +--- + +# Ejecución de Alaveteli + + +<p class="lead"> + Mantener su sitio basado en Alaveteli en ejecución requiere cierto esfuerzo constante. +</p> + +Alaveteli no es tan solo software. Para gestionar un sitio de +<a href="{{ page.baseurl }}/docs/glossary/#foi" class="glossary__link">información pública</a> +con éxito, necesita asegurarse día a día de que las tareas se llevan a cabo. La mayoría de sitios basados en Alaveteli +son gestionados por un equipo que dedica parte de su tiempo diario a dar soporte a usuarios y, en general, a +mantener el proyecto actualizado. + +* El [manual de administrador]({{ page.baseurl }}/docs/running/admin_manual/) describe + lo que necesita hacer y saber para gestionar su sitio. + +* La [guía de edición]({{ page.baseurl }}/docs/running/redaction/) incluye algunos + ejemplos de la habilidad de Alaveteli para editar información que puede herir la sensibilidad. + +* Hemos preparado una lista de verificación de + [cosas a tener en cuenta]({{ page.baseurl }}/docs/running/server/) + al establecer su servidor de producción. + + + diff --git a/es/docs/running/redaction.md b/es/docs/running/redaction.md new file mode 100644 index 000000000..373eab247 --- /dev/null +++ b/es/docs/running/redaction.md @@ -0,0 +1,135 @@ +--- +layout: es/page +title: Edición de información delicada +--- + +# Edición de información delicada + +En algunos países los requisitos locales exigen que las solicitudes contengan datos personales, tales como la dirección o el número del documento de indentidad de la persona que solicita la información. Normalmente los solicitantes no desean que esta información se muestre de forma pública. + +Alaveteli tiene cierta habilidad para gestionar estos datos mediante el uso de <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">normas de censura</a>. + +El [tema](https://github.com/mysociety/derechoapreguntar-theme) que utilizaremos como ejemplo requiere el número del documento nacional de identidad y lo que se conoce como ley general en Nicaragua (fecha de nacimiento, domicilio, profesión y estado civil). + + + +## Número del documento de identidad + +Empezaremos mirando el número del documento nacional de identidad. Este un buen ejemplo de un concepto cuya edición resulta sencilla. Es único para cada usuario y cuenta con un formato específico comprobable. + +Para enviar el número del documento de identidad a la autoridad, sobrescribiremos [la plantilla inicial de solicitud](https://github.com/mysociety/alaveteli/blob/master/app/views/outgoing_mailer/initial_request.text.erb) (fragmento de código recortado): + + <%= raw @outgoing_message.body.strip %> + + ------------------------------------------------------------------- + + <%= _('Requestor details') %> + <%= _('Identity Card Number') %>: <%= @user_identity_card_number %> + +Ahora, al efectuar una solicitud, se añade el número del documento de identidad del usuario al pie del correo saliente. + + + +En este punto no hemos añadido ninguna <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a>. Cuando la autoridad responde es poco probable que elimine el texto citado del correo electrónico: + + + +Podríamos añadir una <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> para la solicitud individual pero, ya que cada solicitud incluirá un número de documento de identidad, es mejor añadir algo de código para que se edite automáticamente. + +Para ilustrar este ejemplo, aplicaremos un parche al modelo `User` con una retrollamada que crea una <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> cuando se crea o actualiza un usuario. + + # THEME_ROOT/lib/model_patches.rb + User.class_eval do + after_save :update_censor_rules + + private + + def update_censor_rules + censor_rules.where(:text => identity_card_number).first_or_create( + :text => identity_card_number, + :replacement => _('REDACTED'), + :last_edit_editor => THEME_NAME, + :last_edit_comment => _('Updated automatically after_save') + ) + end + end + +Puede ver la nueva <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> en la interfaz de administración: + + + +Ahora el número del documento de identidad se edita: + + + +También se edita si el organismo público utiliza el número del documento de identidad en el cuerpo del correo: + + + +Una <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> añadida a un usuario solo se aplica en la correspondencia de solicitudes creadas por dicho usuario. No se aplica a anotaciones realizadas por el usuario. + +**Advertencia:** La edición de este tipo requiere que el texto delicado se encuentre exactamente en el mismo formato que la <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a>. Si es mínimamente diferente, es posible que la edición falle. Si el organismo público eliminase los guiones del número, este no se editaría: + + + +**Advertencia:** Alaveteli también intenta editar el texto de todos los adjuntos. Solo puede hacerlo si detecta la cadena de texto exacta, que no suele ser posible con formatos binarios como PDF o Word. + +Alaveteli puede normalmente editar la información delicada al convertir un documento de texto o en formato PDF a HTML: + + + +Este PDF no contiene la cadena de texto en el formato binario, así que la edición _no_ se aplica al descargar el documento PDF original: + + + +## Ley general + +La información de la ley general es mucho más difícil de editar automáticamente. No está tan estructurada y es poco probable que sea única (por ejemplo, domicilio: Londres). + +Añadiremos la información de la ley general a la [plantilla inicial de solicitud](https://github.com/mysociety/alaveteli/blob/master/app/views/outgoing_mailer/initial_request.text.erb) del mismo modo que el número del documento de identidad: + + <%= _('Requestor details') %>: + <%-# !!!IF YOU CHANGE THE FORMAT OF THE BLOCK BELOW, ADD A NEW CENSOR RULE!!! -%> + =================================================================== + # <%= _('Name') %>: <%= @user_name %> + # <%= _('Identity Card Number') %>: <%= @user_identity_card_number %> + <% @user_general_law_attributes.each do |key, value| %> + # <%= _(key.humanize) %>: <%= value %> + <% end %> + =================================================================== + +Ahora la información está contenida en un bloque de texto con un formato especial. + + + +Así se permite que una <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> concuerde con el formato especial y elimine todo lo que se halle en su interior. Esta <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> es general, así que actuará en las coincidencias de todas las solicitudes. + + # THEME_ROOT/lib/censor_rules.rb + # If not already created, make a CensorRule that hides personal information + regexp = '={67}\s*\n(?:[^\n]*?#[^\n]*?: ?[^\n]*\n){3,10}[^\n]*={67}' + + unless CensorRule.find_by_text(regexp) + Rails.logger.info("Creating new censor rule: /#{regexp}/") + CensorRule.create!(:text => regexp, + :allow_global => true, + :replacement => _('REDACTED'), + :regexp => true, + :last_edit_editor => THEME_NAME, + :last_edit_comment => 'Added automatically') + end + + + +**Advertencia:** La edición de información desestructurada es una aproximación muy delicada, pues se apoya en que las autoridades siempre citen el texto completo. + +En tal caso la autoridad ha revelado la fecha de nacimiento y el domicilio del usuario: + + + +Es realmente difícil añadir una <a href="{{ page.baseurl }}/docs/glossary/#censor-rule" class="glossary__link">norma de censura</a> para eliminar este tipo de información. Una sugerencia puede ser eliminar todas las menciones de la fecha de nacimiento del usuario, pero debería tener en cuenta [todos los tipos de formato de fecha](http://en.wikipedia.org/wiki/Calendar_date#Date_format). Probablemente podría editar todas las apariciones del domicilio del usuario, pero si se trata de una solicitud relacionada con su región, es muy probable que esta se volviera incomprensible. + + + +La edición se ha aplicado, pero no hay forma de conocer el contexto en que se utiliza una palabra delicada. + + diff --git a/es/docs/running/security.md b/es/docs/running/security.md new file mode 100644 index 000000000..28f29d3d0 --- /dev/null +++ b/es/docs/running/security.md @@ -0,0 +1,36 @@ +--- +layout: es/page +title: Seguridad y mantenimiento +--- + +# Seguridad y mantenimiento + +<p class="lead"> + El soporte de Alaveteli se divide en cuatro grupos: nuevas funcionalidades, soluciones de errores, problemas de seguridad y problemas graves de seguridad. Se gestionan del siguiente modo: +</p> + +## Nuevas funcionalidades + +Solo la [última rama de desarrollo](https://github.com/mysociety/alaveteli/tree/rails-3-develop/) recibe nuevas funcionalidades, que se ofrecerán en la próxima actualización principal. + +## Soluciones de errores + +- Solo la versión actual recibirá soluciones de errores. +- Las soluciones de errores recibirán una nueva versión (por ejemplo, `0.19.0` pasa a ser `0.19.1`). +- Las soluciones de errores se aplicarán a la rama de desarrollo actual. + +## Problemas de seguridad + +- La versión actual, la anterior y la rama de desarrollo actual recibirán soluciones. +- Los problemas de seguridad recibirán una nueva versión (por ejemplo, `0.19.0` pasa a ser `0.19.1`) para la versión actual y las anteriores. +- Se publicará un parche genérico en la lista de correo. + +## Problemas graves de seguridad + +- La gravedad es determinada por el equipo principal de Alaveteli. +- La versión actual, la anterior y la rama de desarrollo actual recibirán soluciones. +- Los problemas graves de seguridad recibirán una nueva versión (por ejemplo, `0.19.0` pasa a ser `0.19.1`) para la versión actual y las anteriores. +- Se publicará un parche genérico en la lista de correo. +- Todas las versiones en producción recibirán parches y se harán todos los esfuerzos posibles para contactar con usuarios conocidos para proporcionarlos de forma privada. + + diff --git a/es/docs/running/server.md b/es/docs/running/server.md new file mode 100644 index 000000000..075b32a6b --- /dev/null +++ b/es/docs/running/server.md @@ -0,0 +1,117 @@ +--- +layout: es/page +title: Buenas prácticas para el servidor de producción +--- + +# Buenas prácticas para el servidor de producción + +<p class="lead"> + Estas notas sirven como lista de verificación de detalles a tener en cuenta al preparar + el despliegue de su servidor de producción basado en Alaveteli. +</p> + + +## Opciones de hospedaje + +Su servidor de producción debe ser seguro y fiable. Si aún no gestiona sus propios servidores, +considere una de las siguientes opciones: + +* Servidor en la nube +* Servidor privado virtual + +En algunos casos podemos hospedar nuevos proyectos basados en Alaveteli; si necesita ayuda, +consúltenos sobre el hospedaje. + +## Trabajos de tipo cron + +No olvide definir los trabajos de tipo cron tal como se expone en las +[instrucciones de instalación]({{ page.baseurl }}/docs/installing/manual_install/). + +## Configuración del servidor web + +Le recomendamos gestionar su sitio mediante +[Apache](https://httpd.apache.org) y +[Passenger](https://www.phusionpassenger.com) o [Nginx](http://wiki.nginx.org/Main) y [Thin](http://code.macournoyer.com/thin/). + +Si utiliza Passenger, consulte las +[instrucciones de instalación]({{ page.baseurl }}/docs/installing/manual_install/) +sobre `PassengerMaxPoolSize`, con el que debería experimentar +para adaptarse a su memoria RAM disponible. Es muy poco probable que jamás +necesite un pool de mayor tamaño que el [predeterminado de +Passenger](http://www.modrails.com/documentation/Users%20guide%20Apache.html#_passengermaxpoolsize_lt_integer_gt) de 6. + +Le recomendamos poner en funcionamiento su servidor con un acelerador HTTP como +[Varnish](https://www.varnish-cache.org). +Alaveteli se proporciona con un +[VCL de varnish de muestra](https://github.com/mysociety/alaveteli/blob/master/config/varnish-alaveteli.vcl). + +## Seguridad + +_Debe_ modificar todos los [ajustes de configuración]({{ page.baseurl }}/docs/customising/config/) +relacionados con claves en el archivo `general.yml`, incluidos (¡pero existen otros!) +los siguientes: + +* [`INCOMING_EMAIL_SECRET`]({{ page.baseurl }}/docs/customising/config/#incoming_email_secret) +* [`ADMIN_USERNAME`]({{ page.baseurl }}/docs/customising/config/#admin_username) +* [`ADMIN_PASSWORD`]({{ page.baseurl }}/docs/customising/config/#admin_password) +* [`COOKIE_STORE_SESSION_SECRET`]({{ page.baseurl }}/docs/customising/config/#cookie_store_session_secret) +* [`RECAPTCHA_PUBLIC_KEY`]({{ page.baseurl }}/docs/customising/config/#recaptcha_public_key) +* [`RECAPTCHA_PRIVATE_KEY`]({{ page.baseurl }}/docs/customising/config/#recaptcha_private_key) + +Debería considerar la posibilidad de gestionar el apartado de administración del sitio a través de HTTPS. +Para ello puede reescribir normas que redirijan direcciones URL que empiecen por `/admin`. + +## Configuración del correo electrónico + +Consulte la [configuración para exim o postfix]({{ page.baseurl }}/docs/installing/email/) para +configurar su servidor de correo (MTA). Es posible utilizar otros MTA; +si utiliza uno diferente, la documentación debería proporcionarle suficiente información +para empezar. Si este tema le interesa, ¡añada documentación! + +En un servidor real debería considerar también lo siguiente, para mejorar la capacidad de +entrega de su correo electrónico: + +* Establezca [registros SPF](http://www.openspf.org/) para su dominio. +* Establezca <a + href="http://wiki.asrg.sp.am/wiki/Feedback_loop_links_for_some_email_providers">bucles de retroalimentación</a> con los proveedores de correo principales + (se recomienda Hotmail y Yahoo!) +* Especialmente si realiza el despliegue a partir de Amazon EC2, utilice un relevo SMTP externo + para enviar correo saliente. Consulte el [AMI EC2 de Alaveteli]( {{ page.baseurl }}/docs/installing/ami/) + para ver más sugerencias. + +## Copia de seguridad + +Muchos de los datos del sitio se almacenan en la base de datos de producción. La excepción +radica en los datos de tipo raw del correo entrante, que se almacenan en el sistema de archivos, tal como se +especifica en el ajuste +[`RAW_EMAILS_LOCATION`]({{ page.baseurl }}/docs/customising/config/#raw_emails_location) +del archivo `config/general.yml`. + +Consulte la [documentación de +Postgres](http://www.postgresql.org/docs/8.4/static/backup.html) para +ver estrategias de copia de seguridad de bases de datos. El método más habitual consiste en utilizar `pg_dump` +para crear un volcado SQL de la base de datos y después realizar una copia de seguridad comprimida de dicho volcado. + +Las copias de seguridad de los correos de tipo raw se llevarían a cabo mejor mediante una estrategia de incremento progresivo. +[Rsync](http://rsync.samba.org/) es una forma de hacerlo. + +Otra estrategia de copia de seguridad para curarse en salud consiste en programar su MTA para que copie todo +el correo entrante y saliente en un buzón de correo que funcione como copia de seguridad. Un método para hacerlo mediante exim +consiste en incorporar lo siguiente en su configuración de exim: + + system_filter = ALAVETELI_HOME/config/exim.filter + system_filter_user = ALAVETELI_USER + +Y después crear un filtro en `ALAVETELI_HOME/config/exim.filter` similar a: + + if error_message then finish endif + if $header_to: contains "midominio.org" + then + unseen deliver "copia@midominiodecopia.org" + endif + + if $sender_address: contains "midominio.org" + then + unseen deliver "copia@midominiodecopia.org" + endif + diff --git a/es/docs/running/upgrading.md b/es/docs/running/upgrading.md new file mode 100644 index 000000000..76149bdd6 --- /dev/null +++ b/es/docs/running/upgrading.md @@ -0,0 +1,113 @@ +--- +layout: es/page +title: Actualización +--- +Actualización de Alaveteli +==================== + +<p class="lead"> + Alaveteli se halla en desarrollo activo; no permita que la versión que utiliza se retrase + demasiado respecto a nuestra última + <a href="{{ page.baseurl }}/docs/glossary/#release" class="glossary__link">actualización</a>. + Esta página describe cómo mantener su sitio actualizado. +</p> + +## Cómo actualizar el código + +* Si utiliza Capistrano para la implementación, + simplemente [despliegue el código]({{ page.baseurl }}/docs/installing/deploy/#uso): + defina el repositorio y la rama en `deploy.yml` en función a la versión que desee. + Le recomendamos que establezca estos valores con el nombre explícito de la etiqueta (por ejemplo, + `0.18` y no `master`) para que no exista ningún riesgo de desplegar por error + una nueva versión antes de ser consciente de que se ha publicado. +* Si no, puede actualizar ejecutando `git pull`. + +## Ejecutar el script posterior al despliegue + +A menos que utilice [Capistrano para la implementación]({{ page.baseurl }}/docs/installing/deploy/), +siempre debería ejectuar el script `scripts/rails-post-deploy` después de cada +despliegue. Dicho script efectúa todas las migraciones de bases de datos, además de otras +diversas tareas que pueden automatizarse en el despliegue. + +## Números de versión de Alaveteli + +Alaveteli utiliza una versión modificada de [semver](http://semver.org). + +- Serie `W` +- Mayor `X` +- Menor `Y` +- Parche `Z` + +En el momento de redacción de esta documentación, la versión actual es `0.19.0.6`: + +- Serie `0` +- Mayor `19` +- Menor `0` +- Parche `6` + +Alaveteli evolucionará a la especificación de [semver](http://semver.org) al alcanzar `1.0.0`. + +## La rama maestra contiene la última versión estable + +La política del equipo de desarrollo indica que la rama maestra `master` siempre debe +contener la última versión estable; así que, si extrae los datos de la rama `master`, +siempre estará actualizado. Sin embargo, debería saber exactamente qué versión se está +ejecutando en su +<a href="{{ page.baseurl }}/docs/glossary/#production" class="glossary__link">servidor +de producción</a> e implementar Alaveteli a partir de una [etiqueta de versión +*específica*](https://github.com/mysociety/alaveteli/releases). + +Es posible que la actualización solo requiera obtener el código más actual, pero tal vez también +necesite efectuar otros cambios («acciones adicionales»). Debido a este motivo, para todo lo que no se trate +de un *parche* (consulte la información inferior), lea siempre el documento +[`CHANGES.md`](https://github.com/mysociety/alaveteli/blob/master/doc/CHANGES.md) +**antes** de efectuar una actualización. De este modo podrá preparar otros posibles cambios que puedan +ser necesarios para que el código nuevo funcione. + +## Parches + +Los aumentos de versión de parche (por ejemplo, 0.1.2.3 → 0.1.2.**4**) no deberían requerir ninguna acción adicional por su parte. Serán retrocompatibles con la versión menor actual. + +## Actualizaciones menores + +Los aumentos menores de versión (por ejemplo, 0.1.2.4 → 0.1.**3**.0) habitualmente requerirán acciones adicionales. Debería leer el documento [`CHANGES.md`](https://github.com/mysociety/alaveteli/blob/master/doc/CHANGES.md) para ver qué ha cambiado desde su último despliegue, prestando especial atención a todo lo indicado +en las secciones «notas de actualización». + +Toda actualización puede incluir nuevas cadenas de texto de traducción, ya sean mensajes nuevos o modificados +para el usuario, que necesitan traducirse para su localización. Debería visitar Transifex +e intentar conseguir su traducción al 100% en cada actualización. Al no conseguirlo, +cualquier palabra añadida al código fuente de Alaveteli aparecerá en su sitio web +en inglés por defecto. Si sus traducciones no alcanzaron la última versión, +deberá descargar el archivo actualizado `app.po` para su localización +desde Transifex y guardarlo en la carpeta `locale/`. + +Las actualizaciones menores serán retrocompatibles con la versión mayor actual. + +## Actualizaciones mayores + +Los aumentos mayores de versión (por ejemplo, 0.1.2.4 → 0.**2**.0.0) habitualmente requerirán acciones adicionales. Debería leer el documento [`CHANGES.md`](https://github.com/mysociety/alaveteli/blob/master/doc/CHANGES.md) para ver qué ha cambiado desde su último despliegue, prestando especial atención a todo lo indicado +en las secciones «notas de actualización». + +Solamente las actualizaciones mayores pueden eliminar funcionalidades existentes. Recibirá alertas respecto a la eliminación de funcionalidades con una advertencia sobre características obsoletas en una actualización menor previa antes de que la actualización mayor elimine las funcionalidades. + +## Actualizaciones de serie + +Estas actualizaciones vienen acompañadas de instrucciones especiales. + +## Advertencias sobre características obsoletas + +Es posible que empiece a ver advertencias sobre características obsoletas en su registro de aplicación. Tendrán este aspecto: + + DEPRECATION WARNING: Object#id will be deprecated; use Object#object_id + +Las advertencias sobre características obsoletas nos permiten comunicarle que algunas funcionalidades se modificarán o eliminarán en una actualización futura de Alaveteli. + +### Qué hacer al ver una advertencia sobre características obsoletas + +Normalmente verá una advertencia sobre características obsoletas si ha estado utilizando una funcionalidad en su tema que se va a modificar o eliminar próximamente. La advertencia debería proporcionarle suficientes explicaciones sobre qué hacer con ella. En general se trata siempre de eliminar o modificar métodos. El [registro de cambios](https://github.com/mysociety/alaveteli/blob/rails-3-develop/doc/CHANGES.md) incluirá información más detallada sobre características obsoletas y sobre cómo llevar a cabo las modificaciones pertinentes. + +Si tiene alguna consulta, no dude en preguntar en la [lista de correo de desarrollo](https://groups.google.com/group/alaveteli-dev) o en [el canal IRC de Alaveteli](http://www.irc.mysociety.org/). + +### ¿Cuándo se efectuará el cambio? + +Introducimos advertencias sobre características obsoletas en una actualización **menor**. La actualización **mayor** posterior efectuará el cambio, a menos que se indique de otra manera en la advertencia. diff --git a/es/index.md b/es/index.md new file mode 100644 index 000000000..ee0fd3aa1 --- /dev/null +++ b/es/index.md @@ -0,0 +1,147 @@ +--- +layout: es/landing +title: Bienvenido +--- + +<meta charset="utf-8"> +<div class="hero"> + <div class="container"> + <h1><span>Gestione su propio</span> sitio web de información pública</h1> + <p>Alaveteli permite reducir las barreras que evitan que los ciudadanos realicen preguntas a quienes se hallan al mando</p> + <p class="action-buttons"><a href="{{ page.baseurl }}/docs/getting_started/" class="button">Primeros pasos</a> <a href="{{ page.baseurl }}/docs/" class="button">Más información</a></p> + </div> +</div> + +<div class="what-is-alaveteli"> + <div class="container"> + <h2>¿Qué es Alaveteli?</h2> + <div class="grid-row what-is-alaveteli__items-grid"> + <div class="what-is-alaveteli__grid-unit"> + <div class="what-is-alaveteli__item what-is-alaveteli__item--foi"> + <p>Una plataforma de código abierto para realizar solicitudes de información pública a organismos públicos.</p> + </div> + </div><!-- + --><div class="what-is-alaveteli__grid-unit"> + <div class="what-is-alaveteli__item what-is-alaveteli__item--help"> + <p>Construida para ayudar a los ciudadanos a solicitar información, así como para consultar y comentar las solicitudes de otras personas</p> + </div> + </div><!-- + --><div class="what-is-alaveteli__grid-unit"> + <div class="what-is-alaveteli__item what-is-alaveteli__item--published"> + <p>Todas las solicitudes realizadas mediante Alaveteli y sus correspondientes respuestas se publican en línea y son accesibles para todo el mundo.</p> + </div> + </div><!-- + --><div class="what-is-alaveteli__grid-unit"> + <div class="what-is-alaveteli__item what-is-alaveteli__item--open"> + <p>Utilizada en todo el mundo para colaborar en la transparencia de los gobiernos y otras entidades públicas. </p> + </div> + </div> + </div> + <div class="what-is-alaveteli__international-reach-position"> + <div class="what-is-alaveteli__international-reach"> + <p class="message">Alaveteli ha ayudado a los ciudadanos a realizar más de <strong>200.000 solicitudes de información pública</strong> en <strong>18 jurisdicciones</strong></p> + <p><a href="{{ page.baseurl }}/deployments/">Consulte todas sus implementaciones</a></p> + </div> + </div> + </div> +</div> +<div class="how-does-it-work"> + <div class="how-does-it-work__slide"> + <div class="container"> + <div class="how-does-it-work__content"> + <h2>Cómo funciona Alaveteli</h2> + <p>Busque la autoridad correspondiente y realice una solicitud de información pública</p> + <img src="{{ site.baseurl }}assets/img/alaveteli-demo-screen-find.svg" class="alaveteli-demo-screenshot"/> + </div> + </div> + </div> + <div class="how-does-it-work__slide"> + <div class="container"> + <div class="how-does-it-work__content"> + <h2>Cómo funciona Alaveteli</h2> + <p>Redacte su solicitud de información para dicha autoridad</p> + <img src="{{ site.baseurl }}assets/img/alaveteli-demo-screen-ask.svg" class="alaveteli-demo-screenshot"/> + </div> + </div> + </div> + <div class="how-does-it-work__slide"> + <div class="container"> + <div class="how-does-it-work__content"> + <h2>Cómo funciona Alaveteli</h2> + <p>La solicitud y todas sus respuestas se publicarán en línea para que todo el mundo pueda verlas</p> + <img src="{{ site.baseurl }}assets/img/alaveteli-demo-screen-view.svg" class="alaveteli-demo-screenshot"/> + </div> + </div> + </div> +</div> +<div class="features"> + <div class="container"> + <h2>¿Qué hace Alaveteli?</h2> + <div class="grid-row"> + <div class="features__grid-unit features__grid-unit--wide"> + <div class="features__item features__item--primary features__item--devices"> + <h3>Soporta numerosos dispositivos directamente</h3> + <p>Alaveteli trabaja a la perfección en una amplia gama de dispositivos, incluidos teléfonos inteligentes y tabletas, gracias a su diseño flexible y accesible.</p> + </div> + </div><!-- + --><div class="features__grid-unit features__grid-unit--wide"> + <div class="features__item features__item--primary features__item--messaging"> + <h3>Mensajes, notificaciones y seguimiento</h3> + <p>Alaveteli controla el proceso de todas las solicitudes y realiza notificaciones para informar en cada paso a los organismos públicos y a los solicitantes.</p> + </div> + </div> + </div> + <div class="grid-row"> + <div class="features__grid-unit"> + <div class="features__item"> + <h3>Totalmente personalizable</h3> + <p>Utilice nuestro código como punto de partida para añadir sus propias funcionalidades y requisitos nacionales específicos</p> + </div> + </div><!-- + --><div class="features__grid-unit"> + <div class="features__item"> + <h3>Multilingüe</h3> + <p>Disponible en veinte idiomas y en constante aumento. Puede traducirlo a su propio idioma</p> + </div> + </div><!-- + --><div class="features__grid-unit"> + <div class="features__item"> + <h3>Activo</h3> + <p>Alaveteli se desarrolla continuamente y es de código abierto, así que puede colaborar para mejorarlo</p> + </div> + </div><!-- + --><div class="features__grid-unit"> + <div class="features__item"> + <h3>Sencillo</h3> + <p>Alaveteli oculta la complejidad detrás del proceso de información pública y facilita que los ciudadanos ejerzan sus derechos</p> + </div> + </div> + </div> + </div> +</div> + +<div class="get-started"> + <div class="container"> + <h2>Primeros pasos</h2> + <div class="get-started__grid-unit get-started__grid-unit--wide"> + <div class="get-started__item get-started__item--primary"> + <p>Desde los miembros del equipo hasta los encargados de mantenimiento, nuestra guía de inicio recorre todo el proceso de planificación, inicio y gestión de su propio sitio web basado en Alaveteli</p> + <p><a href="{{ page.baseurl }}/docs/getting_started/" class="button">Primeros pasos</a></p> + </div> + </div><!-- + --><div class="get-started__grid-unit"> + <div class="get-started__item get-started__item"> + <h3>Obtenga el código</h3> + <p>Alaveteli es de código abierto y está disponible para su consulta, descarga y modificación en GitHub</p> + <p><a href="https://github.com/mysociety/alaveteli/" class="button">Github</a></p> + </div> + </div><!-- + --><div class="get-started__grid-unit"> + <div class="get-started__item get-started__item"> + <h3>Hable con nosotros</h3> + <p>¿Necesita ayuda? Coméntenos sus planes</p> + <p class="push-top"><a href="{{ page.baseurl }}/community/" class="button">Póngase en contacto</a></p> + </div> + </div> + </div> +</div> diff --git a/es/search.md b/es/search.md new file mode 100644 index 000000000..a1e670ad9 --- /dev/null +++ b/es/search.md @@ -0,0 +1,9 @@ +--- +layout: es/page +title: Búsqueda +--- +<meta charset="utf-8"> + +Búsqueda de documentación +==================== +<gcse:searchresults-only></gcse:searchresults-only> @@ -6,7 +6,7 @@ title: Welcome <div class="container"> <h1><span>Run your own</span> Freedom of Information website</h1> <p>Alaveteli helps you lower the barriers that prevent citizens asking questions of those in power</p> - <p class="action-buttons"><a href="{{ site.baseurl }}docs/getting_started/" class="button">Get started</a> <a href="{{ site.baseurl }}docs/" class="button">Learn more</a></p> + <p class="action-buttons"><a href="{{ page.baseurl }}/docs/getting_started/" class="button">Get started</a> <a href="{{ page.baseurl }}/docs/" class="button">Learn more</a></p> </div> </div> @@ -124,7 +124,7 @@ title: Welcome <div class="get-started__grid-unit get-started__grid-unit--wide"> <div class="get-started__item get-started__item--primary"> <p>From team members to maintenance, our get started guide will walk you through the process of planning, starting and running your own Alaveteli website</p> - <p><a href="{{ site.baseurl }}docs/getting_started/" class="button">Get started</a></p> + <p><a href="{{ page.baseurl }}/docs/getting_started/" class="button">Get started</a></p> </div> </div><!-- --><div class="get-started__grid-unit"> @@ -138,7 +138,7 @@ title: Welcome <div class="get-started__item get-started__item"> <h3>Speak to us</h3> <p>Need some help? Tell us about your plans</p> - <p class="push-top"><a href="{{ site.baseurl }}community/" class="button">Get in touch</a></p> + <p class="push-top"><a href="{{ page.baseurl }}/community/" class="button">Get in touch</a></p> </div> </div> </div> diff --git a/script/import-translated-page b/script/import-translated-page new file mode 100755 index 000000000..bcbb602a1 --- /dev/null +++ b/script/import-translated-page @@ -0,0 +1,201 @@ +#!/usr/bin/env ruby + +require 'optparse' +require 'pathname' + +class HelpMessage + MESSAGE = <<-EOF +About: + + Translators will deliver a page with the source language replaced with the + desired target language. We still need to do some extra work before the page + can be released. import-translated-page runs each line through the LineProcessor + and modifies the line if a matcher is hit. There are some matchers that + import-translated-page cannot process automatically; these will need to be + changed by you. Run the command without the --force option to view these + warnings. + + Currently supported processors: + + Prefixes layouts with the lang (e.g. layout: es/page) unless the lang is + "en". + + Replaces {{ site.baseurl }} with {{ page.baseurl }} for internal page links. + + Keeps {{ site.baseurl }} for asset links. + + Removes single line redirects from non EN pages. + + Currently unsupported processors: + + A yaml list of redirects. + + Templates included with the liquid "include" tag. The template being + included needs to be prefixed with the locale. + +Examples: + + Check the Spanish translation of the "community.md" page for unsupported + matches: + + $ import-translated-page --lang=es community.md + + Manually fix any unsupported matches. + + Import the page in to the site: + + $ import-translated-page --lang=es community.md > es/community.md +EOF + + def self.print + MESSAGE + end +end + +class LineProcessor + MATCHERS = { + :layout => /^layout:\s*(\S*)$/i, + :single_line_redirect => /^redirect_\w+:\s*\S+$/i, + :base_url => /\{\{\s*site\.baseurl\s*\}\}(\S+)/i, + :asset_url => /\{\{\s*site\.baseurl\s*\}\}[^assets]\S*/i + } + + attr_reader :line, :options + + def initialize(line, options = {}) + @line = line + @options = options + end + + def process + @line = use_locale_layout + @line = remove_single_line_redirects + @line = replace_site_baseurl + @line + end + + def english? + options[:lang] == 'en' + end + + private + + def use_locale_layout + return line if english? + match = line.match(MATCHERS[:layout]) + + if match + "layout: #{ options[:lang] }/#{ match[1] }" + else + line + end + end + + def remove_single_line_redirects + return line if english? + match = line.match(MATCHERS[:single_line_redirect]) + + if match + '' + else + line + end + end + + def replace_site_baseurl + line.gsub(MATCHERS[:base_url]) do |match| + new_match = match =~ MATCHERS[:asset_url] + if new_match + match.gsub(/\{\{\s?site.baseurl\s?\}\}/, '{{ page.baseurl }}/') + else + match + end + end + end + +end + +class UnsupportedMatchChecker + UNSUPPORTED_MATCHERS = { + :multi_line_redirect => /^redirect_\w+:(\s*-{1}\s*.*)+$/i, + :include_template => /\{\%\s*include/i + } + + attr_reader :warnings + + def initialize(file_contents, file_name = 'File') + @warnings = [] + UNSUPPORTED_MATCHERS.each do |name, regex| + if file_contents =~ regex + @warnings << "WARNING: #{ file_name } contains #{ name } which cannot be processed" + end + end + end +end + +options = {} +optionparser = OptionParser.new do |opts| + opts.banner = "Usage: #{ __FILE__ } [options] source_file" + + opts.separator "" + opts.separator "Options:" + + opts.on("--force", "Ignore warnings and continue processing the source_file") do |f| + options[:force] = f + end + + opts.on("-h", "--help", "Show this message") do + puts opts + exit + end + + opts.on("--in-place", "Write the processed text back to the source_file") do |p| + options[:in_place] = p + end + + opts.on("-l", "--lang=LANG", "Two-letter language code of the source_file") do |s| + options[:lang] = s.downcase + end + + opts.on("-o", "--output-file=FILE", "File to write the processed text to") do |o| + options[:output_file] = o + end + + opts.separator "" + opts.separator HelpMessage.print +end +optionparser.parse! + +unless ARGV.length == 1 + puts optionparser.help + exit 1 +end + +source_file = ARGV.shift + +if options[:in_place] + options[:output_file] = source_file +end + +unless options[:force] + source_file_contents = File.read(source_file) + source_file_path = Pathname.new(source_file).realpath + warnings = UnsupportedMatchChecker.new(source_file_contents, source_file_path).warnings + if warnings.any? + puts warnings + puts "Use --force to ignore warnings and continue processing the file" + exit 1 + end +end + +new_contents = [] + +File.readlines(source_file).map do |line| + new_contents << LineProcessor.new(line, options).process +end + +if options[:output_file] + File.open(options[:output_file], 'w') { |f| f.puts(new_contents) } +else + puts(new_contents) +end |