diff options
609 files changed, 7887 insertions, 3076 deletions
diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 000000000..215d81196 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,5 @@ +languages: + Ruby: true + PHP: true +exclude_paths: +- "lib/strip_attributes/test/*" diff --git a/.gitignore b/.gitignore index 994f9a3a1..78a06c661 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ ._* .DS_Store .autotest +.ruby-version +.rbenv-version +.rvmrc *#*# TAGS /lib/themes @@ -25,7 +28,7 @@ config/httpd.conf config/general*.yml config/deploy.yml.* .sass-cache -alaveteli.sublime* +alaveteli*.sublime* webrat.log /.rbenv-version /db/development_structure.sql diff --git a/.ruby-version b/.ruby-version.example index 7fa1d1ef4..7fa1d1ef4 100644 --- a/.ruby-version +++ b/.ruby-version.example diff --git a/.travis.yml b/.travis.yml index 3351bed2a..c795edc67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: ruby branches: only: - master - - rails-3-develop + - develop rvm: - 1.8.7-p374 - 1.9.3 @@ -5,38 +5,39 @@ gem 'rails', '3.2.21' gem 'pg', '~> 0.17.1' # New gem releases aren't being done. master is newer and supports Rails > 3.0 -gem 'acts_as_versioned', :git => 'git://github.com/technoweenie/acts_as_versioned.git', :ref => '63b1fc8529d028' +gem 'acts_as_versioned', :git => 'https://github.com/technoweenie/acts_as_versioned.git', :ref => '63b1fc8529d028' gem 'charlock_holmes', '~> 0.6.9.4' gem 'dynamic_form', '~> 1.1.4' gem 'exception_notification', '~> 3.0.1' gem 'fancybox-rails', '~> 0.2.1' gem 'foundation-rails', '~> 5.2.1.0' gem 'icalendar', '1.4.3' -gem 'jquery-rails', '~> 3.0.4' +gem 'jquery-rails', '~> 3.1.3' gem 'jquery-ui-rails', '~> 4.1.0' gem 'json', '~> 1.8.1' -gem 'holidays', '~> 1.0.8' +gem 'holidays', '~> 1.2.0' gem 'iso_country_codes', '~> 0.6.1' gem 'mahoro', '~> 0.4' gem 'memcache-client', '~> 1.8.5' gem 'net-http-local', '~> 0.1.2', :platforms => [:ruby_18, :ruby_19] gem 'net-purge', '~> 0.1.0' +gem 'nokogiri', '~> 1.5.9' gem 'open4', '~> 1.3.4' -gem 'rack', '~> 1.4.5' +gem 'rack', '~> 1.4.6' +gem 'rack-utf8_sanitizer', '~> 1.3.0', :platforms => :ruby_19 gem 'rake', '0.9.2.2' gem 'rails-i18n', '~> 0.7.3' gem 'recaptcha', '~> 0.3.1', :require => 'recaptcha/rails' -# :require avoids "already initialized constant" warnings -gem 'rmagick', '~> 2.13.2', :require => 'RMagick' -gem 'ruby-msg', '~> 1.5.0', :git => 'git://github.com/mysociety/ruby-msg.git' -gem 'secure_headers', '~> 1.3.4' +gem 'rmagick', '~> 2.14.0' +gem 'ruby-msg', '~> 1.5.0', :git => 'https://github.com/mysociety/ruby-msg.git' +gem 'secure_headers', '~> 2.0.2' gem 'statistics2', '~> 0.54' gem 'syslog_protocol', '~> 0.9.2' gem 'thin', '~> 1.5.1' gem 'vpim', '~> 13.11.11' gem 'will_paginate', '~> 3.0.5' # when 1.2.9 is released by the maintainer, we can stop using this fork: -gem 'xapian-full-alaveteli', '~> 1.2.9.5' +gem 'xapian-full-alaveteli', '~> 1.2.9.7' gem 'xml-simple', '~> 1.1.2', :require => 'xmlsimple' gem 'zip', '~> 2.0.2' @@ -44,7 +45,7 @@ gem 'zip', '~> 2.0.2' gem 'fast_gettext', '~> 0.7.0' gem 'gettext_i18n_rails', '~> 0.9.4' gem 'gettext', '~> 2.3.9' -gem 'globalize3', :git => 'git://github.com/globalize/globalize.git', :ref => '5fd95f2389dff1' +gem 'globalize3', :git => 'https://github.com/globalize/globalize.git', :ref => '5fd95f2389dff1' gem 'locale', '~> 2.0.8' gem 'routing-filter', '~> 0.3.1' gem 'unicode', '~> 0.4.4' @@ -67,10 +68,10 @@ group :test do gem 'fakeweb', '~> 1.3.0' gem 'coveralls', :require => false gem 'webrat', '~> 0.7.3' - gem 'nokogiri', '~> 1.5.9' end group :test, :development do + gem 'bullet', '~> 4.14.6' gem 'factory_girl_rails', '~> 1.7' gem 'rspec-rails', '~> 2.13.2' gem 'spork-rails', '~> 3.2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 2f88a474e..227d41e09 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,5 +1,5 @@ GIT - remote: git://github.com/globalize/globalize.git + remote: https://github.com/globalize/globalize.git revision: 5fd95f2389dff13c9368fb2e08c96c8a48798c72 ref: 5fd95f2389dff1 specs: @@ -9,7 +9,7 @@ GIT paper_trail (~> 2) GIT - remote: git://github.com/mysociety/ruby-msg.git + remote: https://github.com/mysociety/ruby-msg.git revision: ee0086add16c755d2eaf8dbcb90ba65809061cef specs: ruby-msg (1.5.2) @@ -17,7 +17,7 @@ GIT vpim (>= 0.360) GIT - remote: git://github.com/technoweenie/acts_as_versioned.git + remote: https://github.com/technoweenie/acts_as_versioned.git revision: 63b1fc8529d028fae632fe80ec0cb25df56cd76b ref: 63b1fc8529d028 specs: @@ -60,6 +60,9 @@ GEM bootstrap-sass (2.3.1.2) sass (~> 3.2) builder (3.0.4) + bullet (4.14.6) + activesupport (>= 3.0.0) + uniform_notifier (~> 1.9.0) capistrano (2.15.4) highline net-scp (>= 1.0.0) @@ -127,12 +130,12 @@ GEM tilt highline (1.6.19) hike (1.2.3) - holidays (1.0.8) + holidays (1.2.0) i18n (0.6.11) icalendar (1.4.3) iso_country_codes (0.6.1) journey (1.0.4) - jquery-rails (3.0.4) + jquery-rails (3.1.3) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) jquery-ui-rails (4.1.0) @@ -168,7 +171,7 @@ GEM net-ssh (2.6.7) net-ssh-gateway (1.2.0) net-ssh (>= 2.6.5) - newrelic_rpm (3.11.1.284) + newrelic_rpm (3.12.0.288) nokogiri (1.5.9) open4 (1.3.4) paper_trail (2.7.2) @@ -182,7 +185,7 @@ GEM slop (~> 3.4) quiet_assets (1.0.2) railties (>= 3.1, < 5.0) - rack (1.4.5) + rack (1.4.6) rack-cache (1.2) rack (>= 0.4) rack-protection (1.5.0) @@ -191,6 +194,8 @@ GEM rack rack-test (0.6.2) rack (>= 1.0) + rack-utf8_sanitizer (1.3.0) + rack (~> 1.0) rails (3.2.21) actionmailer (= 3.2.21) actionpack (= 3.2.21) @@ -216,7 +221,7 @@ GEM ref (1.0.5) rest-client (1.6.7) mime-types (>= 1.16) - rmagick (2.13.2) + rmagick (2.14.0) routing-filter (0.3.1) actionpack rspec-core (2.13.1) @@ -241,7 +246,7 @@ GEM railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) - secure_headers (1.3.4) + secure_headers (2.0.2) simplecov (0.7.1) multi_json (~> 1.0) simplecov-html (~> 0.7.1) @@ -285,13 +290,14 @@ GEM multi_json (~> 1.0, >= 1.0.2) unicode (0.4.4) unidecoder (1.1.2) + uniform_notifier (1.9.0) vpim (13.11.11) webrat (0.7.3) nokogiri (>= 1.2.0) rack (>= 1.0) rack-test (>= 0.5.3) will_paginate (3.0.5) - xapian-full-alaveteli (1.2.9.5) + xapian-full-alaveteli (1.2.9.7) xml-simple (1.1.2) zip (2.0.2) @@ -302,6 +308,7 @@ DEPENDENCIES acts_as_versioned! annotate (~> 2.5.0) bootstrap-sass (~> 2.3.1.2) + bullet (~> 4.14.6) capistrano (~> 2.15.4) charlock_holmes (~> 0.6.9.4) coffee-rails (~> 3.2.1) @@ -318,10 +325,10 @@ DEPENDENCIES gettext (~> 2.3.9) gettext_i18n_rails (~> 0.9.4) globalize3! - holidays (~> 1.0.8) + holidays (~> 1.2.0) icalendar (= 1.4.3) iso_country_codes (~> 0.6.1) - jquery-rails (~> 3.0.4) + jquery-rails (~> 3.1.3) jquery-ui-rails (~> 4.1.0) json (~> 1.8.1) locale (~> 2.0.8) @@ -336,19 +343,20 @@ DEPENDENCIES pg (~> 0.17.1) pry (~> 0.9.6) quiet_assets (~> 1.0.2) - rack (~> 1.4.5) + rack (~> 1.4.6) + rack-utf8_sanitizer (~> 1.3.0) rails (= 3.2.21) rails-i18n (~> 0.7.3) rake (= 0.9.2.2) rdoc (~> 3.12.2) recaptcha (~> 0.3.1) - rmagick (~> 2.13.2) + rmagick (~> 2.14.0) routing-filter (~> 0.3.1) rspec-rails (~> 2.13.2) ruby-debug (~> 0.10.4) ruby-msg (~> 1.5.0)! sass-rails (~> 3.2.3) - secure_headers (~> 1.3.4) + secure_headers (~> 2.0.2) spork-rails (~> 3.2.1) statistics2 (~> 0.54) syslog_protocol (~> 0.9.2) @@ -360,6 +368,6 @@ DEPENDENCIES vpim (~> 13.11.11) webrat (~> 0.7.3) will_paginate (~> 3.0.5) - xapian-full-alaveteli (~> 1.2.9.5) + xapian-full-alaveteli (~> 1.2.9.7) xml-simple (~> 1.1.2) zip (~> 2.0.2) @@ -1,6 +1,6 @@ # Welcome to Alaveteli! -[](http://travis-ci.org/mysociety/alaveteli) [](https://gemnasium.com/mysociety/alaveteli) [](https://coveralls.io/r/mysociety/alaveteli) [](https://codeclimate.com/github/mysociety/alaveteli) +[](http://travis-ci.org/mysociety/alaveteli) [](https://gemnasium.com/mysociety/alaveteli) [](https://coveralls.io/r/mysociety/alaveteli) [](https://codeclimate.com/github/mysociety/alaveteli) [](http://mysociety.github.io/installation-standards.html) This is an open source project to create a standard, internationalised @@ -25,6 +25,22 @@ wiki](https://github.com/mysociety/alaveteli/wiki/Home/), and upgrade notes in the [`doc/` folder](https://github.com/mysociety/alaveteli/tree/master/doc/CHANGES.md) +## Installing + +We've been working hard to make Alaveteli easy to install and re-use anywhere. Please +see [the project website](http://alaveteli.org) for instructions on installing Alaveteli. + +## Compatibility + +Every Alaveteli commit is tested by Travis on the [following Ruby platforms](https://github.com/mysociety/alaveteli/blob/master/.travis.yml#L7) + +* ruby-1.8.7 +* ruby-1.9.3 +* ruby-2.0.0 + + +If you use a ruby version management tool (such as RVM or .rbenv) and want to use the default development version used by the alaveteli team (currently 2.0.0), you can create a `.ruby-version` symlink with a target of `.ruby-version.example` to switch to that automatically in the project directory. + ## How to contribute If you find what looks like a bug: @@ -36,11 +52,21 @@ If you find what looks like a bug: If you want to contribute an enhancement or a fix: * Fork the project on GitHub. -* Make a topic branch from the rails-3-develop branch. +* Make a topic branch from the develop branch. * Make your changes with tests. * Commit the changes without making changes to any files that aren't related to your enhancement or fix. -* Send a pull request against the rails-3-develop branch. +* Send a pull request against the develop branch. Looking for the latest stable release? It's on the [master branch](https://github.com/mysociety/alaveteli/tree/master). +We have some more notes for developers [on the project site](http://alaveteli.org/docs/developers/). + +## Examples + +* [WhatDoTheyKnow](https://www.whatdotheyknow.com) +* [KiMitTud](http://kimittud.atlatszo.hu) +* [Informace Pro Všechny](http://www.infoprovsechny.cz) +* [fyi.org.nz](https://fyi.org.nz) + +See more at [alaveteli.org](http://alaveteli.org/deployments/). diff --git a/app/assets/images/icon_application_octet-stream_large.png b/app/assets/images/icon_application_octet-stream_large.png Binary files differindex a239862e1..a23916e9c 100644 --- a/app/assets/images/icon_application_octet-stream_large.png +++ b/app/assets/images/icon_application_octet-stream_large.png diff --git a/app/assets/images/icon_application_pdf_large.png b/app/assets/images/icon_application_pdf_large.png Binary files differindex 9a38ca33c..990b96c0a 100644 --- a/app/assets/images/icon_application_pdf_large.png +++ b/app/assets/images/icon_application_pdf_large.png diff --git a/app/assets/images/icon_application_rtf_large.png b/app/assets/images/icon_application_rtf_large.png Binary files differindex 2ad990608..977972124 100644 --- a/app/assets/images/icon_application_rtf_large.png +++ b/app/assets/images/icon_application_rtf_large.png diff --git a/app/assets/images/icon_application_vnd.ms-excel_large.png b/app/assets/images/icon_application_vnd.ms-excel_large.png Binary files differindex 3f346f5ef..acca5d92c 100644 --- a/app/assets/images/icon_application_vnd.ms-excel_large.png +++ b/app/assets/images/icon_application_vnd.ms-excel_large.png diff --git a/app/assets/images/icon_application_vnd.ms-powerpoint_large.png b/app/assets/images/icon_application_vnd.ms-powerpoint_large.png Binary files differindex 82c225059..9a1582930 100644 --- a/app/assets/images/icon_application_vnd.ms-powerpoint_large.png +++ b/app/assets/images/icon_application_vnd.ms-powerpoint_large.png diff --git a/app/assets/images/icon_application_vnd.ms-word_large.png b/app/assets/images/icon_application_vnd.ms-word_large.png Binary files differindex 91a696ab5..2f3cb8efa 100644 --- a/app/assets/images/icon_application_vnd.ms-word_large.png +++ b/app/assets/images/icon_application_vnd.ms-word_large.png diff --git a/app/assets/images/icon_application_zip_large.png b/app/assets/images/icon_application_zip_large.png Binary files differindex 0a14e978e..c52d6d5aa 100644 --- a/app/assets/images/icon_application_zip_large.png +++ b/app/assets/images/icon_application_zip_large.png diff --git a/app/assets/images/icon_image_bmp_large.png b/app/assets/images/icon_image_bmp_large.png Binary files differindex f6e8dbaed..347bdaaf1 100644..120000 --- a/app/assets/images/icon_image_bmp_large.png +++ b/app/assets/images/icon_image_bmp_large.png diff --git a/app/assets/images/icon_image_gif_large.png b/app/assets/images/icon_image_gif_large.png Binary files differindex 424d1e0fd..347bdaaf1 100644..120000 --- a/app/assets/images/icon_image_gif_large.png +++ b/app/assets/images/icon_image_gif_large.png diff --git a/app/assets/images/icon_image_img_large.png b/app/assets/images/icon_image_img_large.png Binary files differnew file mode 100644 index 000000000..e19e7553c --- /dev/null +++ b/app/assets/images/icon_image_img_large.png diff --git a/app/assets/images/icon_image_jpeg_large.png b/app/assets/images/icon_image_jpeg_large.png Binary files differindex fd50a889d..347bdaaf1 100644..120000 --- a/app/assets/images/icon_image_jpeg_large.png +++ b/app/assets/images/icon_image_jpeg_large.png diff --git a/app/assets/images/icon_image_png_large.png b/app/assets/images/icon_image_png_large.png Binary files differindex f16edb08e..347bdaaf1 100644..120000 --- a/app/assets/images/icon_image_png_large.png +++ b/app/assets/images/icon_image_png_large.png diff --git a/app/assets/images/icon_image_tiff_large.png b/app/assets/images/icon_image_tiff_large.png Binary files differindex 356f63478..000bd0318 100644 --- a/app/assets/images/icon_image_tiff_large.png +++ b/app/assets/images/icon_image_tiff_large.png diff --git a/app/assets/images/icon_message_delivery-status_large.png b/app/assets/images/icon_message_delivery-status_large.png Binary files differindex a239862e1..dccdbbccd 100644 --- a/app/assets/images/icon_message_delivery-status_large.png +++ b/app/assets/images/icon_message_delivery-status_large.png diff --git a/app/assets/images/icon_text_html_large.png b/app/assets/images/icon_text_html_large.png Binary files differindex 914502cf4..3813d2582 100644 --- a/app/assets/images/icon_text_html_large.png +++ b/app/assets/images/icon_text_html_large.png diff --git a/app/assets/images/icon_text_plain_large.png b/app/assets/images/icon_text_plain_large.png Binary files differindex f74a997ba..f15b0dbdc 100644 --- a/app/assets/images/icon_text_plain_large.png +++ b/app/assets/images/icon_text_plain_large.png diff --git a/app/assets/images/icon_text_x-vcard_large.png b/app/assets/images/icon_text_x-vcard_large.png Binary files differindex cc44d3edc..804066af8 100644 --- a/app/assets/images/icon_text_x-vcard_large.png +++ b/app/assets/images/icon_text_x-vcard_large.png diff --git a/app/assets/images/icon_unknown.png b/app/assets/images/icon_unknown.png Binary files differindex 992c646c0..9a06d9baa 100644 --- a/app/assets/images/icon_unknown.png +++ b/app/assets/images/icon_unknown.png diff --git a/app/assets/images/widget-base.png b/app/assets/images/widget-base.png Binary files differnew file mode 100644 index 000000000..872244543 --- /dev/null +++ b/app/assets/images/widget-base.png diff --git a/app/assets/javascripts/admin/admin.js.coffee b/app/assets/javascripts/admin/admin.js.coffee index 3d39369a4..85981f065 100644 --- a/app/assets/javascripts/admin/admin.js.coffee +++ b/app/assets/javascripts/admin/admin.js.coffee @@ -5,10 +5,10 @@ jQuery -> ) $('.accordion-body').on('shown', -> $(@).prev().find('i').first().removeClass().addClass('icon-chevron-down')) - $('.toggle-hidden').live('click', -> + $('body').on('.toggle-hidden', 'click', -> $(@).parents('td').find('div:hidden').show() false) - $('#request_hidden_user_explanation_reasons input').live('click', -> + $('#request_hidden_user_explanation_reasons').on('click', 'input', -> $('#request_hidden_user_subject, #request_hidden_user_explanation, #request_hide_button').show() info_request_id = $('#hide_request_form').attr('data-info-request-id') reason = $(this).val() diff --git a/app/assets/javascripts/general.js b/app/assets/javascripts/general.js index 002eef760..639a6917b 100644 --- a/app/assets/javascripts/general.js +++ b/app/assets/javascripts/general.js @@ -34,12 +34,12 @@ $(document).ready(function() { box.width(location.length + " em"); box.find('input').val(location).attr('size', location.length + " em"); box.show(); - box.find('input').select(); box.position({ my: "right center", at: "left bottom", of: this, collision: "fit" }); + box.find('input').select(); return false; }); @@ -57,4 +57,12 @@ $(document).ready(function() { $('#everypage').hide(); } + // "Create widget" page + $("#widgetbox").select() + // Chrome workaround + $("widgetbox").mouseup(function() { + // Prevent further mouseup intervention + $this.unbind("mouseup"); + return false; + }); }) diff --git a/app/assets/javascripts/jquery.Jcrop.js b/app/assets/javascripts/jquery.Jcrop.js deleted file mode 100644 index 9002b9787..000000000 --- a/app/assets/javascripts/jquery.Jcrop.js +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Jcrop v.0.9.8 (minimized) - * (c) 2008 Kelly Hallman and DeepLiquid.com - * More information: http://deepliquid.com/content/Jcrop.html - * Released under MIT License - this header must remain with code - */ - - -(function($){$.Jcrop=function(obj,opt) -{var obj=obj,opt=opt;if(typeof(obj)!=='object')obj=$(obj)[0];if(typeof(opt)!=='object')opt={};if(!('trackDocument'in opt)) -{opt.trackDocument=$.browser.msie?false:true;if($.browser.msie&&$.browser.version.split('.')[0]=='8') -opt.trackDocument=true;} -if(!('keySupport'in opt)) -opt.keySupport=$.browser.msie?false:true;var defaults={trackDocument:false,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:.6,borderOpacity:.4,handleOpacity:.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var options=defaults;setOptions(opt);var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css({position:'absolute'});$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);;if(options.addClass)$div.addClass(options.addClass);var $img2=$('<img />').attr('src',$img.attr('src')).css('position','absolute').width(boundx).height(boundy);var $img_holder=$('<div />').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2);var $hdl_holder=$('<div />').width(pct(100)).height(pct(100)).css('zIndex',320);var $sel=$('<div />').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin;var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function() -{var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos) -{var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];};function setCurrent(pos) -{var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];};function getOffset() -{return[ox,oy];};function moveOffset(offset) -{var ox=offset[0],oy=offset[1];if(0>x1+ox)ox-=ox+x1;if(0>y1+oy)oy-=oy+y1;if(boundy<y2+oy)oy+=boundy-(y2+oy);if(boundx<x2+ox)ox+=boundx-(x2+ox);x1+=ox;x2+=ox;y1+=oy;y2+=oy;};function getCorner(ord) -{var c=getFixed();switch(ord) -{case'ne':return[c.x2,c.y];case'nw':return[c.x,c.y];case'se':return[c.x2,c.y2];case'sw':return[c.x,c.y2];}};function getFixed() -{if(!options.aspectRatio)return getRect();var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,min_y=options.minSize[1]/yscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha,xx,yy;if(max_x==0){max_x=boundx*10} -if(max_y==0){max_y=boundy*10} -if(real_ratio<aspect) -{yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0) -{xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;} -else if(xx>boundx) -{xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}} -else -{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0) -{yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;} -else if(yy>boundy) -{yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}} -if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;} -if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xx<x1){if(x1-xx<min_x){xx=x1-min_x}else if(x1-xx>max_x){xx=x1-max_x;} -if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}} -if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;} -if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;} -return last=makeObj(flipCoords(x1,y1,xx,yy));};function rebound(p) -{if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[p[0],p[1]];};function flipCoords(x1,y1,x2,y2) -{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1) -{xa=x2;xb=x1;} -if(y2<y1) -{ya=y2;yb=y1;} -return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];};function getRect() -{var xsize=x2-x1;var ysize=y2-y1;if(xlimit&&(Math.abs(xsize)>xlimit)) -x2=(xsize>0)?(x1+xlimit):(x1-xlimit);if(ylimit&&(Math.abs(ysize)>ylimit)) -y2=(ysize>0)?(y1+ylimit):(y1-ylimit);if(ymin&&(Math.abs(ysize)<ymin)) -y2=(ysize>0)?(y1+ymin):(y1-ymin);if(xmin&&(Math.abs(xsize)<xmin)) -x2=(xsize>0)?(x1+xmin):(x1-xmin);if(x1<0){x2-=x1;x1-=x1;} -if(y1<0){y2-=y1;y1-=y1;} -if(x2<0){x1-=x2;x2-=x2;} -if(y2<0){y1-=y2;y2-=y2;} -if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta;} -if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta;} -if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta;} -if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta;} -return makeObj(flipCoords(x1,y1,x2,y2));};function makeObj(a) -{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};};return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}();var Selection=function() -{var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder('hline').css('top',$.browser.msie?px(-1):px(0)),bottom:insertBorder('hline'),left:insertBorder('vline'),right:insertBorder('vline')};} -if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');} -options.sideHandles&&createHandles(['n','s','e','w']);options.cornerHandles&&createHandles(['sw','nw','ne','se']);function insertBorder(type) -{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;};function dragDiv(ord,zi) -{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});$hdl_holder.append(jq);return jq;};function insertHandle(ord) -{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));};function insertDragbar(ord) -{var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord) -{case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;} -return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});};function createHandles(li) -{for(i in li)handle[li[i]]=insertHandle(li[i]);};function moveHandles(c) -{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;'e'in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});'ne'in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});'b'in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)});};function moveto(x,y) -{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});};function resize(w,h) -{$sel.width(w).height(h);};function refresh() -{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();};function updateVisible() -{if(awake)return update();};function update() -{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders['right'].css({left:px(c.w-1)})&&borders['bottom'].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c));};function show() -{$sel.show();$img.css('opacity',options.bgOpacity);awake=true;};function release() -{disableHandles();$sel.hide();$img.css('opacity',1);awake=false;};function showHandles() -{if(seehandles) -{moveHandles(Coords.getFixed());$hdl_holder.show();}};function enableHandles() -{seehandles=true;if(options.allowResize) -{moveHandles(Coords.getFixed());$hdl_holder.show();return true;}};function disableHandles() -{seehandles=false;$hdl_holder.hide();};function animMode(v) -{(animating=v)?disableHandles():enableHandles();};function done() -{animMode(false);refresh();};var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360}) -$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}();var Tracker=function() -{var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc) -{$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);} -function toFront() -{$trk.css({zIndex:450});if(trackDoc) -{$(document).mousemove(trackMove).mouseup(trackUp);}} -function toBack() -{$trk.css({zIndex:290});if(trackDoc) -{$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}} -function trackMove(e) -{onMove(mouseAbs(e));};function trackUp(e) -{e.preventDefault();e.stopPropagation();if(btndown) -{btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){};} -return false;};function activateHandlers(move,done) -{btndown=true;onMove=move;onDone=done;toFront();return false;};function setCursor(t){$trk.css('cursor',t);};$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}();var KeyManager=function() -{var $keymgr=$('<input type="radio" />').css({position:'absolute',left:'-30px'}).keypress(parseKey).blur(onBlur),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys() -{if(options.keySupport) -{$keymgr.show();$keymgr.focus();}};function onBlur(e) -{$keymgr.hide();};function doNudge(e,x,y) -{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();};e.preventDefault();e.stopPropagation();};function parseKey(e) -{if(e.ctrlKey)return true;shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode) -{case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;} -return nothing(e);};if(options.keySupport)$keywrap.insertBefore($img);return{watchKeys:watchKeys};}();function px(n){return''+parseInt(n)+'px';};function pct(n){return''+parseInt(n)+'%';};function cssClass(cl){return options.baseClass+'-'+cl;};function getPos(obj) -{var pos=$(obj).offset();return[pos.left,pos.top];};function mouseAbs(e) -{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];};function myCursor(type) -{if(type!=lastcurs) -{Tracker.setCursor(type);lastcurs=type;}};function startDragMode(mode,pos) -{docOffset=getPos($img);Tracker.setCursor(mode=='move'?mode:mode+'-resize');if(mode=='move') -return Tracker.activateHandlers(createMover(pos),doneSelect);var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);};function dragmodeHandler(mode,f) -{return function(pos){if(!options.aspectRatio)switch(mode) -{case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;} -else switch(mode) -{case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;} -Coords.setCurrent(pos);Selection.update();};};function createMover(pos) -{var lloc=pos;KeyManager.watchKeys();return function(pos) -{Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};};function oppLockCorner(ord) -{switch(ord) -{case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';};};function createDragger(ord) -{return function(e){if(options.disabled)return false;if((ord=='move')&&!options.allowMove)return false;btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};};function presize($obj,w,h) -{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0) -{nw=w;nh=(w/$obj.width())*$obj.height();} -if((nh>h)&&h>0) -{nh=h;nw=(h/$obj.height())*$obj.width();} -xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);};function unscale(c) -{return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)};};function doneSelect(pos) -{var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1]) -{Selection.enableHandles();Selection.done();} -else -{Selection.release();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');};function newSelection(e) -{if(options.disabled)return false;if(!options.allowSelect)return false;btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false;};function selectDrag(pos) -{Coords.setCurrent(pos);Selection.update();};function newTracker() -{var trk=$('<div></div>').addClass(cssClass('tracker'));$.browser.msie&&trk.css({opacity:0,backgroundColor:'white'});return trk;};function animateTo(a) -{var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating)return;var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function() -{return function() -{pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100)animateStart();else Selection.done();if(pcent>=99.8)pcent=100;setSelectRaw(animat);};}();function animateStart() -{window.setTimeout(animator,interv);};animateStart();};function setSelect(rect) -{setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);};function setSelectRaw(l) -{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();};function setOptions(opt) -{if(typeof(opt)!='object')opt={};options=$.extend(options,opt);if(typeof(options.onChange)!=='function') -options.onChange=function(){};if(typeof(options.onSelect)!=='function') -options.onSelect=function(){};};function tellSelect() -{return unscale(Coords.getFixed());};function tellScaled() -{return Coords.getFixed();};function setOptionsNew(opt) -{setOptions(opt);interfaceUpdate();};function disableCrop() -{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');};function enableCrop() -{options.disabled=false;interfaceUpdate();};function cancelCrop() -{Selection.done();Tracker.activateHandlers(null,null);};function destroy() -{$div.remove();$origimg.show();};function interfaceUpdate(alt) -{options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');$div.css('backgroundColor',options.bgColor);if('setSelect'in options){setSelect(opt.setSelect);Selection.done();delete(options.setSelect);} -if('trueSize'in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;} -xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if('outerImage'in options) -{$img.attr('src',options.outerImage);delete(options.outerImage);} -Selection.refresh();};$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},release:Selection.release,destroy:destroy};$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options) -{function attachWhenDone(from) -{var loadsrc=options.useImg||from.src;var img=new Image();img.onload=function(){$.Jcrop(from,options);};img.src=loadsrc;};if(typeof(options)!=='object')options={};this.each(function() -{if($(this).data('Jcrop')) -{if(options=='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);} -else attachWhenDone(this);});return this;};})(jQuery);
\ No newline at end of file diff --git a/app/assets/javascripts/jquery.Jcrop.min.js b/app/assets/javascripts/jquery.Jcrop.min.js new file mode 100644 index 000000000..d9ae1adfc --- /dev/null +++ b/app/assets/javascripts/jquery.Jcrop.min.js @@ -0,0 +1,7 @@ +/** + * jquery.Jcrop.min.js v0.9.12 (build:20140524) + * jQuery Image Cropping Plugin - released under MIT License + * Copyright (c) 2008-2013 Tapmodo Interactive LLC + * https://github.com/tapmodo/Jcrop + */ +!function($){$.Jcrop=function(obj,opt){function px(n){return Math.round(n)+"px"}function cssClass(cl){return options.baseClass+"-"+cl}function supportsColorFade(){return $.fx.step.hasOwnProperty("backgroundColor")}function getPos(obj){var pos=$(obj).offset();return[pos.left,pos.top]}function mouseAbs(e){return[e.pageX-docOffset[0],e.pageY-docOffset[1]]}function setOptions(opt){"object"!=typeof opt&&(opt={}),options=$.extend(options,opt),$.each(["onChange","onSelect","onRelease","onDblClick"],function(i,e){"function"!=typeof options[e]&&(options[e]=function(){})})}function startDragMode(mode,pos,touch){if(docOffset=getPos($img),Tracker.setCursor("move"===mode?mode:mode+"-resize"),"move"===mode)return Tracker.activateHandlers(createMover(pos),doneSelect,touch);var fc=Coords.getFixed(),opp=oppLockCorner(mode),opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp)),Coords.setCurrent(opc),Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect,touch)}function dragmodeHandler(mode,f){return function(pos){if(options.aspectRatio)switch(mode){case"e":pos[1]=f.y+1;break;case"w":pos[1]=f.y+1;break;case"n":pos[0]=f.x+1;break;case"s":pos[0]=f.x+1}else switch(mode){case"e":pos[1]=f.y2;break;case"w":pos[1]=f.y2;break;case"n":pos[0]=f.x2;break;case"s":pos[0]=f.x2}Coords.setCurrent(pos),Selection.update()}}function createMover(pos){var lloc=pos;return KeyManager.watchKeys(),function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]),lloc=pos,Selection.update()}}function oppLockCorner(ord){switch(ord){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function createDragger(ord){return function(e){return options.disabled?!1:"move"!==ord||options.allowMove?(docOffset=getPos($img),btndown=!0,startDragMode(ord,mouseAbs(e)),e.stopPropagation(),e.preventDefault(),!1):!1}}function presize($obj,w,h){var nw=$obj.width(),nh=$obj.height();nw>w&&w>0&&(nw=w,nh=w/$obj.width()*$obj.height()),nh>h&&h>0&&(nh=h,nw=h/$obj.height()*$obj.width()),xscale=$obj.width()/nw,yscale=$obj.height()/nh,$obj.width(nw).height(nh)}function unscale(c){return{x:c.x*xscale,y:c.y*yscale,x2:c.x2*xscale,y2:c.y2*yscale,w:c.w*xscale,h:c.h*yscale}}function doneSelect(){var c=Coords.getFixed();c.w>options.minSelect[0]&&c.h>options.minSelect[1]?(Selection.enableHandles(),Selection.done()):Selection.release(),Tracker.setCursor(options.allowSelect?"crosshair":"default")}function newSelection(e){if(!options.disabled&&options.allowSelect){btndown=!0,docOffset=getPos($img),Selection.disableHandles(),Tracker.setCursor("crosshair");var pos=mouseAbs(e);return Coords.setPressed(pos),Selection.update(),Tracker.activateHandlers(selectDrag,doneSelect,"touch"===e.type.substring(0,5)),KeyManager.watchKeys(),e.stopPropagation(),e.preventDefault(),!1}}function selectDrag(pos){Coords.setCurrent(pos),Selection.update()}function newTracker(){var trk=$("<div></div>").addClass(cssClass("tracker"));return is_msie&&trk.css({opacity:0,backgroundColor:"white"}),trk}function setClass(cname){$div.removeClass().addClass(cssClass("holder")).addClass(cname)}function animateTo(a,callback){function queueAnimator(){window.setTimeout(animator,interv)}var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(!animating){var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x1=animat[0],y1=animat[1],x2=animat[2],y2=animat[3],Selection.animMode(!0);var animator=function(){return function(){pcent+=(100-pcent)/velocity,animat[0]=Math.round(x1+pcent/100*ix1),animat[1]=Math.round(y1+pcent/100*iy1),animat[2]=Math.round(x2+pcent/100*ix2),animat[3]=Math.round(y2+pcent/100*iy2),pcent>=99.8&&(pcent=100),100>pcent?(setSelectRaw(animat),queueAnimator()):(Selection.done(),Selection.animMode(!1),"function"==typeof callback&&callback.call(api))}}();queueAnimator()}}function setSelect(rect){setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]),options.onSelect.call(api,unscale(Coords.getFixed())),Selection.enableHandles()}function setSelectRaw(l){Coords.setPressed([l[0],l[1]]),Coords.setCurrent([l[2],l[3]]),Selection.update()}function tellSelect(){return unscale(Coords.getFixed())}function tellScaled(){return Coords.getFixed()}function setOptionsNew(opt){setOptions(opt),interfaceUpdate()}function disableCrop(){options.disabled=!0,Selection.disableHandles(),Selection.setCursor("default"),Tracker.setCursor("default")}function enableCrop(){options.disabled=!1,interfaceUpdate()}function cancelCrop(){Selection.done(),Tracker.activateHandlers(null,null)}function destroy(){$div.remove(),$origimg.show(),$origimg.css("visibility","visible"),$(obj).removeData("Jcrop")}function setImage(src,callback){Selection.release(),disableCrop();var img=new Image;img.onload=function(){var iw=img.width,ih=img.height,bw=options.boxWidth,bh=options.boxHeight;$img.width(iw).height(ih),$img.attr("src",src),$img2.attr("src",src),presize($img,bw,bh),boundx=$img.width(),boundy=$img.height(),$img2.width(boundx).height(boundy),$trk.width(boundx+2*bound).height(boundy+2*bound),$div.width(boundx).height(boundy),Shade.resize(boundx,boundy),enableCrop(),"function"==typeof callback&&callback.call(api)},img.src=src}function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor;options.bgFade&&supportsColorFade()&&options.fadeTime&&!now?$obj.animate({backgroundColor:mycolor},{queue:!1,duration:options.fadeTime}):$obj.css("backgroundColor",mycolor)}function interfaceUpdate(alt){options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles(),Tracker.setCursor(options.allowSelect?"crosshair":"default"),Selection.setCursor(options.allowMove?"move":"default"),options.hasOwnProperty("trueSize")&&(xscale=options.trueSize[0]/boundx,yscale=options.trueSize[1]/boundy),options.hasOwnProperty("setSelect")&&(setSelect(options.setSelect),Selection.done(),delete options.setSelect),Shade.refresh(),options.bgColor!=bgcolor&&(colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?options.shadeColor||options.bgColor:options.bgColor),bgcolor=options.bgColor),bgopacity!=options.bgOpacity&&(bgopacity=options.bgOpacity,options.shade?Shade.refresh():Selection.setBgOpacity(bgopacity)),xlimit=options.maxSize[0]||0,ylimit=options.maxSize[1]||0,xmin=options.minSize[0]||0,ymin=options.minSize[1]||0,options.hasOwnProperty("outerImage")&&($img.attr("src",options.outerImage),delete options.outerImage),Selection.refresh()}var docOffset,options=$.extend({},$.Jcrop.defaults),_ua=navigator.userAgent.toLowerCase(),is_msie=/msie/.test(_ua),ie6mode=/msie [1-6]\./.test(_ua);"object"!=typeof obj&&(obj=$(obj)[0]),"object"!=typeof opt&&(opt={}),setOptions(opt);var img_css={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},$origimg=$(obj),img_mode=!0;if("IMG"==obj.tagName){if(0!=$origimg[0].width&&0!=$origimg[0].height)$origimg.width($origimg[0].width),$origimg.height($origimg[0].height);else{var tempImage=new Image;tempImage.src=$origimg[0].src,$origimg.width(tempImage.width),$origimg.height(tempImage.height)}var $img=$origimg.clone().removeAttr("id").css(img_css).show();$img.width($origimg.width()),$img.height($origimg.height()),$origimg.after($img).hide()}else $img=$origimg.css(img_css).show(),img_mode=!1,null===options.shade&&(options.shade=!0);presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$("<div />").width(boundx).height(boundy).addClass(cssClass("holder")).css({position:"relative",backgroundColor:options.bgColor}).insertAfter($origimg).append($img);options.addClass&&$div.addClass(options.addClass);var $img2=$("<div />"),$img_holder=$("<div />").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),$hdl_holder=$("<div />").width("100%").height("100%").css("zIndex",320),$sel=$("<div />").css({position:"absolute",zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c)}).insertBefore($img).append($img_holder,$hdl_holder);img_mode&&($img2=$("<img />").attr("src",$img.attr("src")).css(img_css).width(boundx).height(boundy),$img_holder.append($img2)),ie6mode&&$sel.css({overflowY:"hidden"});var xlimit,ylimit,xmin,ymin,xscale,yscale,btndown,animating,shift_down,bound=options.boundary,$trk=newTracker().width(boundx+2*bound).height(boundy+2*bound).css({position:"absolute",top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection),bgcolor=options.bgColor,bgopacity=options.bgOpacity;docOffset=getPos($img);var Touch=function(){function hasTouchSupport(){var i,support={},events=["touchstart","touchmove","touchend"],el=document.createElement("div");try{for(i=0;i<events.length;i++){var eventName=events[i];eventName="on"+eventName;var isSupported=eventName in el;isSupported||(el.setAttribute(eventName,"return;"),isSupported="function"==typeof el[eventName]),support[events[i]]=isSupported}return support.touchstart&&support.touchend&&support.touchmove}catch(err){return!1}}function detectSupport(){return options.touchSupport===!0||options.touchSupport===!1?options.touchSupport:hasTouchSupport()}return{createDragger:function(ord){return function(e){return options.disabled?!1:"move"!==ord||options.allowMove?(docOffset=getPos($img),btndown=!0,startDragMode(ord,mouseAbs(Touch.cfilter(e)),!0),e.stopPropagation(),e.preventDefault(),!1):!1}},newSelection:function(e){return newSelection(Touch.cfilter(e))},cfilter:function(e){return e.pageX=e.originalEvent.changedTouches[0].pageX,e.pageY=e.originalEvent.changedTouches[0].pageY,e},isSupported:hasTouchSupport,support:detectSupport()}}(),Coords=function(){function setPressed(pos){pos=rebound(pos),x2=x1=pos[0],y2=y1=pos[1]}function setCurrent(pos){pos=rebound(pos),ox=pos[0]-x2,oy=pos[1]-y2,x2=pos[0],y2=pos[1]}function getOffset(){return[ox,oy]}function moveOffset(offset){var ox=offset[0],oy=offset[1];0>x1+ox&&(ox-=ox+x1),0>y1+oy&&(oy-=oy+y1),y2+oy>boundy&&(oy+=boundy-(y2+oy)),x2+ox>boundx&&(ox+=boundx-(x2+ox)),x1+=ox,x2+=ox,y1+=oy,y2+=oy}function getCorner(ord){var c=getFixed();switch(ord){case"ne":return[c.x2,c.y];case"nw":return[c.x,c.y];case"se":return[c.x2,c.y2];case"sw":return[c.x,c.y2]}}function getFixed(){if(!options.aspectRatio)return getRect();var xx,yy,w,h,aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha;return 0===max_x&&(max_x=10*boundx),0===max_y&&(max_y=10*boundy),aspect>real_ratio?(yy=y2,w=rha*aspect,xx=0>rw?x1-w:w+x1,0>xx?(xx=0,h=Math.abs((xx-x1)/aspect),yy=0>rh?y1-h:h+y1):xx>boundx&&(xx=boundx,h=Math.abs((xx-x1)/aspect),yy=0>rh?y1-h:h+y1)):(xx=x2,h=rwa/aspect,yy=0>rh?y1-h:y1+h,0>yy?(yy=0,w=Math.abs((yy-y1)*aspect),xx=0>rw?x1-w:w+x1):yy>boundy&&(yy=boundy,w=Math.abs(yy-y1)*aspect,xx=0>rw?x1-w:w+x1)),xx>x1?(min_x>xx-x1?xx=x1+min_x:xx-x1>max_x&&(xx=x1+max_x),yy=yy>y1?y1+(xx-x1)/aspect:y1-(xx-x1)/aspect):x1>xx&&(min_x>x1-xx?xx=x1-min_x:x1-xx>max_x&&(xx=x1-max_x),yy=yy>y1?y1+(x1-xx)/aspect:y1-(x1-xx)/aspect),0>xx?(x1-=xx,xx=0):xx>boundx&&(x1-=xx-boundx,xx=boundx),0>yy?(y1-=yy,yy=0):yy>boundy&&(y1-=yy-boundy,yy=boundy),makeObj(flipCoords(x1,y1,xx,yy))}function rebound(p){return p[0]<0&&(p[0]=0),p[1]<0&&(p[1]=0),p[0]>boundx&&(p[0]=boundx),p[1]>boundy&&(p[1]=boundy),[Math.round(p[0]),Math.round(p[1])]}function flipCoords(x1,y1,x2,y2){var xa=x1,xb=x2,ya=y1,yb=y2;return x1>x2&&(xa=x2,xb=x1),y1>y2&&(ya=y2,yb=y1),[xa,ya,xb,yb]}function getRect(){var delta,xsize=x2-x1,ysize=y2-y1;return xlimit&&Math.abs(xsize)>xlimit&&(x2=xsize>0?x1+xlimit:x1-xlimit),ylimit&&Math.abs(ysize)>ylimit&&(y2=ysize>0?y1+ylimit:y1-ylimit),ymin/yscale&&Math.abs(ysize)<ymin/yscale&&(y2=ysize>0?y1+ymin/yscale:y1-ymin/yscale),xmin/xscale&&Math.abs(xsize)<xmin/xscale&&(x2=xsize>0?x1+xmin/xscale:x1-xmin/xscale),0>x1&&(x2-=x1,x1-=x1),0>y1&&(y2-=y1,y1-=y1),0>x2&&(x1-=x2,x2-=x2),0>y2&&(y1-=y2,y2-=y2),x2>boundx&&(delta=x2-boundx,x1-=delta,x2-=delta),y2>boundy&&(delta=y2-boundy,y1-=delta,y2-=delta),x1>boundx&&(delta=x1-boundy,y2-=delta,y1-=delta),y1>boundy&&(delta=y1-boundy,y2-=delta,y1-=delta),makeObj(flipCoords(x1,y1,x2,y2))}function makeObj(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var ox,oy,x1=0,y1=0,x2=0,y2=0;return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed}}(),Shade=function(){function resizeShades(w,h){shades.left.css({height:px(h)}),shades.right.css({height:px(h)})}function updateAuto(){return updateShade(Coords.getFixed())}function updateShade(c){shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)}),shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)}),shades.right.css({left:px(c.x2),width:px(boundx-c.x2)}),shades.left.css({width:px(c.x)})}function createShade(){return $("<div />").css({position:"absolute",backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder)}function enableShade(){enabled||(enabled=!0,holder.insertBefore($img),updateAuto(),Selection.setBgOpacity(1,0,1),$img2.hide(),setBgColor(options.shadeColor||options.bgColor,1),Selection.isAwake()?setOpacity(options.bgOpacity,1):setOpacity(1,1))}function setBgColor(color,now){colorChangeMacro(getShades(),color,now)}function disableShade(){enabled&&(holder.remove(),$img2.show(),enabled=!1,Selection.isAwake()?Selection.setBgOpacity(options.bgOpacity,1,1):(Selection.setBgOpacity(1,1,1),Selection.disableHandles()),colorChangeMacro($div,0,1))}function setOpacity(opacity,now){enabled&&(options.bgFade&&!now?holder.animate({opacity:1-opacity},{queue:!1,duration:options.fadeTime}):holder.css({opacity:1-opacity}))}function refreshAll(){options.shade?enableShade():disableShade(),Selection.isAwake()&&setOpacity(options.bgOpacity)}function getShades(){return holder.children()}var enabled=!1,holder=$("<div />").css({position:"absolute",zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()};return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity}}(),Selection=function(){function insertBorder(type){var jq=$("<div />").css({position:"absolute",opacity:options.borderOpacity}).addClass(cssClass(type));return $img_holder.append(jq),jq}function dragDiv(ord,zi){var jq=$("<div />").mousedown(createDragger(ord)).css({cursor:ord+"-resize",position:"absolute",zIndex:zi}).addClass("ord-"+ord);return Touch.support&&jq.bind("touchstart.jcrop",Touch.createDragger(ord)),$hdl_holder.append(jq),jq}function insertHandle(ord){var hs=options.handleSize,div=dragDiv(ord,hdep++).css({opacity:options.handleOpacity}).addClass(cssClass("handle"));return hs&&div.width(hs).height(hs),div}function insertDragbar(ord){return dragDiv(ord,hdep++).addClass("jcrop-dragbar")}function createDragbars(li){var i;for(i=0;i<li.length;i++)dragbar[li[i]]=insertDragbar(li[i])}function createBorders(li){var cl,i;for(i=0;i<li.length;i++){switch(li[i]){case"n":cl="hline";break;case"s":cl="hline bottom";break;case"e":cl="vline right";break;case"w":cl="vline"}borders[li[i]]=insertBorder(cl)}}function createHandles(li){var i;for(i=0;i<li.length;i++)handle[li[i]]=insertHandle(li[i])}function moveto(x,y){options.shade||$img2.css({top:px(-y),left:px(-x)}),$sel.css({top:px(y),left:px(x)})}function resize(w,h){$sel.width(Math.round(w)).height(Math.round(h))}function refresh(){var c=Coords.getFixed();Coords.setPressed([c.x,c.y]),Coords.setCurrent([c.x2,c.y2]),updateVisible()}function updateVisible(select){return awake?update(select):void 0}function update(select){var c=Coords.getFixed();resize(c.w,c.h),moveto(c.x,c.y),options.shade&&Shade.updateRaw(c),awake||show(),select?options.onSelect.call(api,unscale(c)):options.onChange.call(api,unscale(c))}function setBgOpacity(opacity,force,now){(awake||force)&&(options.bgFade&&!now?$img.animate({opacity:opacity},{queue:!1,duration:options.fadeTime}):$img.css("opacity",opacity))}function show(){$sel.show(),options.shade?Shade.opacity(bgopacity):setBgOpacity(bgopacity,!0),awake=!0}function release(){disableHandles(),$sel.hide(),options.shade?Shade.opacity(1):setBgOpacity(1),awake=!1,options.onRelease.call(api)}function showHandles(){seehandles&&$hdl_holder.show()}function enableHandles(){return seehandles=!0,options.allowResize?($hdl_holder.show(),!0):void 0}function disableHandles(){seehandles=!1,$hdl_holder.hide()}function animMode(v){v?(animating=!0,disableHandles()):(animating=!1,enableHandles())}function done(){animMode(!1),refresh()}var awake,hdep=370,borders={},handle={},dragbar={},seehandles=!1;options.dragEdges&&$.isArray(options.createDragbars)&&createDragbars(options.createDragbars),$.isArray(options.createHandles)&&createHandles(options.createHandles),options.drawBorders&&$.isArray(options.createBorders)&&createBorders(options.createBorders),$(document).bind("touchstart.jcrop-ios",function(e){$(e.currentTarget).hasClass("jcrop-tracker")&&e.stopPropagation()});var $track=newTracker().mousedown(createDragger("move")).css({cursor:"move",position:"absolute",zIndex:360});return Touch.support&&$track.bind("touchstart.jcrop",Touch.createDragger("move")),$img_holder.append($track),disableHandles(),{updateVisible:updateVisible,update:update,release:release,refresh:refresh,isAwake:function(){return awake},setCursor:function(cursor){$track.css("cursor",cursor)},enableHandles:enableHandles,enableOnly:function(){seehandles=!0},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,setBgOpacity:setBgOpacity,done:done}}(),Tracker=function(){function toFront(touch){$trk.css({zIndex:450}),touch?$(document).bind("touchmove.jcrop",trackTouchMove).bind("touchend.jcrop",trackTouchEnd):trackDoc&&$(document).bind("mousemove.jcrop",trackMove).bind("mouseup.jcrop",trackUp)}function toBack(){$trk.css({zIndex:290}),$(document).unbind(".jcrop")}function trackMove(e){return onMove(mouseAbs(e)),!1}function trackUp(e){return e.preventDefault(),e.stopPropagation(),btndown&&(btndown=!1,onDone(mouseAbs(e)),Selection.isAwake()&&options.onSelect.call(api,unscale(Coords.getFixed())),toBack(),onMove=function(){},onDone=function(){}),!1}function activateHandlers(move,done,touch){return btndown=!0,onMove=move,onDone=done,toFront(touch),!1}function trackTouchMove(e){return onMove(mouseAbs(Touch.cfilter(e))),!1}function trackTouchEnd(e){return trackUp(Touch.cfilter(e))}function setCursor(t){$trk.css("cursor",t)}var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;return trackDoc||$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp),$img.before($trk),{activateHandlers:activateHandlers,setCursor:setCursor}}(),KeyManager=function(){function watchKeys(){options.keySupport&&($keymgr.show(),$keymgr.focus())}function onBlur(){$keymgr.hide()}function doNudge(e,x,y){options.allowMove&&(Coords.moveOffset([x,y]),Selection.updateVisible(!0)),e.preventDefault(),e.stopPropagation()}function parseKey(e){if(e.ctrlKey||e.metaKey)return!0;shift_down=e.shiftKey?!0:!1;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:options.allowSelect&&Selection.release();break;case 9:return!0}return!1}var $keymgr=$('<input type="radio" />').css({position:"fixed",left:"-120px",width:"12px"}).addClass("jcrop-keymgr"),$keywrap=$("<div />").css({position:"absolute",overflow:"hidden"}).append($keymgr);return options.keySupport&&($keymgr.keydown(parseKey).blur(onBlur),ie6mode||!options.fixedSupport?($keymgr.css({position:"absolute",left:"-20px"}),$keywrap.append($keymgr).insertBefore($img)):$keymgr.insertBefore($img)),{watchKeys:watchKeys}}();Touch.support&&$trk.bind("touchstart.jcrop",Touch.newSelection),$hdl_holder.hide(),interfaceUpdate(!0);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale]},getWidgetSize:function(){return[boundx,boundy]},getScaleFactor:function(){return[xscale,yscale]},getOptions:function(){return options},ui:{holder:$div,selection:$sel}};return is_msie&&$div.bind("selectstart",function(){return!1}),$origimg.data("Jcrop",api),api},$.fn.Jcrop=function(options,callback){var api;return this.each(function(){if($(this).data("Jcrop")){if("api"===options)return $(this).data("Jcrop");$(this).data("Jcrop").setOptions(options)}else"IMG"==this.tagName?$.Jcrop.Loader(this,function(){$(this).css({display:"block",visibility:"hidden"}),api=$.Jcrop(this,options),$.isFunction(callback)&&callback.call(api)}):($(this).css({display:"block",visibility:"hidden"}),api=$.Jcrop(this,options),$.isFunction(callback)&&callback.call(api))}),this},$.Jcrop.Loader=function(imgobj,success,error){function completeCheck(){img.complete?($img.unbind(".jcloader"),$.isFunction(success)&&success.call(img)):window.setTimeout(completeCheck,50)}var $img=$(imgobj),img=$img[0];$img.bind("load.jcloader",completeCheck).bind("error.jcloader",function(){$img.unbind(".jcloader"),$.isFunction(error)&&error.call(img)}),img.complete&&$.isFunction(success)&&($img.unbind(".jcloader"),success.call(img))},$.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:null,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne","se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges:!0,fixedSupport:!0,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}}(jQuery);
\ No newline at end of file diff --git a/app/assets/javascripts/jquery.js b/app/assets/javascripts/jquery.js deleted file mode 100644 index 16ad06c5a..000000000 --- a/app/assets/javascripts/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file diff --git a/app/assets/javascripts/jquery_ujs.js b/app/assets/javascripts/jquery_ujs.js deleted file mode 100644 index 50121d6ed..000000000 --- a/app/assets/javascripts/jquery_ujs.js +++ /dev/null @@ -1,393 +0,0 @@ -(function($, undefined) { - -/** - * Unobtrusive scripting adapter for jQuery - * https://github.com/rails/jquery-ujs - * - * Requires jQuery 1.7.0 or later. - * - * Released under the MIT license - * - */ - - // Cut down on the number of issues from people inadvertently including jquery_ujs twice - // by detecting and raising an error when it happens. - if ( $.rails !== undefined ) { - $.error('jquery-ujs has already been loaded!'); - } - - // Shorthand to make it a little easier to call public rails functions from within rails.js - var rails; - - $.rails = rails = { - // Link elements bound by jquery-ujs - linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]', - - // Button elements boud jquery-ujs - buttonClickSelector: 'button[data-remote]', - - // Select elements bound by jquery-ujs - inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', - - // Form elements bound by jquery-ujs - formSubmitSelector: 'form', - - // Form input elements bound by jquery-ujs - formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])', - - // Form input elements disabled during form submission - disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', - - // Form input elements re-enabled after form submission - enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', - - // Form required input elements - requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])', - - // Form file input elements - fileInputSelector: 'input[type=file]', - - // Link onClick disable selector with possible reenable after remote submission - linkDisableSelector: 'a[data-disable-with]', - - // Make sure that every Ajax request sends the CSRF token - CSRFProtection: function(xhr) { - var token = $('meta[name="csrf-token"]').attr('content'); - if (token) xhr.setRequestHeader('X-CSRF-Token', token); - }, - - // Triggers an event on an element and returns false if the event result is false - fire: function(obj, name, data) { - var event = $.Event(name); - obj.trigger(event, data); - return event.result !== false; - }, - - // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm - confirm: function(message) { - return confirm(message); - }, - - // Default ajax function, may be overridden with custom function in $.rails.ajax - ajax: function(options) { - return $.ajax(options); - }, - - // Default way to get an element's href. May be overridden at $.rails.href. - href: function(element) { - return element.attr('href'); - }, - - // Submits "remote" forms and links with ajax - handleRemote: function(element) { - var method, url, data, elCrossDomain, crossDomain, withCredentials, dataType, options; - - if (rails.fire(element, 'ajax:before')) { - elCrossDomain = element.data('cross-domain'); - crossDomain = elCrossDomain === undefined ? null : elCrossDomain; - withCredentials = element.data('with-credentials') || null; - dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); - - if (element.is('form')) { - method = element.attr('method'); - url = element.attr('action'); - data = element.serializeArray(); - // memoized value from clicked submit button - var button = element.data('ujs:submit-button'); - if (button) { - data.push(button); - element.data('ujs:submit-button', null); - } - } else if (element.is(rails.inputChangeSelector)) { - method = element.data('method'); - url = element.data('url'); - data = element.serialize(); - if (element.data('params')) data = data + "&" + element.data('params'); - } else if (element.is(rails.buttonClickSelector)) { - method = element.data('method') || 'get'; - url = element.data('url'); - data = element.serialize(); - if (element.data('params')) data = data + "&" + element.data('params'); - } else { - method = element.data('method'); - url = rails.href(element); - data = element.data('params') || null; - } - - options = { - type: method || 'GET', data: data, dataType: dataType, - // stopping the "ajax:beforeSend" event will cancel the ajax request - beforeSend: function(xhr, settings) { - if (settings.dataType === undefined) { - xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); - } - return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); - }, - success: function(data, status, xhr) { - element.trigger('ajax:success', [data, status, xhr]); - }, - complete: function(xhr, status) { - element.trigger('ajax:complete', [xhr, status]); - }, - error: function(xhr, status, error) { - element.trigger('ajax:error', [xhr, status, error]); - }, - crossDomain: crossDomain - }; - - // There is no withCredentials for IE6-8 when - // "Enable native XMLHTTP support" is disabled - if (withCredentials) { - options.xhrFields = { - withCredentials: withCredentials - }; - } - - // Only pass url to `ajax` options if not blank - if (url) { options.url = url; } - - var jqxhr = rails.ajax(options); - element.trigger('ajax:send', jqxhr); - return jqxhr; - } else { - return false; - } - }, - - // Handles "data-method" on links such as: - // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a> - handleMethod: function(link) { - var href = rails.href(link), - method = link.data('method'), - target = link.attr('target'), - csrf_token = $('meta[name=csrf-token]').attr('content'), - csrf_param = $('meta[name=csrf-param]').attr('content'), - form = $('<form method="post" action="' + href + '"></form>'), - metadata_input = '<input name="_method" value="' + method + '" type="hidden" />'; - - if (csrf_param !== undefined && csrf_token !== undefined) { - metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />'; - } - - if (target) { form.attr('target', target); } - - form.hide().append(metadata_input).appendTo('body'); - form.submit(); - }, - - /* Disables form elements: - - Caches element value in 'ujs:enable-with' data store - - Replaces element text with value of 'data-disable-with' attribute - - Sets disabled property to true - */ - disableFormElements: function(form) { - form.find(rails.disableSelector).each(function() { - var element = $(this), method = element.is('button') ? 'html' : 'val'; - element.data('ujs:enable-with', element[method]()); - element[method](element.data('disable-with')); - element.prop('disabled', true); - }); - }, - - /* Re-enables disabled form elements: - - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) - - Sets disabled property to false - */ - enableFormElements: function(form) { - form.find(rails.enableSelector).each(function() { - var element = $(this), method = element.is('button') ? 'html' : 'val'; - if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); - element.prop('disabled', false); - }); - }, - - /* For 'data-confirm' attribute: - - Fires `confirm` event - - Shows the confirmation dialog - - Fires the `confirm:complete` event - - Returns `true` if no function stops the chain and user chose yes; `false` otherwise. - Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog. - Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function - return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog. - */ - allowAction: function(element) { - var message = element.data('confirm'), - answer = false, callback; - if (!message) { return true; } - - if (rails.fire(element, 'confirm')) { - answer = rails.confirm(message); - callback = rails.fire(element, 'confirm:complete', [answer]); - } - return answer && callback; - }, - - // Helper function which checks for blank inputs in a form that match the specified CSS selector - blankInputs: function(form, specifiedSelector, nonBlank) { - var inputs = $(), input, valueToCheck, - selector = specifiedSelector || 'input,textarea', - allInputs = form.find(selector); - - allInputs.each(function() { - input = $(this); - valueToCheck = input.is('input[type=checkbox],input[type=radio]') ? input.is(':checked') : input.val(); - // If nonBlank and valueToCheck are both truthy, or nonBlank and valueToCheck are both falsey - if (!valueToCheck === !nonBlank) { - - // Don't count unchecked required radio if other radio with same name is checked - if (input.is('input[type=radio]') && allInputs.filter('input[type=radio]:checked[name="' + input.attr('name') + '"]').length) { - return true; // Skip to next input - } - - inputs = inputs.add(input); - } - }); - return inputs.length ? inputs : false; - }, - - // Helper function which checks for non-blank inputs in a form that match the specified CSS selector - nonBlankInputs: function(form, specifiedSelector) { - return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank - }, - - // Helper function, needed to provide consistent behavior in IE - stopEverything: function(e) { - $(e.target).trigger('ujs:everythingStopped'); - e.stopImmediatePropagation(); - return false; - }, - - // replace element's html with the 'data-disable-with' after storing original html - // and prevent clicking on it - disableElement: function(element) { - element.data('ujs:enable-with', element.html()); // store enabled state - element.html(element.data('disable-with')); // set to disabled state - element.bind('click.railsDisable', function(e) { // prevent further clicking - return rails.stopEverything(e); - }); - }, - - // restore element to its original state which was disabled by 'disableElement' above - enableElement: function(element) { - if (element.data('ujs:enable-with') !== undefined) { - element.html(element.data('ujs:enable-with')); // set to old enabled state - element.removeData('ujs:enable-with'); // clean up cache - } - element.unbind('click.railsDisable'); // enable element - } - - }; - - if (rails.fire($(document), 'rails:attachBindings')) { - - $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }}); - - $(document).delegate(rails.linkDisableSelector, 'ajax:complete', function() { - rails.enableElement($(this)); - }); - - $(document).delegate(rails.linkClickSelector, 'click.rails', function(e) { - var link = $(this), method = link.data('method'), data = link.data('params'); - if (!rails.allowAction(link)) return rails.stopEverything(e); - - if (link.is(rails.linkDisableSelector)) rails.disableElement(link); - - if (link.data('remote') !== undefined) { - if ( (e.metaKey || e.ctrlKey) && (!method || method === 'GET') && !data ) { return true; } - - var handleRemote = rails.handleRemote(link); - // response from rails.handleRemote() will either be false or a deferred object promise. - if (handleRemote === false) { - rails.enableElement(link); - } else { - handleRemote.error( function() { rails.enableElement(link); } ); - } - return false; - - } else if (link.data('method')) { - rails.handleMethod(link); - return false; - } - }); - - $(document).delegate(rails.buttonClickSelector, 'click.rails', function(e) { - var button = $(this); - if (!rails.allowAction(button)) return rails.stopEverything(e); - - rails.handleRemote(button); - return false; - }); - - $(document).delegate(rails.inputChangeSelector, 'change.rails', function(e) { - var link = $(this); - if (!rails.allowAction(link)) return rails.stopEverything(e); - - rails.handleRemote(link); - return false; - }); - - $(document).delegate(rails.formSubmitSelector, 'submit.rails', function(e) { - var form = $(this), - remote = form.data('remote') !== undefined, - blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), - nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); - - if (!rails.allowAction(form)) return rails.stopEverything(e); - - // skip other logic when required values are missing or file upload is present - if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { - return rails.stopEverything(e); - } - - if (remote) { - if (nonBlankFileInputs) { - // slight timeout so that the submit button gets properly serialized - // (make it easy for event handler to serialize form without disabled values) - setTimeout(function(){ rails.disableFormElements(form); }, 13); - var aborted = rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); - - // re-enable form elements if event bindings return false (canceling normal form submission) - if (!aborted) { setTimeout(function(){ rails.enableFormElements(form); }, 13); } - - return aborted; - } - - rails.handleRemote(form); - return false; - - } else { - // slight timeout so that the submit button gets properly serialized - setTimeout(function(){ rails.disableFormElements(form); }, 13); - } - }); - - $(document).delegate(rails.formInputClickSelector, 'click.rails', function(event) { - var button = $(this); - - if (!rails.allowAction(button)) return rails.stopEverything(event); - - // register the pressed submit button - var name = button.attr('name'), - data = name ? {name:name, value:button.val()} : null; - - button.closest('form').data('ujs:submit-button', data); - }); - - $(document).delegate(rails.formSubmitSelector, 'ajax:beforeSend.rails', function(event) { - if (this == event.target) rails.disableFormElements($(this)); - }); - - $(document).delegate(rails.formSubmitSelector, 'ajax:complete.rails', function(event) { - if (this == event.target) rails.enableFormElements($(this)); - }); - - $(function(){ - // making sure that all forms have actual up-to-date token(cached forms contain old one) - var csrf_token = $('meta[name=csrf-token]').attr('content'); - var csrf_param = $('meta[name=csrf-param]').attr('content'); - $('form input[name="' + csrf_param + '"]').val(csrf_token); - }); - } - -})( jQuery ); diff --git a/app/assets/javascripts/profile-photos.js b/app/assets/javascripts/profile-photos.js index c7ebe894d..2f6d067ee 100644 --- a/app/assets/javascripts/profile-photos.js +++ b/app/assets/javascripts/profile-photos.js @@ -1,3 +1,3 @@ // ... -//= require jquery.Jcrop +//= require jquery.Jcrop.min //= require profile_photo diff --git a/app/assets/javascripts/profile_photo.js b/app/assets/javascripts/profile_photo.js index 6d637b439..b0bb25e76 100644 --- a/app/assets/javascripts/profile_photo.js +++ b/app/assets/javascripts/profile_photo.js @@ -1,49 +1,59 @@ -// Remember to invoke within jQuery(window).load(...) -// If you don't, Jcrop may not initialize properly -jQuery(window).load(function(){ - // The size of the initial selection (largest, centreted rectangle) - var w = jQuery('#profile_photo_cropbox').width(); - var h = jQuery('#profile_photo_cropbox').height(); - var t = 0; - var l = 0; - var initial; - if (h < w) { - initial = h; - l = (w - initial) / 2; - } else { - initial = w; - t = (h - initial) / 2; - } - - jQuery('#profile_photo_cropbox').Jcrop({ - onChange: showPreview, - onSelect: showPreview, - aspectRatio: 1, - setSelect: [ l, t, initial, initial ] - }); +(function($) { + + $(function(){ + + // The size of the initial selection (largest, centreted rectangle) + var w = jQuery('#profile_photo_cropbox').width(); + var h = jQuery('#profile_photo_cropbox').height(); + var t = 0; + var l = 0; + var initial; + if (h < w) { + initial = h; + l = (w - initial) / 2; + } else { + initial = w; + t = (h - initial) / 2; + } -}); - -// Our simple event handler, called from onChange and onSelect -// event handlers, as per the Jcrop invocation above -function showPreview(coords) -{ - if (parseInt(coords.w) > 0) - { - var rx = 100 / coords.w; - var ry = 100 / coords.h; - - jQuery('#profile_photo_preview').css({ - width: Math.round(rx * jQuery('#profile_photo_cropbox').width()) + 'px', - height: Math.round(ry * jQuery('#profile_photo_cropbox').height()) + 'px', - marginLeft: '-' + Math.round(rx * coords.x) + 'px', - marginTop: '-' + Math.round(ry * coords.y) + 'px' + var jcrop_api; + var bounds, boundx, boundy; + + $('#profile_photo_cropbox').Jcrop({ + onChange: showPreview, + onSelect: showPreview, + aspectRatio: 1 + },function(){ + jcrop_api = this; + bounds = jcrop_api.getBounds(); + boundx = bounds[0]; + boundy = bounds[1]; }); - $('#x').val(coords.x); - $('#y').val(coords.y); - $('#w').val(coords.w); - $('#h').val(coords.h); - } -} + jcrop_api.setSelect([ l, t, initial, initial ]); + + function showPreview(coords) + { + if (parseInt(coords.w) > 0) + { + var rx = 100 / coords.w; + var ry = 100 / coords.h; + + $('#profile_photo_preview').css({ + width: Math.round(rx * boundx) + 'px', + height: Math.round(ry * boundy) + 'px', + marginLeft: '-' + Math.round(rx * coords.x) + 'px', + marginTop: '-' + Math.round(ry * coords.y) + 'px' + }); + + $('#x').val(coords.x); + $('#y').val(coords.y); + $('#w').val(coords.w); + $('#h').val(coords.h); + } + }; + + }); + +}(jQuery)); diff --git a/app/assets/stylesheets/jquery-ui-1.8.15.custom.css b/app/assets/stylesheets/jquery-ui-1.8.15.custom.css deleted file mode 100755 index 386d854ff..000000000 --- a/app/assets/stylesheets/jquery-ui-1.8.15.custom.css +++ /dev/null @@ -1,375 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=01_flat.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=01_flat.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=01_flat.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=01_flat.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Verdana,Arial,sans-serif; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } -.ui-widget-content a { color: #222222; } -.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_flat_75_cccccc_40x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } -.ui-widget-header a { color: #222222; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_flat_75_e6e6e6_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_flat_75_dadada_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_65_ffffff_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_flat_55_fbf9ee_40x100.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_flat_95_fef1ec_40x100.png) 50% 50% repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } -/* - * jQuery UI Datepicker 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Datepicker#theming - */ -.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}
\ No newline at end of file diff --git a/app/assets/stylesheets/jquery.Jcrop.css b/app/assets/stylesheets/jquery.Jcrop.css deleted file mode 100644 index 24925dc94..000000000 --- a/app/assets/stylesheets/jquery.Jcrop.css +++ /dev/null @@ -1,35 +0,0 @@ -/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */ -.jcrop-holder { text-align: left; } - -.jcrop-vline, .jcrop-hline -{ - font-size: 0; - position: absolute; - background: white url('Jcrop.gif') top left repeat; -} -.jcrop-vline { height: 100%; width: 1px !important; } -.jcrop-hline { width: 100%; height: 1px !important; } -.jcrop-handle { - font-size: 1px; - width: 7px !important; - height: 7px !important; - border: 1px #eee solid; - background-color: #333; - *width: 9px; - *height: 9px; -} - -.jcrop-tracker { width: 100%; height: 100%; } - -.custom .jcrop-vline, -.custom .jcrop-hline -{ - background: yellow; -} -.custom .jcrop-handle -{ - border-color: black; - background-color: #C7BB00; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} diff --git a/app/assets/stylesheets/jquery.Jcrop.min.css b/app/assets/stylesheets/jquery.Jcrop.min.css new file mode 100644 index 000000000..51ee2c8fd --- /dev/null +++ b/app/assets/stylesheets/jquery.Jcrop.min.css @@ -0,0 +1,2 @@ +/* jquery.Jcrop.min.css v0.9.12 (build:20140524) */ +.jcrop-holder{direction:ltr;text-align:left;-ms-touch-action:none}.jcrop-hline,.jcrop-vline{background:#fff url(Jcrop.gif);font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{height:100%;width:100%;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none}.jcrop-handle{background-color:#333;border:1px #eee solid;width:7px;height:7px;font-size:1px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}
\ No newline at end of file diff --git a/app/assets/stylesheets/responsive/_global_layout.scss b/app/assets/stylesheets/responsive/_global_layout.scss index d7b24df41..b34a6af74 100644 --- a/app/assets/stylesheets/responsive/_global_layout.scss +++ b/app/assets/stylesheets/responsive/_global_layout.scss @@ -98,3 +98,10 @@ textarea{ padding-right: 0.9375em; } } +.box { + padding: 1em; + + @include respond-min( $main_menu-mobile_menu_cutoff ){ + padding: 1.2em; + } +} diff --git a/app/assets/stylesheets/responsive/_global_style.scss b/app/assets/stylesheets/responsive/_global_style.scss index 24cddc0d9..27d238962 100644 --- a/app/assets/stylesheets/responsive/_global_style.scss +++ b/app/assets/stylesheets/responsive/_global_style.scss @@ -84,9 +84,6 @@ dd { dt + dd { margin-top: 0.5em; - > p { - margin-top: 0; - } } diff --git a/app/assets/stylesheets/responsive/_header_layout.scss b/app/assets/stylesheets/responsive/_header_layout.scss index b3103e3a9..7c7bdfe97 100644 --- a/app/assets/stylesheets/responsive/_header_layout.scss +++ b/app/assets/stylesheets/responsive/_header_layout.scss @@ -131,25 +131,25 @@ } form{ @include grid-row; - padding-right: 1em; + padding: 1em 1em 0; @include lte-ie7 { display: inline; } + @include respond-min( $main_menu-mobile_menu_cutoff ){ + padding-top: 0; + } } input{ - @include grid-column($columns:9); - margin:0; + @include grid-column($columns:10); + margin-right:0; @include lte-ie7 { width: 10.063em; } } - label{ + button[type="submit"]{ @include prefix-postfix-base; - @include grid-column($columns:3,$float:left); + @include grid-column($columns:2,$float:right); border:none; - img{ - max-width: 100%; - } @include lte-ie7 { width: 2.125em; } diff --git a/app/assets/stylesheets/responsive/_header_style.scss b/app/assets/stylesheets/responsive/_header_style.scss index 9008a73a7..ec1e8ea5c 100644 --- a/app/assets/stylesheets/responsive/_header_style.scss +++ b/app/assets/stylesheets/responsive/_header_style.scss @@ -2,3 +2,9 @@ #navigation { border-bottom: 1px solid #e9e9e9; } + +#navigation_search { + button[type="submit"] { + background:image-url('/assets/search.png') transparent no-repeat center center; + } +} diff --git a/app/assets/stylesheets/responsive/_request_style.scss b/app/assets/stylesheets/responsive/_request_style.scss index e6f36674a..44ca9a288 100644 --- a/app/assets/stylesheets/responsive/_request_style.scss +++ b/app/assets/stylesheets/responsive/_request_style.scss @@ -3,12 +3,9 @@ div.correspondence { border: 1px solid #ccc; margin: 0 0 1em; - padding: 1em; - @include respond-min( $main_menu-mobile_menu_cutoff ){ - padding: 1.5em; - } h2 { + margin-top: 0; text-align:right; font-size:1em; } @@ -31,7 +28,6 @@ div.correspondence { div.comment_in_request { border: 1px dotted #ccc; margin:0 0 1em 3em; - padding:0 0.5em; h2 { font-size:1em; @@ -42,13 +38,9 @@ div.comment_in_request { } .event_actions { + margin-bottom: 0; text-align:right; line-height: 1em; - margin-bottom: 1em; -} - -.comment_in_request_text { - margin:0 1.2em 0 0.9em; } .user_photo_on_request img { @@ -64,7 +56,6 @@ div.comment_in_request { height:36px; float:left; vertical-align:middle; - margin-top: 0.5em; margin-right:0.5em; } @@ -86,11 +77,9 @@ a img.attachment_image { } .describe_state_form,#other_recipients { - border-radius:3px; -moz-border-radius:3px; margin:1em 0; - padding:0.5em 1em; } .describe_state_form { diff --git a/app/assets/stylesheets/responsive/_utils.scss b/app/assets/stylesheets/responsive/_utils.scss index 68884fa7a..e19201475 100644 --- a/app/assets/stylesheets/responsive/_utils.scss +++ b/app/assets/stylesheets/responsive/_utils.scss @@ -33,3 +33,18 @@ $lte-ie7: false !default; @content; } } + +// Hide content visually, but keep it available to screen readers +// source: http://a11yproject.com/posts/how-to-hide-content/ +.visually-hidden { + // http://developer.yahoo.com/blogs/ydn/posts/2012/10/clip-your-hidden-content-for-better-accessibility/ + position: absolute !important; + clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ + clip: rect(1px, 1px, 1px, 1px); + padding:0 !important; + border:0 !important; + height: 1px !important; + width: 1px !important; + overflow: hidden; +} +body:hover .visually-hidden a, body:hover .visually-hidden input, body:hover .visually-hidden button { display: none !important; } diff --git a/app/assets/stylesheets/widget.scss b/app/assets/stylesheets/widget.scss new file mode 100644 index 000000000..a67e1f3f0 --- /dev/null +++ b/app/assets/stylesheets/widget.scss @@ -0,0 +1,109 @@ +/* CSS Mini Reset */ + +html, body, div, form, fieldset, legend, label +{ + margin: 0; + padding: 0; +} + +table +{ + border-collapse: collapse; + border-spacing: 0; +} + +th, td +{ + text-align: left; + vertical-align: top; +} + +h1, h2, h3, h4, h5, h6, th, td, caption { font-weight:normal; } + +img { border: 0; } + +body { + background-color: #ffffff; + color: #333333; + padding: 0; + margin: 0; + font-family: "Helvetica Neue", Arial, Helvetica, Helmet, Freesans, sans-serif; + font-weight: normal; + font-style: normal; + line-height: 1.5em; + position: relative; + cursor: default; + font-size: 1em; +} + +a:hover, +a:focus, +a:active { + color: #333; +} + +.alaveteli-widget { + width: 318px; + height: 213px; + border: 1px solid #e9e9e9; + background: #e9e9e9 url("widget-base.png") top left no-repeat; + position: relative; + border: 1px solid #eee; +} + +.alaveteli-widget__title { + position: absolute; + top: 1em; + left: 16px; + width: 160px; + height: 75px; + overflow: hidden; +} + +.alaveteli-widget__status { + position: absolute; + top: 97px; + left: 16px; + font-weight: bold; + text-transform: uppercase; +} + +.alaveteli-widget__status__status-label { + margin: 0; + font-weight: normal; + font-size: 0.875em; + line-height: 1.1em; + color: #555; + text-transform: capitalize; +} + +.alaveteli-widget__left { + position: absolute; + width: 145px; +} + +.alaveteli-widget__people-count { + position: absolute; + left: 192px; + top: 44px; + width: 100px; + text-align: center; + line-height: 1.3em; +} +.alaveteli-widget__count { + font-size: 55px; + line-height: 55px; + text-align: center; +} + +.alaveteli-widget__bottom a { + text-decoration: none; +} + +.alaveteli-widget__button { + position: absolute; + top: 173px; + left: 16px; + text-align: center; +} + diff --git a/app/controllers/admin_censor_rule_controller.rb b/app/controllers/admin_censor_rule_controller.rb index 3387fd832..6c060a610 100644 --- a/app/controllers/admin_censor_rule_controller.rb +++ b/app/controllers/admin_censor_rule_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_censor_rule_controller.rb: # For modifying requests. # diff --git a/app/controllers/admin_comment_controller.rb b/app/controllers/admin_comment_controller.rb index 0aafb122a..030afb645 100644 --- a/app/controllers/admin_comment_controller.rb +++ b/app/controllers/admin_comment_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_comment_controller.rb: # Controller for editing comments from the admin interface. # @@ -15,12 +16,12 @@ class AdminCommentController < AdminController old_body = @comment.body old_visible = @comment.visible - @comment.visible = params[:comment][:visible] == "true" ? true : false + @comment.visible = params[:comment][:visible] == "true" if @comment.update_attributes(params[:comment]) @comment.info_request.log_event("edit_comment", { :comment_id => @comment.id, - :editor => admin_current_user(), + :editor => admin_current_user, :old_body => old_body, :body => @comment.body, :old_visible => old_visible, diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 7760c372b..400047215 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # controllers/admin.rb: # All admin controllers are dervied from this. # diff --git a/app/controllers/admin_general_controller.rb b/app/controllers/admin_general_controller.rb index f2414eeab..8efe0c7b9 100644 --- a/app/controllers/admin_general_controller.rb +++ b/app/controllers/admin_general_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_controller.rb: # Controller for main admin pages. # @@ -7,29 +8,29 @@ class AdminGeneralController < AdminController def index - # Overview counts of things - @public_body_count = PublicBody.count - - @info_request_count = InfoRequest.count - @outgoing_message_count = OutgoingMessage.count - @incoming_message_count = IncomingMessage.count - - @user_count = User.count - @track_thing_count = TrackThing.count - - @comment_count = Comment.count - # Tasks to do @requires_admin_requests = InfoRequest.find_in_state('requires_admin') @error_message_requests = InfoRequest.find_in_state('error_message') @attention_requests = InfoRequest.find_in_state('attention_requested') - @blank_contacts = PublicBody.find(:all, :conditions => ["request_email = ''"], - :order => "updated_at") + @blank_contacts = PublicBody. + includes(:tags, :translations). + where(:request_email => ""). + order(:updated_at). + select { |pb| !pb.defunct? } @old_unclassified = InfoRequest.find_old_unclassified(:limit => 20, :conditions => ["prominence = 'normal'"]) - @holding_pen_messages = InfoRequest.holding_pen_request.incoming_messages - @new_body_requests = PublicBodyChangeRequest.new_body_requests.open - @body_update_requests = PublicBodyChangeRequest.body_update_requests.open + @holding_pen_messages = InfoRequest. + includes(:incoming_messages => :raw_email). + holding_pen_request. + incoming_messages + @new_body_requests = PublicBodyChangeRequest. + includes(:public_body, :user). + new_body_requests. + open + @body_update_requests = PublicBodyChangeRequest. + includes(:public_body, :user). + body_update_requests. + open end def timeline diff --git a/app/controllers/admin_holiday_imports_controller.rb b/app/controllers/admin_holiday_imports_controller.rb index 8596936f0..a740caa2b 100644 --- a/app/controllers/admin_holiday_imports_controller.rb +++ b/app/controllers/admin_holiday_imports_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminHolidayImportsController < AdminController def new diff --git a/app/controllers/admin_holidays_controller.rb b/app/controllers/admin_holidays_controller.rb index 9177ebd44..cd93a21b6 100644 --- a/app/controllers/admin_holidays_controller.rb +++ b/app/controllers/admin_holidays_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminHolidaysController < AdminController def index diff --git a/app/controllers/admin_incoming_message_controller.rb b/app/controllers/admin_incoming_message_controller.rb index bc653bf53..db7bed34c 100644 --- a/app/controllers/admin_incoming_message_controller.rb +++ b/app/controllers/admin_incoming_message_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminIncomingMessageController < AdminController def edit @@ -13,7 +14,7 @@ class AdminIncomingMessageController < AdminController if @incoming_message.save @incoming_message.info_request.log_event('edit_incoming', :incoming_message_id => @incoming_message.id, - :editor => admin_current_user(), + :editor => admin_current_user, :old_prominence => old_prominence, :prominence => @incoming_message.prominence, :old_prominence_reason => old_prominence_reason, @@ -33,7 +34,7 @@ class AdminIncomingMessageController < AdminController @incoming_message.fully_destroy @incoming_message.info_request.log_event("destroy_incoming", - { :editor => admin_current_user(), :deleted_incoming_message_id => incoming_message_id }) + { :editor => admin_current_user, :deleted_incoming_message_id => incoming_message_id }) # expire cached files expire_for_request(@info_request) flash[:notice] = 'Incoming message successfully destroyed.' @@ -63,7 +64,7 @@ class AdminIncomingMessageController < AdminController incoming_message_id = incoming_message.id incoming_message.info_request.log_event("redeliver_incoming", { - :editor => admin_current_user(), + :editor => admin_current_user, :destination_request => destination_request.id, :deleted_incoming_message_id => incoming_message_id }) diff --git a/app/controllers/admin_info_request_event_controller.rb b/app/controllers/admin_info_request_event_controller.rb index 17d147582..6862ff116 100644 --- a/app/controllers/admin_info_request_event_controller.rb +++ b/app/controllers/admin_info_request_event_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_info_request_event_controller.rb: # Controller for FOI request event manipulation from the admin interface. # diff --git a/app/controllers/admin_outgoing_message_controller.rb b/app/controllers/admin_outgoing_message_controller.rb index 2ee811dc0..56e27b108 100644 --- a/app/controllers/admin_outgoing_message_controller.rb +++ b/app/controllers/admin_outgoing_message_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminOutgoingMessageController < AdminController def edit @@ -11,7 +12,7 @@ class AdminOutgoingMessageController < AdminController @outgoing_message.fully_destroy @outgoing_message.info_request.log_event("destroy_outgoing", - { :editor => admin_current_user(), :deleted_outgoing_message_id => outgoing_message_id }) + { :editor => admin_current_user, :deleted_outgoing_message_id => outgoing_message_id }) flash[:notice] = 'Outgoing message successfully destroyed.' redirect_to admin_request_url(@info_request) @@ -29,7 +30,7 @@ class AdminOutgoingMessageController < AdminController if @outgoing_message.save @outgoing_message.info_request.log_event("edit_outgoing", { :outgoing_message_id => @outgoing_message.id, - :editor => admin_current_user(), + :editor => admin_current_user, :old_body => old_body, :body => @outgoing_message.body, :old_prominence => old_prominence, diff --git a/app/controllers/admin_public_body_categories_controller.rb b/app/controllers/admin_public_body_categories_controller.rb index a86171c76..e365255f8 100644 --- a/app/controllers/admin_public_body_categories_controller.rb +++ b/app/controllers/admin_public_body_categories_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminPublicBodyCategoriesController < AdminController def index @locale = self.locale_from_params diff --git a/app/controllers/admin_public_body_change_requests_controller.rb b/app/controllers/admin_public_body_change_requests_controller.rb index 6ff03a2bd..be632b6cd 100644 --- a/app/controllers/admin_public_body_change_requests_controller.rb +++ b/app/controllers/admin_public_body_change_requests_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminPublicBodyChangeRequestsController < AdminController def edit diff --git a/app/controllers/admin_public_body_controller.rb b/app/controllers/admin_public_body_controller.rb index 7de27121a..b3c2c1dfd 100644 --- a/app/controllers/admin_public_body_controller.rb +++ b/app/controllers/admin_public_body_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_public_body_controller.rb: # Controller for editing public bodies from the admin interface. # @@ -11,7 +12,7 @@ class AdminPublicBodyController < AdminController end def show - @locale = self.locale_from_params() + @locale = locale_from_params I18n.with_locale(@locale) do @public_body = PublicBody.find(params[:id]) @info_requests = @public_body.info_requests.paginate :order => "created_at desc", @@ -43,7 +44,7 @@ class AdminPublicBodyController < AdminController if params[:change_request_id] @change_request = PublicBodyChangeRequest.find(params[:change_request_id]) end - params[:public_body][:last_edit_editor] = admin_current_user() + params[:public_body][:last_edit_editor] = admin_current_user @public_body = PublicBody.new(params[:public_body]) if @public_body.save if @change_request @@ -84,7 +85,7 @@ class AdminPublicBodyController < AdminController @change_request = PublicBodyChangeRequest.find(params[:change_request_id]) end I18n.with_locale(I18n.default_locale) do - params[:public_body][:last_edit_editor] = admin_current_user() + params[:public_body][:last_edit_editor] = admin_current_user @public_body = PublicBody.find(params[:id]) if @public_body.update_attributes(params[:public_body]) if @change_request @@ -101,7 +102,7 @@ class AdminPublicBodyController < AdminController end def destroy - @locale = self.locale_from_params() + @locale = locale_from_params I18n.with_locale(@locale) do public_body = PublicBody.find(params[:id]) @@ -158,7 +159,7 @@ class AdminPublicBodyController < AdminController @notes = "" @errors = "" if request.post? - dry_run_only = (params['commit'] == 'Upload' ? false : true) + dry_run_only = params['commit'] != 'Upload' # (FIXME: both of these cases could now be changed to use # PublicBody.import_csv_from_file.) # Read file from params @@ -177,7 +178,7 @@ class AdminPublicBodyController < AdminController params[:tag], params[:tag_behaviour], true, - admin_current_user(), + admin_current_user, I18n.available_locales) if errors.size == 0 @@ -191,7 +192,7 @@ class AdminPublicBodyController < AdminController params[:tag], params[:tag_behaviour], false, - admin_current_user(), + admin_current_user, I18n.available_locales) if errors.size != 0 raise "dry run mismatched real run" @@ -234,7 +235,7 @@ class AdminPublicBodyController < AdminController end def lookup_query - @locale = self.locale_from_params() + @locale = locale_from_params underscore_locale = @locale.gsub '-', '_' I18n.with_locale(@locale) do @query = params[:query] diff --git a/app/controllers/admin_public_body_headings_controller.rb b/app/controllers/admin_public_body_headings_controller.rb index a7fe27390..f0568510a 100644 --- a/app/controllers/admin_public_body_headings_controller.rb +++ b/app/controllers/admin_public_body_headings_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminPublicBodyHeadingsController < AdminController def new @@ -84,7 +85,7 @@ class AdminPublicBodyHeadingsController < AdminController end end end - { :success => error.nil? ? true : false, :error => error } + { :success => error.nil?, :error => error } end def reorder_categories_for_heading(heading_id, categories) @@ -105,7 +106,7 @@ class AdminPublicBodyHeadingsController < AdminController end end end - { :success => error.nil? ? true : false, :error => error } + { :success => error.nil?, :error => error } end end diff --git a/app/controllers/admin_raw_email_controller.rb b/app/controllers/admin_raw_email_controller.rb index 1b3ee2871..7a802d914 100644 --- a/app/controllers/admin_raw_email_controller.rb +++ b/app/controllers/admin_raw_email_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_raw_email_controller.rb: # Controller for managing raw emails from the admin interface. # diff --git a/app/controllers/admin_request_controller.rb b/app/controllers/admin_request_controller.rb index 1e083f57e..eaf6c337d 100644 --- a/app/controllers/admin_request_controller.rb +++ b/app/controllers/admin_request_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_request_controller.rb: # Controller for viewing FOI requests from the admin interface. # @@ -47,16 +48,16 @@ class AdminRequestController < AdminController @info_request.title = params[:info_request][:title] @info_request.prominence = params[:info_request][:prominence] - @info_request.awaiting_description = params[:info_request][:awaiting_description] == "true" ? true : false + @info_request.awaiting_description = params[:info_request][:awaiting_description] == "true" @info_request.allow_new_responses_from = params[:info_request][:allow_new_responses_from] @info_request.handle_rejected_responses = params[:info_request][:handle_rejected_responses] @info_request.tag_string = params[:info_request][:tag_string] - @info_request.comments_allowed = params[:info_request][:comments_allowed] == "true" ? true : false + @info_request.comments_allowed = params[:info_request][:comments_allowed] == "true" if @info_request.valid? @info_request.save! @info_request.log_event("edit", - { :editor => admin_current_user(), + { :editor => admin_current_user, :old_title => old_title, :title => @info_request.title, :old_prominence => old_prominence, :prominence => @info_request.prominence, :old_described_state => old_described_state, :described_state => params[:info_request][:described_state], @@ -104,7 +105,7 @@ class AdminRequestController < AdminController info_request.user = destination_user info_request.save! info_request.log_event("move_request", { - :editor => admin_current_user(), + :editor => admin_current_user, :old_user_url_name => old_user.url_name, :user_url_name => destination_user.url_name }) @@ -114,21 +115,14 @@ class AdminRequestController < AdminController end redirect_to admin_request_url(info_request) elsif params[:commit] == 'Move request to authority' && !params[:public_body_url_name].blank? - old_public_body = info_request.public_body destination_public_body = PublicBody.find_by_url_name(params[:public_body_url_name]) - if destination_public_body.nil? - flash[:error] = "Couldn't find public body '" + params[:public_body_url_name] + "'" - else - info_request.public_body = destination_public_body - info_request.save! - info_request.log_event("move_request", { - :editor => admin_current_user(), - :old_public_body_url_name => old_public_body.url_name, - :public_body_url_name => destination_public_body.url_name - }) - info_request.reindex_request_events - flash[:notice] = "Request has been moved to new body" + if info_request.move_to_public_body(destination_public_body, + :editor => admin_current_user, + :reindex => true) + flash[:notice] = "Request has been moved to new body" + else + flash[:error] = "Couldn't find public body '#{ params[:public_body_url_name] }'" end redirect_to admin_request_url(info_request) @@ -182,7 +176,7 @@ class AdminRequestController < AdminController info_request.prominence = "requester_only" info_request.log_event("hide", { - :editor => admin_current_user(), + :editor => admin_current_user, :reason => params[:reason], :subject => subject, :explanation => explanation diff --git a/app/controllers/admin_spam_addresses_controller.rb b/app/controllers/admin_spam_addresses_controller.rb index fff7e2a4a..d8be52bc7 100644 --- a/app/controllers/admin_spam_addresses_controller.rb +++ b/app/controllers/admin_spam_addresses_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AdminSpamAddressesController < AdminController def index diff --git a/app/controllers/admin_track_controller.rb b/app/controllers/admin_track_controller.rb index 63ee5c12e..e6e5835e6 100644 --- a/app/controllers/admin_track_controller.rb +++ b/app/controllers/admin_track_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_track_controller.rb: # Show email alerts / RSS feeds from admin interface. # diff --git a/app/controllers/admin_user_controller.rb b/app/controllers/admin_user_controller.rb index 7ef461594..8ebc450f6 100644 --- a/app/controllers/admin_user_controller.rb +++ b/app/controllers/admin_user_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/admin_user_controller.rb: # Controller for viewing user accounts from the admin interface. # @@ -85,8 +86,7 @@ class AdminUserController < AdminController end def modify_comment_visibility - @visibility_value = params.key?(:hide_selected) ? false : true - Comment.update_all(["visible=?", @visibility_value], :id => params[:comment_ids]) + Comment.update_all(["visible = ?", !params[:hide_selected]], :id => params[:comment_ids]) redirect_to :back end diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 6f83d89d6..3b8991f28 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ApiController < ApplicationController before_filter :check_api_key before_filter :check_external_request, @@ -41,7 +42,7 @@ class ApiController < ApplicationController :status => 'ready', :message_type => 'initial_request', :body => json["body"], - :last_sent_at => Time.now(), + :last_sent_at => Time.now, :what_doing => 'normal_sort', :info_request => request ) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e80c6a823..a76e6630a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- # controllers/application.rb: # Parent class of all controllers in FOI site. Filters added to this controller # apply to all controllers in the application. Likewise, all the methods added @@ -206,7 +206,7 @@ class ApplicationController < ActionController::Base def foi_fragment_cache_part_path(param) path = url_for(param) id = param['id'] || param[:id] - first_three_digits = id.to_s()[0..2] + first_three_digits = id.to_s[0..2] path = path.sub("/request/", "/request/" + first_three_digits + "/") return path end diff --git a/app/controllers/comment_controller.rb b/app/controllers/comment_controller.rb index 890e9faaa..b5c438c95 100644 --- a/app/controllers/comment_controller.rb +++ b/app/controllers/comment_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/comment_controller.rb: # Show annotations upon a request or other object. # diff --git a/app/controllers/general_controller.rb b/app/controllers/general_controller.rb index 380da285e..53288c2f4 100644 --- a/app/controllers/general_controller.rb +++ b/app/controllers/general_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/general_controller.rb: # For pages like front page, general search, that aren't specific to a # particular model. @@ -14,7 +15,7 @@ class GeneralController < ApplicationController # New, improved front page! def frontpage medium_cache - @locale = self.locale_from_params() + @locale = locale_from_params successful_query = InfoRequestEvent.make_query_from_params( :latest_status => ['successful'] ) @track_thing = TrackThing.create_track_for_search_query(successful_query) @feed_autodetect = [ { :url => do_track_url(@track_thing, 'feed'), @@ -32,7 +33,7 @@ class GeneralController < ApplicationController @feed_autodetect = [] @feed_url = AlaveteliConfiguration::blog_feed separator = @feed_url.include?('?') ? '&' : '?' - @feed_url = "#{@feed_url}#{separator}lang=#{self.locale_from_params()}" + @feed_url = "#{@feed_url}#{separator}lang=#{locale_from_params}" @blog_items = [] if not @feed_url.empty? content = quietly_try_to_open(@feed_url) diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 473a1aacc..122a02193 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class HealthChecksController < ApplicationController def index diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index 93215ccad..cfe1b6ad5 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/help_controller.rb: # Show information about one particular request. # diff --git a/app/controllers/holiday_controller.rb b/app/controllers/holiday_controller.rb index efc20701d..422612fc7 100644 --- a/app/controllers/holiday_controller.rb +++ b/app/controllers/holiday_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/holiday_controller.rb: # Calculate dates # diff --git a/app/controllers/info_request_batch_controller.rb b/app/controllers/info_request_batch_controller.rb index b66658757..e1b684f30 100644 --- a/app/controllers/info_request_batch_controller.rb +++ b/app/controllers/info_request_batch_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class InfoRequestBatchController < ApplicationController def show diff --git a/app/controllers/public_body_change_requests_controller.rb b/app/controllers/public_body_change_requests_controller.rb index 773308546..d43f9398a 100644 --- a/app/controllers/public_body_change_requests_controller.rb +++ b/app/controllers/public_body_change_requests_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class PublicBodyChangeRequestsController < ApplicationController before_filter :catch_spam, :only => [:create] diff --git a/app/controllers/public_body_controller.rb b/app/controllers/public_body_controller.rb index 854e79a19..376b2024a 100644 --- a/app/controllers/public_body_controller.rb +++ b/app/controllers/public_body_controller.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- # app/controllers/public_body_controller.rb: # Show information about a public body. # @@ -16,22 +16,28 @@ class PublicBodyController < ApplicationController long_cache @page = get_search_page_from_params requests_per_page = 25 + # Later pages are very expensive to load if @page > MAX_RESULTS / requests_per_page raise ActiveRecord::RecordNotFound.new("Sorry. No pages after #{MAX_RESULTS / requests_per_page}.") end + if MySociety::Format.simplify_url_part(params[:url_name], 'body') != params[:url_name] redirect_to :url_name => MySociety::Format.simplify_url_part(params[:url_name], 'body'), :status => :moved_permanently return end - @locale = self.locale_from_params() + + @locale = locale_from_params + I18n.with_locale(@locale) do @public_body = PublicBody.find_by_url_name_with_historic(params[:url_name]) raise ActiveRecord::RecordNotFound.new("None found") if @public_body.nil? + if @public_body.url_name.nil? redirect_to :back return end + # If found by historic name, or alternate locale name, redirect to new name if @public_body.url_name != params[:url_name] redirect_to :url_name => @public_body.url_name @@ -40,22 +46,27 @@ class PublicBodyController < ApplicationController set_last_body(@public_body) - top_url = frontpage_url + @number_of_visible_requests = @public_body.info_requests.visible.count + @searched_to_send_request = false referrer = request.env['HTTP_REFERER'] - if !referrer.nil? && referrer.match(%r{^#{top_url}search/.*/bodies$}) + + if !referrer.nil? && referrer.match(%r{^#{frontpage_url}search/.*/bodies$}) @searched_to_send_request = true end + @view = params[:view] + query = InfoRequestEvent.make_query_from_params(params.merge(:latest_status => @view)) query += " requested_from:#{@public_body.url_name}" + # Use search query for this so can collapse and paginate easily # TODO: really should just use SQL query here rather than Xapian. sortby = "described" begin @xapian_requests = perform_search([InfoRequestEvent], query, sortby, 'request_collapse', requests_per_page) if (@page > 1) - @page_desc = " (page " + @page.to_s + ")" + @page_desc = " (page #{ @page })" else @page_desc = "" end @@ -66,10 +77,16 @@ class PublicBodyController < ApplicationController flash.keep(:search_params) @track_thing = TrackThing.create_track_for_public_body(@public_body) + if @user @existing_track = TrackThing.find_existing(@user, @track_thing) end - @feed_autodetect = [ { :url => do_track_url(@track_thing, 'feed'), :title => @track_thing.params[:title_in_rss], :has_json => true } ] + + @follower_count = TrackThing.where(:public_body_id => @public_body.id).count + + @feed_autodetect = [ { :url => do_track_url(@track_thing, 'feed'), + :title => @track_thing.params[:title_in_rss], + :has_json => true } ] respond_to do |format| format.html { @has_json = true; render :template => "public_body/show"} @@ -83,7 +100,7 @@ class PublicBodyController < ApplicationController @public_body = PublicBody.find_by_url_name_with_historic(params[:url_name]) raise ActiveRecord::RecordNotFound.new("None found") if @public_body.nil? - I18n.with_locale(self.locale_from_params()) do + I18n.with_locale(locale_from_params) do if params[:submitted_view_email] if verify_recaptcha flash.discard(:error) @@ -106,7 +123,7 @@ class PublicBodyController < ApplicationController @tag = params[:tag] - @locale = self.locale_from_params + @locale = locale_from_params underscore_locale = @locale.gsub '-', '_' underscore_default_locale = I18n.default_locale.to_s.gsub '-', '_' diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index a1dd53125..83474ad65 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ReportsController < ApplicationController def create @info_request = InfoRequest.find_by_url_title!(params[:request_id]) diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index e847cae1e..26e3b350c 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- # app/controllers/request_controller.rb: # Show information about one particular request. # @@ -75,7 +75,7 @@ class RequestController < ApplicationController else medium_cache end - @locale = self.locale_from_params() + @locale = locale_from_params I18n.with_locale(@locale) do # Look up by old style numeric identifiers @@ -96,12 +96,12 @@ class RequestController < ApplicationController set_last_request(@info_request) # assign variables from request parameters - @collapse_quotes = params[:unfold] ? false : true + @collapse_quotes = !params[:unfold] # Don't allow status update on external requests, otherwise accept param if @info_request.is_external? @update_status = false else - @update_status = params[:update_status] ? true : false + @update_status = params[:update_status] end assign_variables_for_show_template(@info_request) @@ -164,7 +164,7 @@ class RequestController < ApplicationController def list medium_cache @view = params[:view] - @locale = self.locale_from_params() + @locale = locale_from_params @page = get_search_page_from_params if !@page # used in cache case, as perform_search sets @page as side effect @per_page = PER_PAGE @max_results = MAX_RESULTS @@ -566,9 +566,9 @@ class RequestController < ApplicationController @info_request = InfoRequest.find(params[:id].to_i) set_last_request(@info_request) - @collapse_quotes = params[:unfold] ? false : true + @collapse_quotes = !params[:unfold] @is_owning_user = @info_request.is_owning_user?(authenticated_user) - @gone_postal = params[:gone_postal] ? true : false + @gone_postal = params[:gone_postal] if !@is_owning_user @gone_postal = false end @@ -763,12 +763,12 @@ class RequestController < ApplicationController # Prevent spam to magic request address. Note that the binary # subsitution method used depends on the content type - @incoming_message.apply_masks!(@attachment.body, @attachment.content_type) + body = @attachment.default_body + @incoming_message.apply_masks!(body, @attachment.content_type) if response.content_type == 'text/html' - @attachment.body = ActionController::Base.helpers.sanitize(@attachment.body) + body = ActionController::Base.helpers.sanitize(body) end - - render :text => @attachment.body + render :text => body end def get_attachment_as_html @@ -848,7 +848,7 @@ class RequestController < ApplicationController # FOI officers can upload a response def upload_response - @locale = self.locale_from_params() + @locale = locale_from_params I18n.with_locale(@locale) do @info_request = InfoRequest.find_by_url_title!(params[:url_title]) @@ -914,7 +914,7 @@ class RequestController < ApplicationController end def download_entire_request - @locale = self.locale_from_params() + @locale = locale_from_params I18n.with_locale(@locale) do @info_request = InfoRequest.find_by_url_title!(params[:url_title]) if authenticated?( diff --git a/app/controllers/request_game_controller.rb b/app/controllers/request_game_controller.rb index 7eadc1204..2915b5c2f 100644 --- a/app/controllers/request_game_controller.rb +++ b/app/controllers/request_game_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/request_game_controller.rb: # The 'categorise old requests' game # @@ -22,7 +23,7 @@ class RequestGameController < ApplicationController :site_name => site_name) end - @league_table_28_days = RequestClassification.league_table(10, [ "created_at >= ?", Time.now() - 28.days ]) + @league_table_28_days = RequestClassification.league_table(10, [ "created_at >= ?", Time.now - 28.days ]) @league_table_all_time = RequestClassification.league_table(10) @play_urls = true end diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb index 9b3a3396f..4d06072df 100644 --- a/app/controllers/services_controller.rb +++ b/app/controllers/services_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # controllers/services_controller.rb: require 'open-uri' diff --git a/app/controllers/track_controller.rb b/app/controllers/track_controller.rb index 4b272797f..cbefb6291 100644 --- a/app/controllers/track_controller.rb +++ b/app/controllers/track_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/track_controller.rb: # Publically visible email alerts and RSS - think an alert system crossed with # social bookmarking. @@ -214,6 +215,4 @@ class TrackController < ApplicationController redirect_to URI.parse(params[:r]).path end - end - diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index d66b4aa8e..bb4ba28d1 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/controllers/user_controller.rb: # Show information about a user. # @@ -176,7 +177,7 @@ class UserController < ApplicationController return else if !@post_redirect.nil? - @user_signin = User.authenticate_from_form(params[:user_signin], @post_redirect.reason_params[:user_name] ? true : false) + @user_signin = User.authenticate_from_form(params[:user_signin], @post_redirect.reason_params[:user_name]) end if @post_redirect.nil? || @user_signin.errors.size > 0 # Failed to authenticate @@ -372,7 +373,7 @@ class UserController < ApplicationController if (not session[:user_circumstance]) or (session[:user_circumstance] != "change_email") # don't store the password in the db params[:signchangeemail].delete(:password) - post_redirect = PostRedirect.new(:uri => signchangeemail_url(), + post_redirect = PostRedirect.new(:uri => signchangeemail_url, :post_params => params, :circumstance => "change_email" # special login that lets you change your email ) @@ -509,7 +510,7 @@ class UserController < ApplicationController else flash[:notice] = _("<p>Thanks for updating your profile photo.</p> <p><strong>Next...</strong> You can put some text about you and your research on your profile.</p>") - redirect_to set_profile_about_me_url() + redirect_to set_profile_about_me_url end else render :template => 'user/set_draft_profile_photo' @@ -595,7 +596,7 @@ class UserController < ApplicationController else flash[:notice] = _("<p>Thanks for changing the text about you on your profile.</p> <p><strong>Next...</strong> You can upload a profile photograph too.</p>") - redirect_to set_profile_photo_url() + redirect_to set_profile_photo_url end end diff --git a/app/controllers/widgets_controller.rb b/app/controllers/widgets_controller.rb new file mode 100644 index 000000000..333a38e86 --- /dev/null +++ b/app/controllers/widgets_controller.rb @@ -0,0 +1,64 @@ +# -*- encoding : utf-8 -*- +# app/controllers/widget_controller.rb: +# Handle widgets, if enabled +# +# Copyright (c) 2014 UK Citizens Online Democracy. All rights reserved. +# Email: hello@mysociety.org; WWW: http://www.mysociety.org/ + +require 'securerandom' + +class WidgetsController < ApplicationController + + before_filter :check_widget_config, :find_info_request, :check_prominence + skip_before_filter :set_x_frame_options_header, :only => [:show] + + def show + medium_cache + @track_thing = TrackThing.create_track_for_request(@info_request) + @status = @info_request.calculate_status + @count = @info_request.track_things.count + @info_request.widget_votes.count + 1 + + if @user + @existing_track = TrackThing.find_existing(@user, @track_thing) + end + unless @user || cookies[:widget_vote] + cookies.permanent[:widget_vote] = SecureRandom.hex(10) + end + render :action => 'show', :layout => false + end + + def new + long_cache + end + + # Track interest in a request from a non-logged in user + def update + if !@user && cookies[:widget_vote] + @info_request.widget_votes. + where(:cookie => cookies[:widget_vote]). + first_or_create + end + + track_thing = TrackThing.create_track_for_request(@info_request) + redirect_to do_track_path(track_thing), status => :temporary_redirect + end + + private + + def find_info_request + @info_request = InfoRequest.find(params[:request_id]) + end + + def check_widget_config + unless AlaveteliConfiguration::enable_widgets + raise ActiveRecord::RecordNotFound.new("Page not enabled") + end + end + + def check_prominence + unless @info_request.prominence == 'normal' + render :nothing => true, :status => :forbidden + end + end + +end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index d13fea79b..9d63b1cad 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module AdminHelper def icon(name) content_tag(:i, "", :class => "icon-#{name}") diff --git a/app/helpers/admin_public_body_category_helper.rb b/app/helpers/admin_public_body_category_helper.rb index 9c5e5cc5e..2d8842562 100644 --- a/app/helpers/admin_public_body_category_helper.rb +++ b/app/helpers/admin_public_body_category_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module AdminPublicBodyCategoryHelper def heading_is_selected?(heading) if params[:headings] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 49ce94951..2f51f5684 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/helpers/application_helper.rb: # Methods added to this helper will be available to all views (i.e. templates) # in the application. diff --git a/app/helpers/config_helper.rb b/app/helpers/config_helper.rb index 026600ff1..9953c4fe0 100644 --- a/app/helpers/config_helper.rb +++ b/app/helpers/config_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module ConfigHelper def site_name AlaveteliConfiguration::site_name diff --git a/app/helpers/date_time_helper.rb b/app/helpers/date_time_helper.rb index 5f129e590..09b5b2a76 100644 --- a/app/helpers/date_time_helper.rb +++ b/app/helpers/date_time_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module DateTimeHelper # Public: Usually-correct format for a DateTime-ish object # To define a new new format define the `simple_date_{FORMAT}` method diff --git a/app/helpers/health_checks_helper.rb b/app/helpers/health_checks_helper.rb index f5769a9ba..b2f1f9de5 100644 --- a/app/helpers/health_checks_helper.rb +++ b/app/helpers/health_checks_helper.rb @@ -1,7 +1,8 @@ +# -*- encoding : utf-8 -*- module HealthChecksHelper def check_status(check) - style = check.ok? ? {} : "color: red" + style = check.ok? ? '' : 'color: red' content_tag(:b, check.message, :style => style) end diff --git a/app/helpers/link_to_helper.rb b/app/helpers/link_to_helper.rb index 44d6c6f5f..a47dd94ea 100755 --- a/app/helpers/link_to_helper.rb +++ b/app/helpers/link_to_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # app/helpers/link_to_helper.rb: # This module is included into all controllers via controllers/application.rb # - @@ -240,32 +241,6 @@ module LinkToHelper link_to h(query), search_url(query) end - # Deprecated helper - # TODO: Remove in next release - def admin_url(relative_path) - warn "[DEPRECATION] admin_url is deprecated. Please remove it from your theme." - relative_path - end - - # Deprecated helper - # TODO: Remove in next release - def main_url(relative_path, append = nil) - warn "[DEPRECATION] main_url is deprecated. Please remove it from your theme." - url_prefix = "http://" + AlaveteliConfiguration::domain - url = url_prefix + relative_path - if !append.nil? - begin - env = Rack::MockRequest.env_for(url) - req = Rack::Request.new(env) - req.path_info += append - url = req.url - rescue URI::InvalidURIError - # don't append to it - end - end - return url - end - # About page URLs def about_url return help_general_url(:action => 'about') diff --git a/app/helpers/mailer_helper.rb b/app/helpers/mailer_helper.rb index 3d4bbac71..573f7d8a8 100644 --- a/app/helpers/mailer_helper.rb +++ b/app/helpers/mailer_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MailerHelper def contact_from_name_and_email "#{AlaveteliConfiguration::contact_name} <#{AlaveteliConfiguration::contact_email}>" diff --git a/app/helpers/public_body_helper.rb b/app/helpers/public_body_helper.rb index 57c90a9ba..b8e59a341 100644 --- a/app/helpers/public_body_helper.rb +++ b/app/helpers/public_body_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module PublicBodyHelper # Public: The reasons a request can't be made to a PublicBody @@ -36,22 +37,19 @@ module PublicBodyHelper # # public_body - Instance of a PublicBody # - # Returns a string + # Returns a String def type_of_authority(public_body) - first = true - types = public_body.tags.each.map do |tag| - if PublicBodyCategory.get().by_tag().include?(tag.name) - desc = PublicBodyCategory.get().singular_by_tag()[tag.name] - if first - desc = desc.sub(/\S/) { |m| Unicode.upcase(m) } - first = false - end - link_to(desc, list_public_bodies_path(tag.name)) + categories = PublicBodyCategory. + where(:category_tag => public_body.tag_string.split) + + types = categories.each_with_index.map do |category, index| + desc = category.description + if index.zero? + desc = desc.sub(/\S/) { |m| Unicode.upcase(m) } end + link_to(desc, list_public_bodies_path(category.category_tag)) end - types.compact! - if types.any? types.to_sentence(:last_word_connector => ' and ').html_safe else diff --git a/app/helpers/track_helper.rb b/app/helpers/track_helper.rb index ca698926c..75ff784f3 100644 --- a/app/helpers/track_helper.rb +++ b/app/helpers/track_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module TrackHelper def already_subscribed_notice(track_thing) diff --git a/app/helpers/widget_helper.rb b/app/helpers/widget_helper.rb new file mode 100644 index 000000000..70353ea7c --- /dev/null +++ b/app/helpers/widget_helper.rb @@ -0,0 +1,47 @@ +# -*- encoding : utf-8 -*- +module WidgetHelper + def status_description(info_request, status) + case status + when 'waiting_classification' + _('Awaiting classification') + when 'waiting_response' + _('Awaiting response') + when 'waiting_response_overdue' + _('Delayed') + when 'waiting_response_very_overdue' + _('Long overdue') + when 'not_held' + _('Not held') + when 'rejected' + _('Rejected') + when 'successful' + _('Successful') + when 'partially_successful' + _('Partial success') + when 'waiting_clarification' + _('Awaiting clarification') + when 'gone_postal' + _('Handled by post') + when 'internal_review' + _('Internal review') + when 'error_message' + _('Delivery error') + when 'requires_admin' + _('Unusual response') + when 'user_withdrawn' + _('Withdrawn') + when 'attention_requested' + _('Needs admin attention') + when 'vexatious' + _('Vexatious') + when 'not_foi' + _('Not an FOI request') + else + if info_request.respond_to?(:theme_display_status) + info_request.theme_display_status(status) + else + _('Unknown') + end + end + end +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index d2230bb82..cfa5603fe 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/application_mailer.rb: # Shared code between different mailers. # diff --git a/app/mailers/contact_mailer.rb b/app/mailers/contact_mailer.rb index 27e04ca4b..58e036d3b 100644 --- a/app/mailers/contact_mailer.rb +++ b/app/mailers/contact_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/contact_mailer.rb: # Sends contact form mails. # @@ -9,7 +10,7 @@ class ContactMailer < ApplicationMailer def to_admin_message(name, email, subject, message, logged_in_user, last_request, last_body) @message, @logged_in_user, @last_request, @last_body = message, logged_in_user, last_request, last_body - mail(:from => "#{name} <#{email}>", + mail(:from => MailHandler.address_from_name_and_email(name, email), :to => contact_from_name_and_email, :subject => subject) end diff --git a/app/mailers/info_request_batch_mailer.rb b/app/mailers/info_request_batch_mailer.rb index a2becfb24..ba853db95 100644 --- a/app/mailers/info_request_batch_mailer.rb +++ b/app/mailers/info_request_batch_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/info_request_batch_mailer.rb: # Emails relating to user accounts. e.g. Confirming a new account # diff --git a/app/mailers/outgoing_mailer.rb b/app/mailers/outgoing_mailer.rb index 19054b4e2..cc6190954 100644 --- a/app/mailers/outgoing_mailer.rb +++ b/app/mailers/outgoing_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/outgoing_mailer.rb: # Emails which go to public bodies on behalf of users. # @@ -40,7 +41,7 @@ class OutgoingMailer < ApplicationMailer # TODO: also OutgoingMessage.get_salutation # TODO: these look like they should be members of IncomingMessage, but logically they # need to work even when IncomingMessage is nil - def OutgoingMailer.name_and_email_for_followup(info_request, incoming_message_followup) + def self.name_and_email_for_followup(info_request, incoming_message_followup) if incoming_message_followup.nil? || !incoming_message_followup.valid_to_reply_to? return info_request.recipient_name_and_email else @@ -50,7 +51,7 @@ class OutgoingMailer < ApplicationMailer end end # Used in the preview of followup - def OutgoingMailer.name_for_followup(info_request, incoming_message_followup) + def self.name_for_followup(info_request, incoming_message_followup) if incoming_message_followup.nil? || !incoming_message_followup.valid_to_reply_to? return info_request.public_body.name else @@ -59,7 +60,7 @@ class OutgoingMailer < ApplicationMailer end end # Used when making list of followup places to remove duplicates - def OutgoingMailer.email_for_followup(info_request, incoming_message_followup) + def self.email_for_followup(info_request, incoming_message_followup) if incoming_message_followup.nil? || !incoming_message_followup.valid_to_reply_to? return info_request.recipient_email else @@ -67,16 +68,16 @@ class OutgoingMailer < ApplicationMailer end end # Subject to use for followup - def OutgoingMailer.subject_for_followup(info_request, outgoing_message, options = {}) + def self.subject_for_followup(info_request, outgoing_message, options = {}) if outgoing_message.what_doing == 'internal_review' - return "Internal review of " + info_request.email_subject_request(:html => options[:html]) + return _("Internal review of {{email_subject}}", :email_subject => info_request.email_subject_request(:html => options[:html])) else return info_request.email_subject_followup(:incoming_message => outgoing_message.incoming_message_followup, :html => options[:html]) end end # Whether we have a valid email address for a followup - def OutgoingMailer.is_followupable?(info_request, incoming_message_followup) + def self.is_followupable?(info_request, incoming_message_followup) if incoming_message_followup.nil? || !incoming_message_followup.valid_to_reply_to? return info_request.recipient_email_valid_for_followup? else @@ -85,7 +86,7 @@ class OutgoingMailer < ApplicationMailer end end # Message-ID to use - def OutgoingMailer.id_for_message(outgoing_message) + def self.id_for_message(outgoing_message) message_id = "ogm-" + outgoing_message.id.to_s t = Time.now message_id += "+" + '%08x%05x-%04x' % [t.to_i, t.tv_usec, rand(0xffff)] diff --git a/app/mailers/request_mailer.rb b/app/mailers/request_mailer.rb index 252df861c..f12b4a0d6 100644 --- a/app/mailers/request_mailer.rb +++ b/app/mailers/request_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/request_mailer.rb: # Alerts relating to requests. # @@ -64,7 +65,7 @@ class RequestMailer < ApplicationMailer mail(:from => user.name_and_email, :to => contact_from_name_and_email, - :subject => _("FOI response requires admin ({{reason}}) - {{title}}", :reason => info_request.described_state, :title => info_request.title).html_safe) + :subject => _("FOI response requires admin ({{reason}}) - {{title}}", :reason => info_request.described_state, :title => info_request.title.html_safe)) end # Tell the requester that a new response has arrived @@ -80,7 +81,7 @@ class RequestMailer < ApplicationMailer mail(:from => contact_from_name_and_email, :to => info_request.user.name_and_email, - :subject => (_("New response to your FOI request - ") + info_request.title).html_safe, + :subject => _("New response to your FOI request - ") + info_request.title.html_safe, :charset => "UTF-8", # not much we can do if the user's email is broken :reply_to => contact_from_name_and_email) @@ -99,13 +100,8 @@ class RequestMailer < ApplicationMailer @url = confirm_url(:email_token => post_redirect.email_token) @info_request = info_request - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => user.name_and_email, - :subject => (_("Delayed response to your FOI request - ") + info_request.title).html_safe) + auto_generated_headers + mail_user_with_info_request_title(user, _("Delayed response to your FOI request - "), info_request) end # Tell the requester that the public body is very late in replying @@ -119,13 +115,8 @@ class RequestMailer < ApplicationMailer @url = confirm_url(:email_token => post_redirect.email_token) @info_request = info_request - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => user.name_and_email, - :subject => (_("You're long overdue a response to your FOI request - ") + info_request.title).html_safe) + auto_generated_headers + mail_user_with_info_request_title(user, _("You're long overdue a response to your FOI request - "), info_request) end # Tell the requester that they need to say if the new response @@ -141,13 +132,8 @@ class RequestMailer < ApplicationMailer @incoming_message = incoming_message @info_request = info_request - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => info_request.user.name_and_email, - :subject => _("Was the response you got to your FOI request any good?")) + auto_generated_headers + mail_user(info_request.user, _("Was the response you got to your FOI request any good?")) end # Tell the requester that someone updated their old unclassified request @@ -155,13 +141,8 @@ class RequestMailer < ApplicationMailer @url = request_url(info_request) @info_request = info_request - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => info_request.user.name_and_email, - :subject => _("Someone has updated the status of your request")) + auto_generated_headers + mail_user(info_request.user, _("Someone has updated the status of your request")) end # Tell the requester that they need to clarify their request @@ -177,13 +158,8 @@ class RequestMailer < ApplicationMailer @incoming_message = incoming_message @info_request = info_request - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => info_request.user.name_and_email, - :subject => (_("Clarify your FOI request - ") + info_request.title).html_safe) + auto_generated_headers + mail_user_with_info_request_title(info_request.user, _("Clarify your FOI request - "), info_request) end # Tell requester that somebody add an annotation to their request @@ -191,25 +167,15 @@ class RequestMailer < ApplicationMailer @comment, @info_request = comment, info_request @url = comment_url(comment) - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => info_request.user.name_and_email, - :subject => (_("Somebody added a note to your FOI request - ") + info_request.title).html_safe) + auto_generated_headers + mail_user_with_info_request_title(info_request.user, _("Somebody added a note to your FOI request - "), info_request) end def comment_on_alert_plural(info_request, count, earliest_unalerted_comment) @count, @info_request = count, info_request @url = comment_url(earliest_unalerted_comment) - headers('Return-Path' => blackhole_email, 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken - 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 - 'X-Auto-Response-Suppress' => 'OOF') - - mail(:from => contact_from_name_and_email, - :to => info_request.user.name_and_email, - :subject => (_("Some notes have been added to your FOI request - ") + info_request.title).html_safe) + auto_generated_headers + mail_user_with_info_request_title(info_request.user, _("Some notes have been added to your FOI request - "), info_request) end # Class function, called by script/mailin with all incoming responses. @@ -268,7 +234,7 @@ class RequestMailer < ApplicationMailer end # Send email alerts for overdue requests - def self.alert_overdue_requests() + def self.alert_overdue_requests info_requests = InfoRequest.find(:all, :conditions => [ "described_state = 'waiting_response' @@ -372,8 +338,8 @@ class RequestMailer < ApplicationMailer # Send email alerts for requests which need clarification. Goes out 3 days # after last update of event. - def self.alert_not_clarified_request() - info_requests = InfoRequest.find(:all, :conditions => [ "awaiting_description = ? and described_state = 'waiting_clarification' and info_requests.updated_at < ?", false, Time.now() - 3.days ], :include => [ :user ], :order => "info_requests.id" ) + def self.alert_not_clarified_request + info_requests = InfoRequest.find(:all, :conditions => [ "awaiting_description = ? and described_state = 'waiting_clarification' and info_requests.updated_at < ?", false, Time.now - 3.days ], :include => [ :user ], :order => "info_requests.id" ) for info_request in info_requests alert_event_id = info_request.get_last_public_response_event_id last_response_message = info_request.get_last_public_response @@ -400,7 +366,7 @@ class RequestMailer < ApplicationMailer end # Send email alert to request submitter for new comments on the request. - def self.alert_comment_on_request() + def self.alert_comment_on_request # We only check comments made in the last month - this means if the # cron jobs broke for more than a month events would be lost, but no @@ -467,7 +433,27 @@ class RequestMailer < ApplicationMailer end end + private -end + def auto_generated_headers + headers({ + 'Return-Path' => blackhole_email, + 'Reply-To' => contact_from_name_and_email, # not much we can do if the user's email is broken + 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834 + 'X-Auto-Response-Suppress' => 'OOF', + }) + end + def mail_user_with_info_request_title(user, subject, info_request) + mail_user(user, subject + info_request.title.html_safe) + end + + def mail_user(user, subject) + mail({ + :from => contact_from_name_and_email, + :to => user.name_and_email, + :subject => subject, + }) + end +end diff --git a/app/mailers/track_mailer.rb b/app/mailers/track_mailer.rb index 8e9beded6..3f5de6a1b 100644 --- a/app/mailers/track_mailer.rb +++ b/app/mailers/track_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/track_mailer.rb: # Emails which go to users who are tracking things. # @@ -38,7 +39,7 @@ class TrackMailer < ApplicationMailer # User.find(:all, :conditions => [ "last_daily_track_email < ?", Time.now - 1.day ]).size def self.alert_tracks done_something = false - now = Time.now() + now = Time.now one_week_ago = now - 7.days User.find_each(:conditions => [ "last_daily_track_email < ?", now - 1.day ]) do |user| diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index a351147f9..a6fed693e 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/user_mailer.rb: # Emails relating to user accounts. e.g. Confirming a new account # diff --git a/app/models/about_me_validator.rb b/app/models/about_me_validator.rb index 8c24cfd67..8465b0716 100644 --- a/app/models/about_me_validator.rb +++ b/app/models/about_me_validator.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/about_me_validator.rb: # Validates editing about me text on user profile pages. # @@ -9,20 +10,11 @@ class AboutMeValidator attr_accessor :about_me - # TODO: Switch to built in validations - validate :length_of_about_me + validates_length_of :about_me, :maximum => 500, :message => _("Please keep it shorter than 500 characters") def initialize(attributes = {}) attributes.each do |name, value| send("#{name}=", value) end end - - private - - def length_of_about_me - if !about_me.blank? && about_me.size > 500 - errors.add(:about_me, _("Please keep it shorter than 500 characters")) - end - end end diff --git a/app/models/censor_rule.rb b/app/models/censor_rule.rb index 3b5c2d805..aec8a87cc 100644 --- a/app/models/censor_rule.rb +++ b/app/models/censor_rule.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: censor_rules @@ -22,6 +23,7 @@ # Email: hello@mysociety.org; WWW: http://www.mysociety.org/ class CensorRule < ActiveRecord::Base + include AdminColumn belongs_to :info_request belongs_to :user belongs_to :public_body @@ -42,20 +44,19 @@ class CensorRule < ActiveRecord::Base :user_id => nil, :public_body_id => nil } } + def apply_to_text(text_to_censor) + return nil if text_to_censor.nil? + text_to_censor.gsub(to_replace('UTF-8'), replacement) + end + def apply_to_text!(text_to_censor) return nil if text_to_censor.nil? - text_to_censor.gsub!(to_replace, replacement) + text_to_censor.gsub!(to_replace('UTF-8'), replacement) end def apply_to_binary!(binary_to_censor) return nil if binary_to_censor.nil? - binary_to_censor.gsub!(to_replace) { |match| match.gsub(/./, 'x') } - end - - def for_admin_column - self.class.content_columns.each do |column| - yield(column.human_name, send(column.name), column.type.to_s, column.name) - end + binary_to_censor.gsub!(to_replace('ASCII-8BIT')) { |match| match.gsub(single_char_regexp, 'x') } end def is_global? @@ -64,6 +65,14 @@ class CensorRule < ActiveRecord::Base private + def single_char_regexp + if String.method_defined?(:encode) + Regexp.new('.'.force_encoding('ASCII-8BIT')) + else + Regexp.new('.', nil, 'N') + end + end + def require_user_request_or_public_body if info_request.nil? && user.nil? && public_body.nil? [:info_request, :user, :public_body].each do |a| @@ -74,18 +83,22 @@ class CensorRule < ActiveRecord::Base def require_valid_regexp begin - make_regexp + make_regexp('UTF-8') rescue RegexpError => e errors.add(:text, e.message) end end - def make_regexp - Regexp.new(text, Regexp::MULTILINE) + def to_replace(encoding) + regexp? ? make_regexp(encoding) : encoded_text(encoding) + end + + def encoded_text(encoding) + String.method_defined?(:encode) ? text.dup.force_encoding(encoding) : text end - def to_replace - regexp? ? make_regexp : text + def make_regexp(encoding) + Regexp.new(encoded_text(encoding), Regexp::MULTILINE) end end diff --git a/app/models/change_email_validator.rb b/app/models/change_email_validator.rb index 65f2fd81c..f5b31f038 100644 --- a/app/models/change_email_validator.rb +++ b/app/models/change_email_validator.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/changeemail_validator.rb: # Validates email change form submissions. # diff --git a/app/models/comment.rb b/app/models/comment.rb index cc8d0e94b..59f91ffb7 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: comments @@ -20,6 +21,7 @@ # Email: hello@mysociety.org; WWW: http://www.mysociety.org/ class Comment < ActiveRecord::Base + include AdminColumn strip_attributes! belongs_to :user @@ -31,6 +33,8 @@ class Comment < ActiveRecord::Base validate :check_body_has_content, :check_body_uses_mixed_capitals + scope :visible, where(:visible => true) + after_save :event_xapian_update # When posting a new comment, use this to check user hasn't double @@ -57,10 +61,6 @@ class Comment < ActiveRecord::Base ret end - def raw_body - read_attribute(:body) - end - # So when takes changes it updates, or when made invisble it vanishes def event_xapian_update info_request_events.each { |event| event.xapian_mark_needs_index } @@ -75,12 +75,6 @@ class Comment < ActiveRecord::Base text.html_safe end - def for_admin_column - self.class.content_columns.each do |column| - yield(column.human_name, send(column.name), column.type.to_s, column.name) - end - end - private def check_body_has_content diff --git a/app/models/concerns/admin_column.rb b/app/models/concerns/admin_column.rb new file mode 100644 index 000000000..6e19f5aa5 --- /dev/null +++ b/app/models/concerns/admin_column.rb @@ -0,0 +1,17 @@ +module AdminColumn + extend ActiveSupport::Concern + + included do + class << self + attr_reader :non_admin_columns + end + + @non_admin_columns = [] + end + + def for_admin_column + self.class.content_columns.reject { |c| self.class.non_admin_columns.include?(c.name) }.each do |column| + yield(column.human_name, send(column.name), column.type.to_s, column.name) + end + end +end diff --git a/app/models/concerns/public_body_derived_fields.rb b/app/models/concerns/public_body_derived_fields.rb new file mode 100644 index 000000000..f389e3cbf --- /dev/null +++ b/app/models/concerns/public_body_derived_fields.rb @@ -0,0 +1,47 @@ +module PublicBodyDerivedFields + + extend ActiveSupport::Concern + + included do + before_save :set_first_letter + + # When name or short name is changed, also change the url name + def short_name=(short_name) + super + update_url_name + end + + def name=(name) + super + update_url_name + end + + end + + # Return the short name if present, or else long name + def short_or_long_name + if self.short_name.nil? || self.short_name.empty? + self.name.nil? ? "" : self.name + else + self.short_name + end + end + + # Set the first letter, which is used for faster queries + def set_first_letter + unless name.blank? + # we use a regex to ensure it works with utf-8/multi-byte + first_letter = Unicode.upcase name.scan(/^./mu)[0] + if first_letter != self.first_letter + self.first_letter = first_letter + end + end + end + + def update_url_name + if changed.include?('name') || changed.include?('short_name') + self.url_name = MySociety::Format.simplify_url_part(self.short_or_long_name, 'body') + end + end + +end diff --git a/app/models/concerns/translatable.rb b/app/models/concerns/translatable.rb new file mode 100644 index 000000000..2aa4620d0 --- /dev/null +++ b/app/models/concerns/translatable.rb @@ -0,0 +1,37 @@ +module Translatable + extend ActiveSupport::Concern + + included do + accepts_nested_attributes_for :translations, :reject_if => :empty_translation_in_params? + end + + def find_translation_by_locale(locale) + translations.find_by_locale(locale) + end + + def translated_versions + translations + end + + def ordered_translations + translations.select do |translation| + I18n.available_locales.include?(translation.locale) + end.sort_by do |translation| + I18n.available_locales.index(translation.locale) + end + end + + def build_all_translations + I18n.available_locales.each do |locale| + if translations.none? { |translation| translation.locale == locale } + translations.build(:locale => locale) + end + end + end + + private + + def empty_translation_in_params?(attributes) + attributes.select { |k, v| v.present? && k.to_s != 'locale' }.empty? + end +end diff --git a/app/models/contact_validator.rb b/app/models/contact_validator.rb index 8d7e4ff08..1d50bf603 100644 --- a/app/models/contact_validator.rb +++ b/app/models/contact_validator.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # models/contact_validator.rb: # Validates contact form submissions. # diff --git a/app/models/foi_attachment.rb b/app/models/foi_attachment.rb index a8d105f52..37a9c9827 100644 --- a/app/models/foi_attachment.rb +++ b/app/models/foi_attachment.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: foi_attachments @@ -62,19 +62,18 @@ class FoiAttachment < ActiveRecord::Base } update_display_size! @cached_body = d + if String.method_defined?(:encode) + @cached_body = @cached_body.force_encoding("ASCII-8BIT") + end end + # raw body, encoded as binary def body if @cached_body.nil? tries = 0 delay = 1 begin - binary_data = File.open(self.filepath, "rb" ){ |file| file.read } - if self.content_type =~ /^text/ - @cached_body = convert_string_to_utf8_or_binary(binary_data, 'UTF-8') - else - @cached_body = binary_data - end + @cached_body = File.open(filepath, "rb" ){ |file| file.read } rescue Errno::ENOENT # we've lost our cached attachments for some reason. Reparse them. if tries > BODY_MAX_TRIES @@ -93,6 +92,17 @@ class FoiAttachment < ActiveRecord::Base return @cached_body end + # body as UTF-8 text, with scrubbing of invalid chars if needed + def body_as_text + convert_string_to_utf8(body, 'UTF-8') + end + + # for text types, the scrubbed UTF-8 text. For all other types, the + # raw binary + def default_body + text_type? ? body_as_text.string : body + end + # List of DSN codes taken from RFC 3463 # http://tools.ietf.org/html/rfc3463 DsnToMessage = { @@ -244,36 +254,32 @@ class FoiAttachment < ActiveRecord::Base # The full list of supported types can be found at # https://docs.google.com/support/bin/answer.py?hl=en&answer=1189935 def has_google_docs_viewer? - return !! { - "application/pdf" => true, # .pdf - "image/tiff" => true, # .tiff - - "application/vnd.ms-word" => true, # .doc - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" => true, # .docx + [ + "application/pdf", # .pdf + "image/tiff", # .tiff - "application/vnd.ms-powerpoint" => true, # .ppt - "application/vnd.openxmlformats-officedocument.presentationml.presentation" => true, # .pptx + "application/vnd.ms-word", # .doc + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # .docx - "application/vnd.ms-excel" => true, # .xls - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" => true, # .xlsx + "application/vnd.ms-powerpoint", # .ppt + "application/vnd.openxmlformats-officedocument.presentationml.presentation", # .pptx - } [self.content_type] + "application/vnd.ms-excel", # .xls + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", # .xlsx + ].include?(content_type) end # Whether this type has a "View as HTML" def has_body_as_html? - return ( - !!{ - "text/plain" => true, - "application/rtf" => true, - }[self.content_type] or - self.has_google_docs_viewer? - ) + [ + "text/plain", + "application/rtf", + ].include?(content_type) || has_google_docs_viewer? end # Name of type of attachment type - only valid for things that has_body_as_html? def name_of_content_type - return { + { "text/plain" => "Text file", 'application/rtf' => "RTF file", @@ -298,5 +304,11 @@ class FoiAttachment < ActiveRecord::Base AttachmentToHTML.to_html(self, to_html_opts) end + private + + def text_type? + AlaveteliTextMasker::TextMask.include?(content_type) + end + end diff --git a/app/models/holiday.rb b/app/models/holiday.rb index 34044683a..538e77051 100644 --- a/app/models/holiday.rb +++ b/app/models/holiday.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: holidays diff --git a/app/models/holiday_import.rb b/app/models/holiday_import.rb index 98a9b96fc..58ea0b1f7 100644 --- a/app/models/holiday_import.rb +++ b/app/models/holiday_import.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class HolidayImport include ActiveModel::Validations diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb index 3606c39c2..71b081560 100644 --- a/app/models/incoming_message.rb +++ b/app/models/incoming_message.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: incoming_messages @@ -38,6 +38,7 @@ require 'zip/zip' require 'iconv' unless String.method_defined?(:encode) class IncomingMessage < ActiveRecord::Base + include AdminColumn extend MessageProminence belongs_to :info_request validates_presence_of :info_request @@ -371,41 +372,23 @@ class IncomingMessage < ActiveRecord::Base def _convert_part_body_to_text(part) if part.nil? text = "[ Email has no body, please see attachments ]" - source_charset = "utf-8" else - # by default, the body (coming from an foi_attachment) should have been converted to utf-8 - text = part.body - source_charset = part.charset + # whatever kind of attachment it is, get the UTF-8 encoded text + text = part.body_as_text.string if part.content_type == 'text/html' # e.g. http://www.whatdotheyknow.com/request/35/response/177 # TODO: This is a bit of a hack as it is calling a # convert to text routine. Could instead call a # sanitize HTML one. - - # If the text isn't UTF8, it means we had a problem - # converting it (invalid characters, etc), and we - # should instead tell elinks to respect the source - # charset - use_charset = "utf-8" - if String.method_defined?(:encode) - begin - text.encode('utf-8') - rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError - use_charset = source_charset - end - else - begin - text = Iconv.conv('utf-8', 'utf-8', text) - rescue Iconv::IllegalSequence - use_charset = source_charset - end - end - text = MailHandler.get_attachment_text_one_file(part.content_type, text, use_charset) + text = MailHandler.get_attachment_text_one_file(part.content_type, text, "UTF-8") end end - # If text hasn't been converted, we sanitise it. - text = _sanitize_text(text) + # Add an annotation if the text had to be scrubbed + if part.body_as_text.scrubbed? + text += _("\n\n[ {{site_name}} note: The above text was badly encoded, and has had strange characters removed. ]", + :site_name => MySociety::Config.get('SITE_NAME', 'Alaveteli')) + end # Fix DOS style linefeeds to Unix style ones (or other later regexps won't work) text = text.gsub(/\r\n/, "\n") @@ -417,50 +400,6 @@ class IncomingMessage < ActiveRecord::Base return text end - def _sanitize_text(text) - if String.method_defined?(:encode) - begin - # Test if it's good UTF-8 - text.encode('utf-8') - rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError - source_charset = 'utf-8' if source_charset.nil? - # strip out anything that isn't UTF-8 - begin - text = text.encode("utf-8", :invalid => :replace, - :undef => :replace, - :replace => "") + - _("\n\n[ {{site_name}} note: The above text was badly encoded, and has had strange characters removed. ]", - :site_name => MySociety::Config.get('SITE_NAME', 'Alaveteli')) - rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError - if source_charset != "utf-8" - source_charset = "utf-8" - retry - end - end - end - else - begin - # Test if it's good UTF-8 - text = Iconv.conv('utf-8', 'utf-8', text) - rescue Iconv::IllegalSequence - # Text looks like unlabelled nonsense, - # strip out anything that isn't UTF-8 - begin - source_charset = 'utf-8' if source_charset.nil? - text = Iconv.conv('utf-8//IGNORE', source_charset, text) + - _("\n\n[ {{site_name}} note: The above text was badly encoded, and has had strange characters removed. ]", - :site_name => AlaveteliConfiguration::site_name) - rescue Iconv::InvalidEncoding, Iconv::IllegalSequence, Iconv::InvalidCharacter - if source_charset != "utf-8" - source_charset = "utf-8" - retry - end - end - end - end - text - end - # Returns part which contains main body text, or nil if there isn't one, # from a set of foi_attachments. If the leaves parameter is empty or not # supplied, uses its own foi_attachments. @@ -560,7 +499,7 @@ class IncomingMessage < ActiveRecord::Base # because the hexdigest of an attachment is identical. main_part = get_main_body_text_part(attachments) # we don't use get_main_body_text_internal, as we want to avoid charset - # conversions, since /usr/bin/uudecode needs to deal with those. + # conversions, since _uudecode_and_save_attachments needs to deal with those. # e.g. for https://secure.mysociety.org/admin/foi/request/show_raw_email/24550 if !main_part.nil? uudecoded_attachments = _uudecode_and_save_attachments(main_part.body) @@ -676,16 +615,7 @@ class IncomingMessage < ActiveRecord::Base end def _get_attachment_text_internal - text = self._extract_text - - # Remove any bad characters - if String.method_defined?(:encode) - # handle "problematic" encoding - text.encode!('UTF-16', 'UTF-8', :invalid => :replace, :undef => :replace, :replace => '') - text.encode('UTF-8', 'UTF-16') - else - Iconv.conv('utf-8//IGNORE', 'utf-8', text) - end + convert_string_to_utf8(_extract_text, 'UTF-8').string end # Returns text for indexing @@ -719,7 +649,7 @@ class IncomingMessage < ActiveRecord::Base end # Search all info requests for - def IncomingMessage.find_all_unknown_mime_types + def self.find_all_unknown_mime_types for incoming_message in IncomingMessage.find(:all) for attachment in incoming_message.get_attachments_for_display raise "internal error incoming_message " + incoming_message.id.to_s if attachment.content_type.nil? @@ -745,16 +675,9 @@ class IncomingMessage < ActiveRecord::Base return ret.keys.join(" ") end # Return space separated list of all file extensions known - def IncomingMessage.get_all_file_extensions + def self.get_all_file_extensions return AlaveteliFileTypes.all_extensions.join(" ") end - - def for_admin_column - self.class.content_columns.each do |column| - yield(column.human_name, self.send(column.name), column.type.to_s, column.name) - end - end - end diff --git a/app/models/info_request.rb b/app/models/info_request.rb index c203f75c3..3ce0e3cd2 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- # == Schema Information # Schema version: 20131024114346 # @@ -28,8 +28,11 @@ require 'digest/sha1' class InfoRequest < ActiveRecord::Base + include AdminColumn include Rails.application.routes.url_helpers + @non_admin_columns = %w(title url_title) + strip_attributes! validates_presence_of :title, :message => N_("Please enter a summary of your request") @@ -50,6 +53,7 @@ class InfoRequest < ActiveRecord::Base has_many :info_request_events, :order => 'created_at' has_many :user_info_request_sent_alerts has_many :track_things, :order => 'created_at desc' + has_many :widget_votes has_many :comments, :order => 'created_at' has_many :censor_rules, :order => 'created_at desc' has_many :mail_server_logs, :order => 'mail_server_log_done_id' @@ -193,23 +197,12 @@ class InfoRequest < ActiveRecord::Base rescue MissingSourceFile, NameError end - # only check on create, so existing models with mixed case are allowed - def validate_on_create - if !self.title.nil? && !MySociety::Validate.uses_mixed_capitals(self.title, 10) - errors.add(:title, _('Please write the summary using a mixture of capital and lower case letters. This makes it easier for others to read.')) - end - if !self.title.nil? && title.size > 200 - errors.add(:title, _('Please keep the summary short, like in the subject of an email. You can use a phrase, rather than a full sentence.')) - end - if !self.title.nil? && self.title =~ /^(FOI|Freedom of Information)\s*requests?$/i - errors.add(:title, _('Please describe more what the request is about in the subject. There is no need to say it is an FOI request, we add that on anyway.')) - end - end - OLD_AGE_IN_DAYS = 21.days def visible_comments - self.comments.find(:all, :conditions => 'visible') + warn %q([DEPRECATION] InfoRequest#visible_comments will be replaced with + InfoRequest#comments.visible as of 0.23).squish + comments.visible end # If the URL name has changed, then all request: queries will break unless @@ -345,7 +338,7 @@ public # only they are sent the email address with the has in it. (We don't check # the prefix and domain, as sometimes those change, or might be elided by # copying an email, and that doesn't matter) - def InfoRequest.find_by_incoming_email(incoming_email) + def self.find_by_incoming_email(incoming_email) id, hash = InfoRequest._extract_id_hash_from_email(incoming_email) if hash_from_id(id) == hash # Not using find(id) because we don't exception raised if nothing found @@ -355,7 +348,7 @@ public # Return list of info requests which *might* be right given email address # e.g. For the id-hash email addresses, don't match the hash. - def InfoRequest.guess_by_incoming_email(incoming_message) + def self.guess_by_incoming_email(incoming_message) guesses = [] # 1. Try to guess based on the email address(es) incoming_message.addresses.each do |address| @@ -367,7 +360,7 @@ public end # Internal function used by find_by_magic_email and guess_by_incoming_email - def InfoRequest._extract_id_hash_from_email(incoming_email) + def self._extract_id_hash_from_email(incoming_email) # Match case insensitively, FOI officers often write Request with capital R. incoming_email = incoming_email.downcase @@ -394,7 +387,7 @@ public # repeated requests, say once a quarter for time information, then might need to do that. # TODO: this *should* also check outgoing message joined to is an initial # request (rather than follow up) - def InfoRequest.find_existing(title, public_body_id, body) + def self.find_existing(title, public_body_id, body) return InfoRequest.find(:first, :conditions => [ "title = ? and public_body_id = ? and outgoing_messages.body = ?", title, public_body_id, body ], :include => [ :outgoing_messages ] ) end @@ -534,7 +527,7 @@ public # The "holding pen" is a special request which stores incoming emails whose # destination request is unknown. - def InfoRequest.holding_pen_request + def self.holding_pen_request ir = InfoRequest.find_by_url_title("holding_pen") if ir.nil? ir = InfoRequest.new( @@ -549,7 +542,7 @@ public :status => 'ready', :message_type => 'initial_request', :body => 'This is the holding pen request. It shows responses that were sent to invalid addresses, and need moving to the correct request by an adminstrator.', - :last_sent_at => Time.now(), + :last_sent_at => Time.now, :what_doing => 'normal_sort' }) @@ -564,7 +557,7 @@ public # states which require administrator action (hence email administrators # when they are entered, and offer state change dialog to them) - def InfoRequest.requires_admin_states + def self.requires_admin_states return ['requires_admin', 'error_message', 'attention_requested'] end @@ -665,11 +658,11 @@ public if !curr_state.nil? && event.event_type == 'response' if event.calculated_state != curr_state event.calculated_state = curr_state - event.last_described_at = Time.now() + event.last_described_at = Time.now event.save! end if event.last_described_at.nil? # TODO: actually maybe this isn't needed - event.last_described_at = Time.now() + event.last_described_at = Time.now event.save! end curr_state = nil @@ -681,7 +674,7 @@ public # indexed. if event.calculated_state != event.described_state event.calculated_state = event.described_state - event.last_described_at = Time.now() + event.last_described_at = Time.now event.save! end @@ -698,7 +691,7 @@ public # case there is a preceding response that the described state should be applied to. if event.calculated_state != event.described_state event.calculated_state = event.described_state - event.last_described_at = Time.now() + event.last_described_at = Time.now event.save! end end @@ -783,7 +776,14 @@ public end def public_response_events - self.info_request_events.select{|e| e.response? && e.incoming_message.all_can_view? } + condition = <<-SQL + info_request_events.event_type = ? + AND incoming_messages.prominence = ? + SQL + + info_request_events. + joins(:incoming_message). + where(condition, 'response', 'normal') end # The last public response is the default one people might want to reply to @@ -810,8 +810,9 @@ public # Text from the the initial request, for use in summary display def initial_request_text - return '' if outgoing_messages.empty? # mainly for use with incomplete fixtures - outgoing_messages.first.get_text_for_indexing + return '' if outgoing_messages.empty? + body_opts = { :censor_rules => applicable_censor_rules } + outgoing_messages.first.try(:get_text_for_indexing, true, body_opts) or '' end # Returns index of last event which is described or nil if none described. @@ -873,7 +874,7 @@ public # Display version of status - def InfoRequest.get_status_description(status) + def self.get_status_description(status) descriptions = { 'waiting_classification' => _("Awaiting classification."), 'waiting_response' => _("Awaiting response."), @@ -908,21 +909,24 @@ public # Completely delete this request and all objects depending on it def fully_destroy - self.track_things.each do |track_thing| + track_things.each do |track_thing| track_thing.track_things_sent_emails.each { |a| a.destroy } track_thing.destroy end - self.user_info_request_sent_alerts.each { |a| a.destroy } - self.info_request_events.each do |info_request_event| + user_info_request_sent_alerts.each { |a| a.destroy } + info_request_events.each do |info_request_event| info_request_event.track_things_sent_emails.each { |a| a.destroy } info_request_event.destroy end - self.mail_server_logs.each do |mail_server_log| + mail_server_logs.each do |mail_server_log| mail_server_log.destroy end - self.outgoing_messages.each { |a| a.destroy } - self.incoming_messages.each { |a| a.destroy } - self.destroy + outgoing_messages.each { |a| a.destroy } + incoming_messages.each { |a| a.destroy } + comments.each { |comment| comment.destroy } + censor_rules.each{ |censor_rule| censor_rule.destroy } + + destroy end # Called by incoming_email - and used to be called to generate separate @@ -932,7 +936,7 @@ public return InfoRequest.magic_email_for_id(prefix_part, self.id) end - def InfoRequest.magic_email_for_id(prefix_part, id) + def self.magic_email_for_id(prefix_part, id) magic_email = AlaveteliConfiguration::incoming_email_prefix magic_email += prefix_part + id.to_s magic_email += "-" + InfoRequest.hash_from_id(id) @@ -946,7 +950,7 @@ public self.idhash = InfoRequest.hash_from_id(self.id) end - def InfoRequest.create_from_attributes(info_request_atts, outgoing_message_atts, user=nil) + def self.create_from_attributes(info_request_atts, outgoing_message_atts, user=nil) info_request = new(info_request_atts) default_message_params = { :status => 'ready', @@ -960,12 +964,12 @@ public info_request end - def InfoRequest.hash_from_id(id) + def self.hash_from_id(id) return Digest::SHA1.hexdigest(id.to_s + AlaveteliConfiguration::incoming_email_secret)[0,8] end # Used to find when event last changed - def InfoRequest.last_event_time_clause(event_type=nil, join_table=nil, join_clause=nil) + def self.last_event_time_clause(event_type=nil, join_table=nil, join_clause=nil) event_type_clause = '' event_type_clause = " AND info_request_events.event_type = '#{event_type}'" if event_type tables = ['info_request_events'] @@ -980,20 +984,20 @@ public LIMIT 1)" end - def InfoRequest.last_public_response_clause() + def self.last_public_response_clause join_clause = "incoming_messages.id = info_request_events.incoming_message_id AND incoming_messages.prominence = 'normal'" last_event_time_clause('response', 'incoming_messages', join_clause) end - def InfoRequest.old_unclassified_params(extra_params, include_last_response_time=false) - last_response_created_at = last_public_response_clause() + def self.old_unclassified_params(extra_params, include_last_response_time=false) + last_response_created_at = last_public_response_clause age = extra_params[:age_in_days] ? extra_params[:age_in_days].days : OLD_AGE_IN_DAYS params = { :conditions => ["awaiting_description = ? AND #{last_response_created_at} < ? AND url_title != 'holding_pen' AND user_id IS NOT NULL", - true, Time.now() - age] } + true, Time.now - age] } if include_last_response_time params[:select] = "*, #{last_response_created_at} AS last_response_time" params[:order] = 'last_response_time' @@ -1001,29 +1005,21 @@ public return params end - def InfoRequest.count_old_unclassified(extra_params={}) + def self.count_old_unclassified(extra_params={}) params = old_unclassified_params(extra_params) - if extra_params[:conditions] - condition_string = extra_params[:conditions].shift - params[:conditions][0] += " AND #{condition_string}" - params[:conditions] += extra_params[:conditions] - end + add_conditions_from_extra_params(params, extra_params) count(:all, params) end - def InfoRequest.get_random_old_unclassified(limit, extra_params) + def self.get_random_old_unclassified(limit, extra_params) params = old_unclassified_params({}) - if extra_params[:conditions] - condition_string = extra_params[:conditions].shift - params[:conditions][0] += " AND #{condition_string}" - params[:conditions] += extra_params[:conditions] - end + add_conditions_from_extra_params(params, extra_params) params[:limit] = limit params[:order] = "random()" find(:all, params) end - def InfoRequest.find_old_unclassified(extra_params={}) + def self.find_old_unclassified(extra_params={}) params = old_unclassified_params(extra_params, include_last_response_time=true) [:limit, :include, :offset].each do |extra| params[extra] = extra_params[extra] if extra_params[extra] @@ -1032,15 +1028,11 @@ public params[:order] = extra_params[:order] params.delete(:select) end - if extra_params[:conditions] - condition_string = extra_params[:conditions].shift - params[:conditions][0] += " AND #{condition_string}" - params[:conditions] += extra_params[:conditions] - end + add_conditions_from_extra_params(params, extra_params) find(:all, params) end - def InfoRequest.download_zip_dir() + def self.download_zip_dir File.join(Rails.root, "cache", "zips", "#{Rails.env}") end @@ -1058,7 +1050,7 @@ public end def request_dirs - first_three_digits = id.to_s()[0..2] + first_three_digits = id.to_s[0..2] File.join(first_three_digits.to_s, id.to_s) end @@ -1067,7 +1059,7 @@ public end def make_zip_cache_path(user) - cache_file_dir = File.join(InfoRequest.download_zip_dir(), + cache_file_dir = File.join(InfoRequest.download_zip_dir, "download", request_dirs, last_update_hash) @@ -1191,7 +1183,7 @@ public end # This is called from cron regularly. - def InfoRequest.stop_new_responses_on_old_requests + def self.stop_new_responses_on_old_requests # 6 months since last change to request, only allow new incoming messages from authority domains InfoRequest.update_all "allow_new_responses_from = 'authority_only' where updated_at < (now() - interval '6 months') and allow_new_responses_from = 'anybody' and url_title <> 'holding_pen'" # 1 year since last change requests, don't allow any new incoming messages @@ -1240,7 +1232,7 @@ public :model => self.class.base_class.to_s, :model_id => self.id) end - req.save() + req.save end end @@ -1270,13 +1262,6 @@ public PublicBody.set_callback(:save, :after, :purge_in_cache) end - def for_admin_column - self.class.content_columns.map{|c| c unless %w(title url_title).include?(c.name) }.compact.each do |column| - yield(column.human_name, self.send(column.name), column.type.to_s, column.name) - end - end - - # Get requests that have similar important terms def similar_requests(limit=10) xapian_similar = nil @@ -1292,7 +1277,7 @@ public return [xapian_similar, xapian_similar_more] end - def InfoRequest.request_list(filters, page, per_page, max_results) + def self.request_list(filters, page, per_page, max_results) xapian_object = ActsAsXapian::Search.new([InfoRequestEvent], InfoRequestEvent.make_query_from_params(filters), :offset => (page - 1) * per_page, @@ -1309,7 +1294,7 @@ public :show_no_more_than => show_no_more_than } end - def InfoRequest.recent_requests + def self.recent_requests request_events = [] request_events_all_successful = false # Get some successful requests @@ -1356,12 +1341,45 @@ public return [request_events, request_events_all_successful] end - def InfoRequest.find_in_state(state) + def self.find_in_state(state) select("*, #{ last_event_time_clause } as last_event_time"). where(:described_state => state). order('last_event_time') end + def move_to_public_body(destination_public_body, opts = {}) + old_body = public_body + editor = opts.fetch(:editor) + + attrs = { :public_body => destination_public_body } + + if destination_public_body + attrs.merge!({ + :law_used => destination_public_body.law_only_short.downcase + }) + end + + if update_attributes(attrs) + log_event('move_request', + :editor => editor, + :public_body_url_name => public_body.url_name, + :old_public_body_url_name => old_body.url_name) + + reindex_request_events + + public_body + end + end + + # The DateTime of the last InfoRequestEvent belonging to the InfoRequest + # Only available if the last_event_time attribute has been set. This is + # currentlt only set through .find_in_state + # + # Returns a DateTime + def last_event_time + attributes['last_event_time'].try(:to_datetime) + end + private def set_defaults @@ -1370,11 +1388,12 @@ public self.described_state = 'waiting_response' end rescue ActiveModel::MissingAttributeError - # this should only happen on Model.exists?() call. It can be safely ignored. + # this should only happen on Model.exists? call. It can be safely ignored. # See http://www.tatvartha.com/2011/03/activerecordmissingattributeerror-missing-attribute-a-bug-or-a-features/ end + # FOI or EIR? - if !self.public_body.nil? && self.public_body.eir_only? + if new_record? && public_body && public_body.eir_only? self.law_used = 'eir' end end @@ -1390,5 +1409,13 @@ public errors.add(:title, _('Please describe more what the request is about in the subject. There is no need to say it is an FOI request, we add that on anyway.')) end end + + def self.add_conditions_from_extra_params(params, extra_params) + if extra_params[:conditions] + condition_string = extra_params[:conditions].shift + params[:conditions][0] += " AND #{condition_string}" + params[:conditions] += extra_params[:conditions] + end + end end diff --git a/app/models/info_request_batch.rb b/app/models/info_request_batch.rb index 8a5ebeaba..684467c61 100644 --- a/app/models/info_request_batch.rb +++ b/app/models/info_request_batch.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: info_request_batches @@ -21,7 +22,7 @@ class InfoRequestBatch < ActiveRecord::Base validates_presence_of :body # When constructing a new batch, use this to check user hasn't double submitted. - def InfoRequestBatch.find_existing(user, title, body, public_body_ids) + def self.find_existing(user, title, body, public_body_ids) find(:first, :conditions => ['user_id = ? AND title = ? AND body = ? @@ -69,7 +70,7 @@ class InfoRequestBatch < ActiveRecord::Base info_request end - def InfoRequestBatch.send_batches() + def self.send_batches find_each(:conditions => "sent_at IS NULL") do |info_request_batch| unrequestable = info_request_batch.create_batch! mail_message = InfoRequestBatchMailer.batch_sent(info_request_batch, diff --git a/app/models/info_request_event.rb b/app/models/info_request_event.rb index 635ba8f58..263de20a0 100644 --- a/app/models/info_request_event.rb +++ b/app/models/info_request_event.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: info_request_events @@ -21,7 +22,7 @@ # Email: hello@mysociety.org; WWW: http://www.mysociety.org/ class InfoRequestEvent < ActiveRecord::Base - + include AdminColumn extend XapianQueries belongs_to :info_request @@ -278,9 +279,15 @@ class InfoRequestEvent < ActiveRecord::Base end self.params_yaml = params.to_yaml end + def params - YAML.load(self.params_yaml) + param_hash = YAML.load(params_yaml) + param_hash.each do |key, value| + param_hash[key] = value.force_encoding('UTF-8') if value.respond_to?(:force_encoding) + end + param_hash end + def params_yaml_as_html ret = '' # split out parameters into old/new diffs, and other ones @@ -319,9 +326,17 @@ class InfoRequestEvent < ActiveRecord::Base end - def is_incoming_message?() not self.incoming_message_selective_columns("incoming_messages.id").nil? end - def is_outgoing_message?() not self.outgoing_message.nil? end - def is_comment?() not self.comment.nil? end + def is_incoming_message? + incoming_message_id? or (incoming_message if new_record?) + end + + def is_outgoing_message? + outgoing_message_id? or (outgoing_message if new_record?) + end + + def is_comment? + comment_id? or (comment if new_record?) + end # Display version of status def display_status @@ -412,11 +427,4 @@ class InfoRequestEvent < ActiveRecord::Base return ret end - - def for_admin_column - self.class.content_columns.each do |column| - yield(column.human_name, self.send(column.name), column.type.to_s, column.name) - end - end - end diff --git a/app/models/mail_server_log.rb b/app/models/mail_server_log.rb index 07d2fdac0..64a740e1d 100644 --- a/app/models/mail_server_log.rb +++ b/app/models/mail_server_log.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: mail_server_logs @@ -25,7 +26,7 @@ class MailServerLog < ActiveRecord::Base # Doesn't do anything if file hasn't been modified since it was last loaded. # Note: If you do use rotated log files (rather than files named by date), at some # point old loaded log lines will get deleted in the database. - def MailServerLog.load_file(file_name) + def self.load_file(file_name) is_gz = file_name.include?(".gz") file_name_db = is_gz ? file_name.gsub(".gz", "") : file_name @@ -62,23 +63,16 @@ class MailServerLog < ActiveRecord::Base end # Scan the file - def MailServerLog.load_exim_log_data(f, done) + def self.load_exim_log_data(f, done) order = 0 f.each do |line| order = order + 1 emails = email_addresses_on_line(line) - for email in emails - info_request = InfoRequest.find_by_incoming_email(email) - if info_request - info_request.mail_server_logs.create!(:line => line, :order => order, :mail_server_log_done => done) - else - puts "Warning: Could not find request with email #{email}" - end - end + create_mail_server_logs(emails, line, order, done) end end - def MailServerLog.load_postfix_log_data(f, done) + def self.load_postfix_log_data(f, done) order = 0 emails = scan_for_postfix_queue_ids(f) # Go back to the beginning of the file @@ -87,19 +81,12 @@ class MailServerLog < ActiveRecord::Base order = order + 1 queue_id = extract_postfix_queue_id_from_syslog_line(line) if emails.has_key?(queue_id) - emails[queue_id].each do |email| - info_request = InfoRequest.find_by_incoming_email(email) - if info_request - info_request.mail_server_logs.create!(:line => line, :order => order, :mail_server_log_done => done) - else - puts "Warning: Could not find request with email #{email}" - end - end + create_mail_server_logs(emails[queue_id], line, order, done) end end end - def MailServerLog.scan_for_postfix_queue_ids(f) + def self.scan_for_postfix_queue_ids(f) result = {} f.each do |line| emails = email_addresses_on_line(line) @@ -111,7 +98,7 @@ class MailServerLog < ActiveRecord::Base end # Retuns nil if there is no queue id - def MailServerLog.extract_postfix_queue_id_from_syslog_line(line) + def self.extract_postfix_queue_id_from_syslog_line(line) # Assume the log file was written using syslog and parse accordingly m = SyslogProtocol.parse("<13>" + line).content.match(/^\S+: (\S+):/) m[1] if m @@ -119,13 +106,13 @@ class MailServerLog < ActiveRecord::Base # We also check the email prefix so that we could, for instance, separately handle a staging and production # instance running on the same server with different email prefixes. - def MailServerLog.email_addresses_on_line(line) + def self.email_addresses_on_line(line) prefix = Regexp::quote(AlaveteliConfiguration::incoming_email_prefix) domain = Regexp::quote(AlaveteliConfiguration::incoming_email_domain) line.scan(/#{prefix}request-[^\s]+@#{domain}/).sort.uniq end - def MailServerLog.request_sent?(ir) + def self.request_sent?(ir) case(AlaveteliConfiguration::mta_log_type.to_sym) when :exim request_exim_sent?(ir) @@ -137,7 +124,7 @@ class MailServerLog < ActiveRecord::Base end # Look at the log for a request and check that an email was delivered - def MailServerLog.request_exim_sent?(ir) + def self.request_exim_sent?(ir) # Look for line showing request was sent found = false ir.mail_server_logs.each do |mail_server_log| @@ -156,7 +143,7 @@ class MailServerLog < ActiveRecord::Base found end - def MailServerLog.request_postfix_sent?(ir) + def self.request_postfix_sent?(ir) # dsn=2.0.0 is the magic word that says that postfix delivered the email # See http://tools.ietf.org/html/rfc3464 ir.mail_server_logs.any? { |l| l.line.include?("dsn=2.0.0") } @@ -173,11 +160,11 @@ class MailServerLog < ActiveRecord::Base # NB: There can be several emails involved in a request. This just checks that # at least one of them has been succesfully sent. # - def MailServerLog.check_recent_requests_have_been_sent + def self.check_recent_requests_have_been_sent # Get all requests sent for from 2 to 10 days ago. The 2 day gap is # because we load mail server log lines via cron at best an hour after they # are made) - irs = InfoRequest.find(:all, :conditions => [ "created_at < ? and created_at > ? and user_id is not null", Time.now() - 2.day, Time.now() - 10.days ] ) + irs = InfoRequest.find(:all, :conditions => [ "created_at < ? and created_at > ? and user_id is not null", Time.now - 2.day, Time.now - 10.days ] ) # Go through each request and check it ok = true @@ -192,7 +179,17 @@ class MailServerLog < ActiveRecord::Base ok end -end - + private + def self.create_mail_server_logs(emails, line, order, done) + emails.each do |email| + info_request = InfoRequest.find_by_incoming_email(email) + if info_request + info_request.mail_server_logs.create!(:line => line, :order => order, :mail_server_log_done => done) + else + puts "Warning: Could not find request with email #{email}" + end + end + end +end diff --git a/app/models/mail_server_log_done.rb b/app/models/mail_server_log_done.rb index 1bbb23ac4..542c3db3a 100644 --- a/app/models/mail_server_log_done.rb +++ b/app/models/mail_server_log_done.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: mail_server_log_dones diff --git a/app/models/outgoing_message.rb b/app/models/outgoing_message.rb index c2c8ef4f2..2e1b27fba 100644 --- a/app/models/outgoing_message.rb +++ b/app/models/outgoing_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # Schema version: 20131024114346 # @@ -25,6 +26,7 @@ # Email: hello@mysociety.org; WWW: http://www.mysociety.org/ class OutgoingMessage < ActiveRecord::Base + include AdminColumn extend MessageProminence include Rails.application.routes.url_helpers include LinkToHelper @@ -140,22 +142,28 @@ class OutgoingMessage < ActiveRecord::Base end end - def body - ret = read_attribute(:body) - if ret.nil? - return ret + # Public: The body text of the OutgoingMessage. The text is cleaned and + # CensorRules are applied. + # + # options - Hash of options + # :censor_rules - Array of CensorRules to apply. Defaults to the + # applicable_censor_rules of the associated + # InfoRequest. (optional) + # + # Returns a String + def body(options = {}) + text = raw_body.dup + return text if text.nil? + + text = clean_text(text) + + # Use the given censor_rules; otherwise fetch them from the associated + # info_request + censor_rules = options.fetch(:censor_rules) do + info_request.try(:applicable_censor_rules) or [] end - ret = ret.dup - ret.strip! - ret.gsub!(/(?:\n\s*){2,}/, "\n\n") # remove excess linebreaks that unnecessarily space it out - - # Remove things from censor rules - unless info_request.nil? - self.info_request.apply_censor_rules_to_text!(ret) - end - - ret + censor_rules.reduce(text) { |text, rule| rule.apply_to_text(text) } end def raw_body @@ -227,8 +235,12 @@ class OutgoingMessage < ActiveRecord::Base end # Returns text for indexing / text display - def get_text_for_indexing(strip_salutation = true) - text = body.strip + def get_text_for_indexing(strip_salutation = true, opts = {}) + if opts.empty? + text = body.strip + else + text = body(opts).strip + end # Remove salutation text.sub!(/Dear .+,/, "") if strip_salutation @@ -272,12 +284,6 @@ class OutgoingMessage < ActiveRecord::Base info_request.purge_in_cache end - def for_admin_column - self.class.content_columns.each do |column| - yield(column.human_name, self.send(column.name), column.type.to_s, column.name) - end - end - def xapian_reindex_after_update if changes.include?('body') info_request_events.each do |event| @@ -332,6 +338,11 @@ class OutgoingMessage < ActiveRecord::Base errors.add(:what_doing_dummy, _('Please choose what sort of reply you are making.')) end end + + # remove excess linebreaks that unnecessarily space it out + def clean_text(text) + text.strip.gsub(/(?:\n\s*){2,}/, "\n\n") + end end diff --git a/app/models/post_redirect.rb b/app/models/post_redirect.rb index 8049349d0..3cdc69995 100644 --- a/app/models/post_redirect.rb +++ b/app/models/post_redirect.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: post_redirects @@ -71,7 +72,11 @@ class PostRedirect < ActiveRecord::Base end def reason_params - YAML.load(reason_params_yaml) + param_hash = YAML.load(reason_params_yaml) + param_hash.each do |key, value| + param_hash[key] = value.force_encoding('UTF-8') if value.respond_to?(:force_encoding) + end + param_hash end # Extract just local path part, without domain or # diff --git a/app/models/profile_photo.rb b/app/models/profile_photo.rb index 61f88faf3..94edc2967 100644 --- a/app/models/profile_photo.rb +++ b/app/models/profile_photo.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: profile_photos diff --git a/app/models/public_body.rb b/app/models/public_body.rb index 232c0ffa1..ac924a941 100644 --- a/app/models/public_body.rb +++ b/app/models/public_body.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- # == Schema Information # Schema version: 20131024114346 # @@ -32,7 +32,32 @@ require 'securerandom' require 'set' class PublicBody < ActiveRecord::Base - strip_attributes! + include AdminColumn + + class ImportCSVDryRun < StandardError ; end + + @non_admin_columns = %w(name last_edit_comment) + + attr_accessor :no_xapian_reindex + + # Default fields available for importing from CSV, in the format + # [field_name, 'short description of field (basic html allowed)'] + cattr_accessor :csv_import_fields do + [ + ['name', '(i18n)<strong>Existing records cannot be renamed</strong>'], + ['short_name', '(i18n)'], + ['request_email', '(i18n)'], + ['notes', '(i18n)'], + ['publication_scheme', '(i18n)'], + ['disclosure_log', '(i18n)'], + ['home_page', ''], + ['tag_string', '(tags separated by spaces)'], + ] + end + + has_many :info_requests, :order => 'created_at desc' + has_many :track_things, :order => 'created_at desc' + has_many :censor_rules, :order => 'created_at desc' validates_presence_of :name, :message => N_("Name can't be blank") validates_presence_of :url_name, :message => N_("URL name can't be blank") @@ -43,19 +68,12 @@ class PublicBody < ActiveRecord::Base validate :request_email_if_requestable - has_many :info_requests, :order => 'created_at desc' - has_many :track_things, :order => 'created_at desc' - has_many :censor_rules, :order => 'created_at desc' - attr_accessor :no_xapian_reindex - - has_tag_string - - before_save :set_api_key, - :set_default_publication_scheme, - :set_first_letter + before_save :set_api_key!, :unless => :api_key + before_save :set_default_publication_scheme after_save :purge_in_cache after_update :reindex_requested_from + # Every public body except for the internal admin one is visible scope :visible, lambda { { @@ -63,39 +81,83 @@ class PublicBody < ActiveRecord::Base } } + acts_as_versioned + acts_as_xapian :texts => [:name, :short_name, :notes], + :values => [ + # for sorting + [:created_at_numeric, 1, "created_at", :number] + ], + :terms => [ + [:variety, 'V', "variety"], + [:tag_array_for_search, 'U', "tag"] + ] + has_tag_string + strip_attributes! translates :name, :short_name, :request_email, :url_name, :notes, :first_letter, :publication_scheme - accepts_nested_attributes_for :translations, :reject_if => :empty_translation_in_params? - # Default fields available for importing from CSV, in the format - # [field_name, 'short description of field (basic html allowed)'] - cattr_accessor :csv_import_fields do - [ - ['name', '(i18n)<strong>Existing records cannot be renamed</strong>'], - ['short_name', '(i18n)'], - ['request_email', '(i18n)'], - ['notes', '(i18n)'], - ['publication_scheme', '(i18n)'], - ['disclosure_log', '(i18n)'], - ['home_page', ''], - ['tag_string', '(tags separated by spaces)'], - ] - end + # Cannot be grouped at top as it depends on the `translates` macro + include Translatable - acts_as_xapian :texts => [ :name, :short_name, :notes ], - :values => [ - [ :created_at_numeric, 1, "created_at", :number ] # for sorting - ], - :terms => [ [ :variety, 'V', "variety" ], - [ :tag_array_for_search, 'U', "tag" ] - ] + # Cannot be grouped at top as it depends on the `translates` macro + include PublicBodyDerivedFields + + # Cannot be grouped at top as it depends on the `translates` macro + class Translation + include PublicBodyDerivedFields + end - acts_as_versioned self.non_versioned_columns << 'created_at' << 'updated_at' << 'first_letter' << 'api_key' self.non_versioned_columns << 'info_requests_count' << 'info_requests_successful_count' self.non_versioned_columns << 'info_requests_count' << 'info_requests_visible_classified_count' self.non_versioned_columns << 'info_requests_not_held_count' << 'info_requests_overdue' self.non_versioned_columns << 'info_requests_overdue_count' + # Cannot be defined directly under `include` statements as this is opening + # the PublicBody::Version class dynamically defined by the + # `acts_as_versioned` macro. + # + # TODO: acts_as_versioned accepts an extend parameter [1] so these methods + # could be extracted to a module: + # + # acts_as_versioned :extend => PublicBodyVersionExtensions + # + # This includes the module in both the parent class (PublicBody) and the + # Version class (PublicBody::Version), so the behaviour is slightly + # different to opening up PublicBody::Version. + # + # We could add an `extend_version_class` option pretty trivially by + # following the pattern for the existing `extend` option. + # + # [1] http://git.io/vIetK + class Version + def last_edit_comment_for_html_display + text = self.last_edit_comment.strip + text = CGI.escapeHTML(text) + text = MySociety::Format.make_clickable(text) + text = text.gsub(/\n/, '<br>') + return text + end + + def compare(previous = nil) + if previous.nil? + yield([]) + else + v = self + changes = self.class.content_columns.inject([]) {|memo, c| + unless %w(version last_edit_editor last_edit_comment updated_at).include?(c.name) + from = previous.send(c.name) + to = self.send(c.name) + memo << { :name => c.human_name, :from => from, :to => to } if from != to + end + memo + } + changes.each do |change| + yield(change) + end + end + end + end + # Public: Search for Public Bodies whose name, short_name, request_email or # tags contain the given query # @@ -124,97 +186,62 @@ class PublicBody < ActiveRecord::Base uniq end - # Convenience methods for creating/editing translations via forms - def find_translation_by_locale(locale) - self.translations.find_by_locale(locale) - end - - # TODO: - Don't like repeating this! - def calculate_cached_fields(t) - PublicBody.set_first_letter(t) - short_long_name = t.name - short_long_name = t.short_name if t.short_name and !t.short_name.empty? - t.url_name = MySociety::Format.simplify_url_part(short_long_name, 'body') - end - - # Set the first letter on a public body or translation - def PublicBody.set_first_letter(instance) - unless instance.name.nil? or instance.name.empty? - # we use a regex to ensure it works with utf-8/multi-byte - first_letter = Unicode.upcase instance.name.scan(/^./mu)[0] - if first_letter != instance.first_letter - instance.first_letter = first_letter - end - end - end - - def translated_versions - translations - end - - def ordered_translations - translations. - select { |t| I18n.available_locales.include?(t.locale) }. - sort_by { |t| I18n.available_locales.index(t.locale) } + def set_api_key + set_api_key! if api_key.nil? end - def build_all_translations - I18n.available_locales.each do |locale| - translations.build(:locale => locale) unless translations.detect{ |t| t.locale == locale } - end + def set_api_key! + self.api_key = SecureRandom.base64(33) end - def translated_versions=(translation_attrs) - warn "[DEPRECATION] PublicBody#translated_versions= will be replaced " \ - "by PublicBody#translations_attributes= as of release 0.22" - self.translations_attributes = translation_attrs - end + # like find_by_url_name but also search historic url_name if none found + def self.find_by_url_name_with_historic(name) + # If many bodies are found (usually because the url_name is the same + # across locales) return any of them. + found = joins(:translations). + where("public_body_translations.url_name = ?", name). + readonly(false). + first - def set_default_publication_scheme - # Make sure publication_scheme gets the correct default value. - # (This would work automatically, were publication_scheme not a translated attribute) - self.publication_scheme = "" if self.publication_scheme.nil? - end + return found if found - def set_api_key - self.api_key = SecureRandom.base64(33) if self.api_key.nil? - end + # If none found, then search the history of short names and find unique + # public bodies in it + old = PublicBody::Version. + where(:url_name => name). + pluck('DISTINCT public_body_id') - # like find_by_url_name but also search historic url_name if none found - def self.find_by_url_name_with_historic(name) - found = PublicBody.find(:all, - :conditions => ["public_body_translations.url_name=?", name], - :joins => :translations, - :readonly => false) - # If many bodies are found (usually because the url_name is the same across - # locales) return any of them - return found.first if found.size >= 1 - - # If none found, then search the history of short names - old = PublicBody::Version.find_all_by_url_name(name) - # Find unique public bodies in it - old = old.map { |x| x.public_body_id } - old = old.uniq # Maybe return the first one, so we show something relevant, # rather than throwing an error? raise "Two bodies with the same historical URL name: #{name}" if old.size > 1 return unless old.size == 1 # does acts_as_versioned provide a method that returns the current version? - return PublicBody.find(old.first) - end - - # Set the first letter, which is used for faster queries - def set_first_letter - PublicBody.set_first_letter(self) + PublicBody.find(old.first) end # If tagged "not_apply", then FOI/EIR no longer applies to authority at all def not_apply? - return self.has_tag?('not_apply') + has_tag?('not_apply') end + # If tagged "defunct", then the authority no longer exists at all def defunct? - return self.has_tag?('defunct') + has_tag?('defunct') + end + + # Are all requests to this body under the Environmental Information + # Regulations? + def eir_only? + has_tag?('eir_only') + end + + # Schools are allowed more time in holidays, so we change some wordings + def is_school? + has_tag?('school') + end + + def site_administration? + has_tag?('site_administration') end # Can an FOI (etc.) request be made to this body? @@ -233,102 +260,39 @@ class PublicBody < ActiveRecord::Base # Also used as not_followable_reason def not_requestable_reason - if self.defunct? - return 'defunct' - elsif self.not_apply? - return 'not_apply' + if defunct? + 'defunct' + elsif not_apply? + 'not_apply' elsif !has_request_email? - return 'bad_contact' + 'bad_contact' else raise "not_requestable_reason called with type that has no reason" end end def special_not_requestable_reason? - self.defunct? || self.not_apply? - end - - - class Version - - def last_edit_comment_for_html_display - text = self.last_edit_comment.strip - text = CGI.escapeHTML(text) - text = MySociety::Format.make_clickable(text) - text = text.gsub(/\n/, '<br>') - return text - end - - def compare(previous = nil) - if previous.nil? - yield([]) - else - v = self - changes = self.class.content_columns.inject([]) {|memo, c| - unless %w(version last_edit_editor last_edit_comment updated_at).include?(c.name) - from = previous.send(c.name) - to = self.send(c.name) - memo << { :name => c.human_name, :from => from, :to => to } if from != to - end - memo - } - changes.each do |change| - yield(change) - end - end - end + defunct? || not_apply? end def created_at_numeric # format it here as no datetime support in Xapian's value ranges - return self.created_at.strftime("%Y%m%d%H%M%S") - end - def variety - return "authority" - end - - # if the URL name has changed, then all requested_from: queries - # will break unless we update index for every event for every - # request linked to it - def reindex_requested_from - if self.changes.include?('url_name') - for info_request in self.info_requests - - for info_request_event in info_request.info_request_events - info_request_event.xapian_mark_needs_index - end - end - end - end - - # When name or short name is changed, also change the url name - def short_name=(short_name) - globalize.write(Globalize.locale, :short_name, short_name) - self[:short_name] = short_name - self.update_url_name - end - - def name=(name) - globalize.write(Globalize.locale, :name, name) - self[:name] = name - self.update_url_name + created_at.strftime("%Y%m%d%H%M%S") end - def update_url_name - self.url_name = MySociety::Format.simplify_url_part(self.short_or_long_name, 'body') + def variety + "authority" end - # Return the short name if present, or else long name - def short_or_long_name - if self.short_name.nil? || self.short_name.empty? # 'nil' can happen during construction - self.name.nil? ? "" : self.name - else - self.short_name - end + def law_only_short + eir_only? ? 'EIR' : 'FOI' end # Guess home page from the request email, or use explicit override, or nil # if not known. + # + # TODO: PublicBody#calculated_home_page would be a good candidate to cache + # in an instance variable def calculated_home_page if home_page && !home_page.empty? home_page[URI::regexp(%w(http https))] ? home_page : "http://#{home_page}" @@ -337,25 +301,8 @@ class PublicBody < ActiveRecord::Base end end - # Are all requests to this body under the Environmental Information Regulations? - def eir_only? - return self.has_tag?('eir_only') - end - def law_only_short - if self.eir_only? - return "EIR" - else - return "FOI" - end - end - - # Schools are allowed more time in holidays, so we change some wordings - def is_school? - return self.has_tag?('school') - end - # The "internal admin" is a special body for internal use. - def PublicBody.internal_admin_body + def self.internal_admin_body # Use find_by_sql to avoid the search being specific to a # locale, since url_name is a translated field: sql = "SELECT * FROM public_bodies WHERE url_name = 'internal_admin_authority'" @@ -379,13 +326,6 @@ class PublicBody < ActiveRecord::Base end end - def site_administration? - has_tag?('site_administration') - end - - class ImportCSVDryRun < StandardError - end - # Import from a string in CSV format. # Just tests things and returns messages if dry_run is true. # Returns an array of [array of errors, array of notes]. If there @@ -412,7 +352,7 @@ class PublicBody < ActiveRecord::Base # matching names won't work afterwards, and we'll create new bodies instead # of updating them bodies_by_name = {} - set_of_existing = Set.new() + set_of_existing = Set.new internal_admin_body_id = PublicBody.internal_admin_body.id I18n.with_locale(I18n.default_locale) do bodies = (tag.nil? || tag.empty?) ? PublicBody.find(:all, :include => :translations) : PublicBody.find_by_tag(tag) @@ -425,7 +365,7 @@ class PublicBody < ActiveRecord::Base end end - set_of_importing = Set.new() + set_of_importing = Set.new # Default values in case no field list is given field_names = { 'name' => 1, 'request_email' => 2 } line = 0 @@ -565,40 +505,32 @@ class PublicBody < ActiveRecord::Base # Does this user have the power of FOI officer for this body? def is_foi_officer?(user) user_domain = user.email_domain - our_domain = self.request_email_domain - - if user_domain.nil? or our_domain.nil? - return false - end - - return our_domain == user_domain - end - def foi_officer_domain_required - return self.request_email_domain - end + our_domain = request_email_domain - # Returns nil if configuration variable not set - def override_request_email - e = AlaveteliConfiguration::override_all_public_body_request_emails - e if e != "" + return false if user_domain.nil? or our_domain.nil? + our_domain == user_domain end def request_email - if override_request_email - override_request_email - else + if AlaveteliConfiguration::override_all_public_body_request_emails.blank? || read_attribute(:request_email).blank? read_attribute(:request_email) + else + AlaveteliConfiguration::override_all_public_body_request_emails end end # Domain name of the request email def request_email_domain - return PublicBody.extract_domain_from_email(self.request_email) + PublicBody.extract_domain_from_email(request_email) end + alias_method :foi_officer_domain_required, :request_email_domain + # Return the domain part of an email address, canonicalised and with common # extra UK Government server name parts removed. - def PublicBody.extract_domain_from_email(email) + # + # TODO: Extract to library class + def self.extract_domain_from_email(email) email =~ /@(.*)/ if $1.nil? return nil @@ -615,51 +547,53 @@ class PublicBody < ActiveRecord::Base return ret end + # TODO: Could this be defined as `sorted_versions.reverse`? def reverse_sorted_versions - self.versions.sort { |a,b| b.version <=> a.version } + versions.sort { |a,b| b.version <=> a.version } end + def sorted_versions - self.versions.sort { |a,b| a.version <=> b.version } + versions.sort { |a,b| a.version <=> b.version } end def has_notes? - return !self.notes.nil? && self.notes != "" + !notes.nil? && notes != "" end + + # TODO: Deprecate this method. Its only used in a couple of views so easy to + # update to just call PublicBody#notes def notes_as_html - self.notes + notes end def notes_without_html - # assume notes are reasonably behaved HTML, so just use simple regexp on this - @notes_without_html ||= (self.notes.nil? ? '' : self.notes.gsub(/<\/?[^>]*>/, "")) + # assume notes are reasonably behaved HTML, so just use simple regexp + # on this + @notes_without_html ||= (notes.nil? ? '' : notes.gsub(/<\/?[^>]*>/, "")) end def json_for_api - return { - :id => self.id, - :url_name => self.url_name, - :name => self.name, - :short_name => self.short_name, - # :request_email # we hide this behind a captcha, to stop people doing bulk requests easily - :created_at => self.created_at, - :updated_at => self.updated_at, - # don't add the history as some edit comments contain sensitive information + { + :id => id, + :url_name => url_name, + :name => name, + :short_name => short_name, + # :request_email # we hide this behind a captcha, to stop people + # doing bulk requests easily + :created_at => created_at, + :updated_at => updated_at, + # don't add the history as some edit comments contain sensitive + # information # :version, :last_edit_editor, :last_edit_comment - :home_page => self.calculated_home_page, - :notes => self.notes, - :publication_scheme => self.publication_scheme, - :tags => self.tag_array, + :home_page => calculated_home_page, + :notes => notes, + :publication_scheme => publication_scheme, + :tags => tag_array, } end def purge_in_cache - self.info_requests.each {|x| x.purge_in_cache} - end - - def for_admin_column - self.class.content_columns.map{|c| c unless %w(name last_edit_comment).include?(c.name)}.compact.each do |column| - yield(column.human_name, self.send(column.name), column.type.to_s, column.name) - end + info_requests.each { |x| x.purge_in_cache } end def self.where_clause_for_stats(minimum_requests, total_column) @@ -732,6 +666,7 @@ class PublicBody < ActiveRecord::Base 'y_max' => 100, 'totals' => original_totals} end + def self.popular_bodies(locale) # get some example searches and public bodies to display # either from config, or based on a (slow!) query if not set @@ -758,6 +693,70 @@ class PublicBody < ActiveRecord::Base return bodies end + # Methods to privatise + # -------------------------------------------------------------------------- + + # TODO: This could be removed by updating the default value (to '') of the + # `publication_scheme` column in the `public_body_translations` table. + # + # TODO: Can't actually deprecate this because spec/script/mailin_spec.rb:28 + # fails due to the deprecation notice output + def set_default_publication_scheme + # warn %q([DEPRECATION] PublicBody#set_default_publication_scheme will + # become a private method in 0.23).squish + + # Make sure publication_scheme gets the correct default value. + # (This would work automatically, were publication_scheme not a + # translated attribute) + self.publication_scheme = "" if publication_scheme.nil? + end + + # if the URL name has changed, then all requested_from: queries + # will break unless we update index for every event for every + # request linked to it + # + # TODO: Can't actually deprecate this because spec/script/mailin_spec.rb:28 + # fails due to the deprecation notice output + def reindex_requested_from + # warn %q([DEPRECATION] PublicBody#reindex_requested_from will become a + # private method in 0.23).squish + + if changes.include?('url_name') + info_requests.each do |info_request| + info_request.info_request_events.each do |info_request_event| + info_request_event.xapian_mark_needs_index + end + end + end + end + + # Methods to remove + # -------------------------------------------------------------------------- + + # Set the first letter on a public body or translation + def self.set_first_letter(instance) + warn %q([DEPRECATION] PublicBody.set_first_letter will be removed + in 0.23).squish + + unless instance.name.nil? or instance.name.empty? + # we use a regex to ensure it works with utf-8/multi-byte + first_letter = Unicode.upcase instance.name.scan(/^./mu)[0] + if first_letter != instance.first_letter + instance.first_letter = first_letter + end + end + end + + def calculate_cached_fields(t) + warn %q([DEPRECATION] PublicBody#calculate_cached_fields will be removed + in 0.23).squish + + PublicBody.set_first_letter(t) + short_long_name = t.name + short_long_name = t.short_name if t.short_name and !t.short_name.empty? + t.url_name = MySociety::Format.simplify_url_part(short_long_name, 'body') + end + private # Read an attribute value (without using locale fallbacks if the attribute is translated) @@ -773,13 +772,6 @@ class PublicBody < ActiveRecord::Base end end - def empty_translation_in_params?(attributes) - attrs_with_values = attributes.select do |key, value| - value != '' and key.to_s != 'locale' - end - attrs_with_values.empty? - end - def request_email_if_requestable # Request_email can be blank, meaning we don't have details if self.is_requestable? diff --git a/app/models/public_body_category.rb b/app/models/public_body_category.rb index b88c683de..0a64172c1 100644 --- a/app/models/public_body_category.rb +++ b/app/models/public_body_category.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_categories @@ -17,13 +18,14 @@ class PublicBodyCategory < ActiveRecord::Base has_many :public_body_headings, :through => :public_body_category_links translates :title, :description - accepts_nested_attributes_for :translations, :reject_if => :empty_translation_in_params? validates_uniqueness_of :category_tag, :message => 'Tag is already taken' validates_presence_of :title, :message => "Title can't be blank" validates_presence_of :category_tag, :message => "Tag can't be blank" validates_presence_of :description, :message => "Description can't be blank" + include Translatable + def self.get locale = I18n.locale.to_s || default_locale.to_s || "" categories = CategoryCollection.new @@ -51,43 +53,6 @@ class PublicBodyCategory < ActiveRecord::Base ) | PublicBodyCategory.find_by_sql(sql) end - - # Convenience methods for creating/editing translations via forms - def find_translation_by_locale(locale) - translations.find_by_locale(locale) - end - - def translated_versions - translations - end - - def translated_versions=(translation_attrs) - warn "[DEPRECATION] PublicBodyCategory#translated_versions= will be replaced " \ - "by PublicBodyCategory#translations_attributes= as of release 0.22" - self.translations_attributes = translation_attrs - end - - def ordered_translations - translations. - select { |t| I18n.available_locales.include?(t.locale) }. - sort_by { |t| I18n.available_locales.index(t.locale) } - end - - def build_all_translations - I18n.available_locales.each do |locale| - translations.build(:locale => locale) unless translations.detect{ |t| t.locale == locale } - end - end - - private - - def empty_translation_in_params?(attributes) - attrs_with_values = attributes.select do |key, value| - value != '' and key.to_s != 'locale' - end - attrs_with_values.empty? - end - end PublicBodyCategory::Translation.class_eval do diff --git a/app/models/public_body_category/category_collection.rb b/app/models/public_body_category/category_collection.rb index 8286e2710..7d5732a82 100644 --- a/app/models/public_body_category/category_collection.rb +++ b/app/models/public_body_category/category_collection.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # replicate original file-based PublicBodyCategories functionality class PublicBodyCategory::CategoryCollection include Enumerable @@ -13,19 +14,19 @@ class PublicBodyCategory::CategoryCollection end def with_description - @categories.select() { |a| a.instance_of?(Array) } + @categories.select { |a| a.instance_of?(Array) } end def tags - tags = with_description.map() { |a| a[0] } + tags = with_description.map { |a| a[0] } end def by_tag - Hash[*with_description.map() { |a| a[0..1] }.flatten] + Hash[*with_description.map { |a| a[0..1] }.flatten] end def singular_by_tag - Hash[*with_description.map() { |a| [a[0],a[2]] }.flatten] + Hash[*with_description.map { |a| [a[0],a[2]] }.flatten] end def by_heading diff --git a/app/models/public_body_category_link.rb b/app/models/public_body_category_link.rb index 8c3eb8060..be73a9afa 100644 --- a/app/models/public_body_category_link.rb +++ b/app/models/public_body_category_link.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_category_links diff --git a/app/models/public_body_change_request.rb b/app/models/public_body_change_request.rb index 0e59cbecc..88a24dbd9 100644 --- a/app/models/public_body_change_request.rb +++ b/app/models/public_body_change_request.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_change_requests diff --git a/app/models/public_body_heading.rb b/app/models/public_body_heading.rb index 8c160ba8b..d49b388bb 100644 --- a/app/models/public_body_heading.rb +++ b/app/models/public_body_heading.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_headings @@ -15,7 +16,6 @@ class PublicBodyHeading < ActiveRecord::Base default_scope order('display_order ASC') translates :name - accepts_nested_attributes_for :translations, :reject_if => :empty_translation_in_params? validates_uniqueness_of :name, :message => 'Name is already taken' validates_presence_of :name, :message => 'Name can\'t be blank' @@ -28,32 +28,7 @@ class PublicBodyHeading < ActiveRecord::Base end end - # Convenience methods for creating/editing translations via forms - def find_translation_by_locale(locale) - translations.find_by_locale(locale) - end - - def translated_versions - translations - end - - def translated_versions=(translation_attrs) - warn "[DEPRECATION] PublicBodyHeading#translated_versions= will be replaced " \ - "by PublicBodyHeading#translations_attributes= as of release 0.22" - self.translations_attributes = translation_attrs - end - - def ordered_translations - translations. - select { |t| I18n.available_locales.include?(t.locale) }. - sort_by { |t| I18n.available_locales.index(t.locale) } - end - - def build_all_translations - I18n.available_locales.each do |locale| - translations.build(:locale => locale) unless translations.detect{ |t| t.locale == locale } - end - end + include Translatable def add_category(category) unless public_body_categories.include?(category) @@ -68,14 +43,4 @@ class PublicBodyHeading < ActiveRecord::Base 0 end end - - private - - def empty_translation_in_params?(attributes) - attrs_with_values = attributes.select do |key, value| - value != '' and key.to_s != 'locale' - end - attrs_with_values.empty? - end - end diff --git a/app/models/purge_request.rb b/app/models/purge_request.rb index 81980188d..39dae6a74 100644 --- a/app/models/purge_request.rb +++ b/app/models/purge_request.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: purge_requests diff --git a/app/models/raw_email.rb b/app/models/raw_email.rb index 907d3c7a0..58ae29a3b 100644 --- a/app/models/raw_email.rb +++ b/app/models/raw_email.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: raw_emails diff --git a/app/models/request_classification.rb b/app/models/request_classification.rb index 478a543d3..ab0cd1f21 100644 --- a/app/models/request_classification.rb +++ b/app/models/request_classification.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: request_classifications @@ -15,7 +16,7 @@ class RequestClassification < ActiveRecord::Base # return classification instances representing the top n # users, with a 'cnt' attribute representing the number # of classifications the user has made. - def RequestClassification.league_table(size, conditions=[]) + def self.league_table(size, conditions=[]) find(:all, :select => 'user_id, count(*) as cnt', :conditions => conditions, :group => 'user_id', diff --git a/app/models/spam_address.rb b/app/models/spam_address.rb index 2c84beaa0..893826a96 100644 --- a/app/models/spam_address.rb +++ b/app/models/spam_address.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: spam_addresses diff --git a/app/models/track_thing.rb b/app/models/track_thing.rb index cd90c4a9e..aad7cc51b 100644 --- a/app/models/track_thing.rb +++ b/app/models/track_thing.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: track_things diff --git a/app/models/track_things_sent_email.rb b/app/models/track_things_sent_email.rb index 072d3bdea..d4f3f3f04 100644 --- a/app/models/track_things_sent_email.rb +++ b/app/models/track_things_sent_email.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: track_things_sent_emails diff --git a/app/models/user.rb b/app/models/user.rb index 8fd7851e0..8c9e3c453 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,6 +39,7 @@ class User < ActiveRecord::Base has_one :profile_photo has_many :censor_rules, :order => 'created_at desc' has_many :info_request_batches, :order => 'created_at desc' + has_many :request_classifications validates_presence_of :email, :message => _("Please enter your email address") validates_presence_of :name, :message => _("Please enter your name") @@ -197,7 +198,9 @@ class User < ActiveRecord::Base end def visible_comments - comments.find(:all, :conditions => 'visible') + warn %q([DEPRECATION] User#visible_comments will be replaced with + User#comments.visible as of 0.23).squish + comments.visible end # Don't display any leading/trailing spaces @@ -301,12 +304,6 @@ class User < ActiveRecord::Base !ban_text.empty? end - def public_banned? - warn %q([DEPRECATION] User#public_banned? will be replaced with - User#banned? as of 0.22).squish - banned? - end - # Various ways the user can be banned, and text to describe it if failed def can_file_requests? ban_text.empty? && !exceeded_limit? diff --git a/app/models/user_info_request_sent_alert.rb b/app/models/user_info_request_sent_alert.rb index cd163d14b..e6a6405ef 100644 --- a/app/models/user_info_request_sent_alert.rb +++ b/app/models/user_info_request_sent_alert.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: user_info_request_sent_alerts diff --git a/app/models/widget_vote.rb b/app/models/widget_vote.rb new file mode 100644 index 000000000..dda77007f --- /dev/null +++ b/app/models/widget_vote.rb @@ -0,0 +1,20 @@ +# -*- encoding : utf-8 -*- +# == Schema Information +# +# Table name: widget_votes +# +# id :integer not null, primary key +# cookie :string(255) +# info_request_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class WidgetVote < ActiveRecord::Base + belongs_to :info_request + validates :info_request, :presence => true + + attr_accessible :cookie + validates :cookie, :length => { :is => 20 } + validates_uniqueness_of :cookie, :scope => :info_request_id +end diff --git a/app/views/admin_general/index.html.erb b/app/views/admin_general/index.html.erb index ba0563bb6..8840bce74 100644 --- a/app/views/admin_general/index.html.erb +++ b/app/views/admin_general/index.html.erb @@ -2,17 +2,10 @@ <div class="row"> <div class="span12"> - <h1><%=@title%></h1> - - <ul> - <li><%=@public_body_count%> public authorities</li> - <li> - <%=@info_request_count%> requests, <%=@outgoing_message_count%> outgoing messages, - <%=@incoming_message_count%> incoming messages - </li> - <li><%=@user_count%> users, <%=@track_thing_count%> tracked things</li> - <li><%=@comment_count%> annotations</li> - </ul> + <h1><%= @title %></h1> + <p> + <%= link_to 'Summary stats have moved →', admin_stats_path %> + </p> </div> </div> @@ -28,8 +21,14 @@ <% if @holding_pen_messages.size > 0 %> <div class="accordion-group"> <div class="accordion-heading"> - <a class="accordion-toggle" href="#holding-pen" data-toggle="collapse" data-parent="things-to-do"><span class="label label-important"><%=@holding_pen_messages.size%></span><%= chevron_right %> Put misdelivered responses with the right request</a> + <a class="accordion-toggle" href="#holding-pen" data-toggle="collapse" data-parent="things-to-do"> + <span class="label label-important"> + <%= @holding_pen_messages.size %> + </span> + <%= chevron_right %> Put misdelivered responses with the right request + </a> </div> + <div id="holding-pen" class="accordion-body collapse"> <table class="table table-striped table-condensed"> <tbody> @@ -39,11 +38,13 @@ <% if message.get_body_for_quoting.strip.size == 0 %> <%= link_to "(no body)", admin_raw_email_path(message.raw_email_id) %> <% else %> - <%= link_to excerpt(message.get_body_for_quoting, "", :radius => 60), admin_raw_email_path(message.raw_email_id) %> + <%= link_to admin_raw_email_path(message.raw_email_id) do %> + <%= excerpt(message.get_body_for_quoting, "", :radius => 60) %> + <% end %> <% end %> </td> <td class="span2"> - <%=simple_date(message.sent_at)%> + <%= simple_date(message.sent_at) %> </td> </tr> <% end %> @@ -67,7 +68,7 @@ <%= request_both_links(@request) %> </td> <td class="span2"> - <%=simple_date(@request.info_request_events.last.created_at)%> + <%= simple_date(@request.last_event_time) %> </td> </tr> <% end %> @@ -92,7 +93,7 @@ <%= request_both_links(@request) %> </td> <td class="span2"> - <%=simple_date(@request.info_request_events.last.created_at)%> + <%= simple_date(@request.last_event_time) %> </td> </tr> <% end %> @@ -116,7 +117,7 @@ <%= request_both_links(@request) %> </td> <td class="span2"> - <%=simple_date(@request.info_request_events.last.created_at)%> + <%= simple_date(@request.last_event_time) %> </td> </tr> <% end %> @@ -178,18 +179,33 @@ <% if @new_body_requests.size > 0 %> <div class="accordion-group"> <div class="accordion-heading"> - <a class="accordion-toggle" href="#new-authorities" data-toggle="collapse" data-parent="things-to-do"><span class="label label-important"><%= @new_body_requests.size %></span><%= chevron_right %> Add new authorities</a> + <a class="accordion-toggle" href="#new-authorities" data-toggle="collapse" data-parent="things-to-do"> + <span class="label label-important"> + <%= @new_body_requests.size %> + </span> + <%= chevron_right %> Add new authorities + </a> </div> + <div id="new-authorities" class="accordion-body collapse"> - <% for @change_request in @new_body_requests %> - <%= render :partial => 'change_request_summary'%> - <%= form_tag admin_change_request_path(@change_request), :method => 'put', :class => "form form-horizontal" do %> - <%= submit_tag 'Close', :class => "btn btn-danger" %> - <%= link_to("Close and respond", edit_admin_change_request_path(@change_request), :class => 'btn') %> - <%= link_to("Add authority", new_admin_body_path(:change_request_id => @change_request.id), :class => 'btn btn-primary') %> - <% end %> + <% for @change_request in @new_body_requests %> + <%= render :partial => 'change_request_summary'%> - <% end %> + <%= form_tag admin_change_request_path(@change_request), + :method => 'put', + :class => "form form-horizontal" do %> + + <%= submit_tag 'Close', :class => "btn btn-danger" %> + + <%= link_to "Close and respond", + edit_admin_change_request_path(@change_request), + :class => 'btn' %> + + <%= link_to "Add authority", + new_admin_body_path(:change_request_id => @change_request.id), + :class => 'btn btn-primary' %> + <% end %> + <% end %> </div> </div> <% end %> @@ -197,17 +213,34 @@ <% if @body_update_requests.size > 0 %> <div class="accordion-group"> <div class="accordion-heading"> - <a class="accordion-toggle" href="#update-authorities" data-toggle="collapse" data-parent="things-to-do"><span class="label label-important"><%= @body_update_requests.size %></span><%= chevron_right %> Update authorities</a> + <a class="accordion-toggle" href="#update-authorities" data-toggle="collapse" data-parent="things-to-do"> + <span class="label label-important"> + <%= @body_update_requests.size %> + </span> + <%= chevron_right %> Update authorities + </a> </div> + <div id="update-authorities" class="accordion-body collapse"> <% for @change_request in @body_update_requests %> - <%= render :partial => 'change_request_summary' %> - <%= form_tag admin_change_request_path(@change_request), :class => "form form-horizontal", :method => 'put' do %> - <%= submit_tag 'Close', :class => "btn btn-danger" %> - <%= link_to("Close and respond", edit_admin_change_request_path(@change_request), :class => 'btn') %> - <%= link_to("Make update", edit_admin_body_path(@change_request.public_body, :change_request_id => @change_request.id), :class => 'btn btn-primary') %> - <% end %> + <%= render :partial => 'change_request_summary' %> + + <%= form_tag admin_change_request_path(@change_request), + :class => "form form-horizontal", + :method => 'put' do %> + + <%= submit_tag 'Close', :class => "btn btn-danger" %> + + <%= link_to "Close and respond", + edit_admin_change_request_path(@change_request), + :class => 'btn' %> + + <%= link_to "Make update", + edit_admin_body_path(@change_request.public_body, + :change_request_id => @change_request.id), + :class => 'btn btn-primary' %> <% end %> + <% end %> </div> </div> <% end %> diff --git a/app/views/admin_public_body/edit.html.erb b/app/views/admin_public_body/edit.html.erb index dcafbd270..fc9c25e8f 100644 --- a/app/views/admin_public_body/edit.html.erb +++ b/app/views/admin_public_body/edit.html.erb @@ -13,7 +13,7 @@ <div class="row"> <div class="span8"> <div class="well"> - <%= link_to 'Show', admin_bodies_path(@public_body), :class => "btn" %> + <%= link_to 'Show', admin_body_path(@public_body), :class => "btn" %> <%= link_to 'List all', admin_bodies_path, :class => "btn" %> </div> </div> diff --git a/app/views/comment/_comment_form.html.erb b/app/views/comment/_comment_form.html.erb index 6ca3f4c9f..0a6712af5 100644 --- a/app/views/comment/_comment_form.html.erb +++ b/app/views/comment/_comment_form.html.erb @@ -5,7 +5,7 @@ <% if !TrackThing.find_existing(@user, track_thing) && (!@user || @info_request.user != @user) %> <p> - <%= check_box_tag 'subscribe_to_request', "1", params[:subscribe_to_request] ? true : false %> <label for="subscribe_to_request"><%= _('Email me future updates to this request') %></label> + <%= check_box_tag 'subscribe_to_request', "1", params[:subscribe_to_request] %> <label for="subscribe_to_request"><%= _('Email me future updates to this request') %></label> </p> <% end %> diff --git a/app/views/comment/_single_comment.html.erb b/app/views/comment/_single_comment.html.erb index 07017dabf..badc39d9a 100644 --- a/app/views/comment/_single_comment.html.erb +++ b/app/views/comment/_single_comment.html.erb @@ -1,4 +1,4 @@ -<div class="comment_in_request" id="comment-<%=comment.id.to_s%>"> +<div class="comment_in_request box" id="comment-<%=comment.id.to_s%>"> <% if comment.user && comment.user.profile_photo && !@render_to_file %> <div class="user_photo_on_comment"> <img src="<%= get_profile_photo_url(:url_name => comment.user.url_name) %>" alt=""> diff --git a/app/views/general/_responsive_topnav.html.erb b/app/views/general/_responsive_topnav.html.erb index 0af6629c8..c99864cab 100644 --- a/app/views/general/_responsive_topnav.html.erb +++ b/app/views/general/_responsive_topnav.html.erb @@ -21,11 +21,16 @@ </li> <li id="navigation_search"> - <form id="navigation_search_form" method="get" action="<%= search_redirect_path %>"> - <label for="navigation_search_button"> - <img src="/assets/search.png" alt="Search:"> + <form id="navigation_search_form" method="get" action="<%= search_redirect_path %>" role="search"> + <label class="visually-hidden" for="navigation_search_button"> + <%= _("Search") %> </label> - <%= text_field_tag 'query', params[:query], { :id => "navigation_search_button", :title => "type your search term here" } %> + <%= text_field_tag 'query', params[:query], { :id => "navigation_search_button", :type => "search", :placeholder => _("Search"), :title => _("type your search term here") } %> + <button type="submit"> + <span class="visually-hidden"> + <%= _("Submit Search") %> + </span> + </button> </form> </li> </ul> diff --git a/app/views/help/unhappy.html.erb b/app/views/help/unhappy.html.erb index 79e3f8273..c0444fb54 100644 --- a/app/views/help/unhappy.html.erb +++ b/app/views/help/unhappy.html.erb @@ -101,9 +101,8 @@ contact any registered user from their page. There may be an Internet forum or group that they hang out in. If it is a local matter, use <a href="http://www.groupsnearyou.com">GroupsNearYou</a> to find such a forum.</li> -<li><strong>Start a pledge</strong> on <a href="http://www.pledgebank.com">PledgeBank</a> to get -others to act together with you. For example, you could arrange a meeting with -staff from the authority. Or you could form a small local campaigns group. +<li>You could form a small local campaign group and arrange a meeting +with staff from the authority.</li> </ul> diff --git a/app/views/layouts/default.html.erb b/app/views/layouts/default.html.erb index 56e6b3362..39f3241c6 100644 --- a/app/views/layouts/default.html.erb +++ b/app/views/layouts/default.html.erb @@ -23,7 +23,7 @@ <% if @profile_photo_javascript %> <%= javascript_include_tag "profile-photos" %> - <%= stylesheet_link_tag "jquery.Jcrop.css" %> + <%= stylesheet_link_tag "jquery.Jcrop.min.css" %> <% end %> <% if is_admin? %> <%= javascript_include_tag "bootstrap-dropdown" %> diff --git a/app/views/public_body/show.html.erb b/app/views/public_body/show.html.erb index 016c2460d..546db681e 100644 --- a/app/views/public_body/show.html.erb +++ b/app/views/public_body/show.html.erb @@ -11,43 +11,45 @@ <% end %> <div class="authority__header"> - <h1><%=h(@public_body.name)%></h1> + <h1><%= h(@public_body.name) %></h1> <p class="authority__header__subtitle"> - <%= type_of_authority(@public_body) %><% if not @public_body.short_name.empty? %>, - <%= _('also called {{public_body_short_name}}', :public_body_short_name => h(@public_body.short_name))%><% end %> - <% if !@user.nil? && @user.admin_page_links? %> - (<%= link_to _("admin"), admin_body_path(@public_body) %>) + <%= type_of_authority(@public_body) %><% unless @public_body.short_name.empty? %>, + <%= _('also called {{public_body_short_name}}', :public_body_short_name => h(@public_body.short_name)) %> + <% end %> + + <% if @user && @user.admin_page_links? %> + (<%= link_to _("admin"), admin_body_path(@public_body) %>) <% end %> </p> <% if @public_body.has_notes? || @public_body.eir_only? || @public_body.special_not_requestable_reason? %> - <div id="stepwise_make_request"> - <% if @public_body.has_notes? %> - <p class="authority__header__notes"> - <%= @public_body.notes_as_html.html_safe %> - </p> - <% end %> + <div id="stepwise_make_request"> + <% if @public_body.has_notes? %> + <p class="authority__header__notes"> + <%= @public_body.notes_as_html.html_safe %> + </p> + <% end %> - <% if @public_body.is_requestable? %> - <% if @public_body.eir_only? %> + <% if @public_body.is_requestable? %> + <% if @public_body.eir_only? %> + <p class="authority__header__notes"> + <%= _('You can only request information about the environment from this authority.')%> + </p> + <% end %> + <% elsif @public_body.special_not_requestable_reason? %> <p class="authority__header__notes"> - <%= _('You can only request information about the environment from this authority.')%> + <%= public_body_not_requestable_reasons(@public_body).first %> </p> <% end %> - <% elsif @public_body.special_not_requestable_reason? %> - <p class="authority__header__notes"> - <%= public_body_not_requestable_reasons(@public_body).first %> - </p> - <% end %> - </div> + </div> <% end %> - <% if @public_body.info_requests.size > 0 %> + <% if @number_of_visible_requests > 0 %> <div class="authority__header__stats"> <%= n_('{{count}} request', '{{count}} requests', - @public_body.info_requests.size, - :count => @public_body.info_requests.size) %> + @number_of_visible_requests, + :count => @number_of_visible_requests) %> </div> <% end %> @@ -55,25 +57,25 @@ <div class="action-bar__make-request"> <% if @public_body.is_requestable? || @public_body.not_requestable_reason == 'bad_contact' %> <%= link_to _("Make a request to this authority"), new_request_to_body_path(:url_name => @public_body.url_name), :class => "link_button_green" %> - <% end %> + <% end %> </div> + <div class="action-bar__follow"> - <% follower_count = TrackThing.count(:all, :conditions => ["public_body_id = ?", @public_body.id]) %> - <div class="action-bar__follow-button"> - <% if @existing_track %> - <%= (link_to _("Unsubscribe"), {:controller => 'track', :action => 'update', :track_id => @existing_track.id, :track_medium => "delete", :r => request.fullpath}, :class => "link_button_green") %> - <% else %> - <div class="feed_link"> - <%= link_to _("Follow"), do_track_path(@track_thing), :class => "link_button_green" %> - </div> - <% end %> - </div> + <div class="action-bar__follow-button"> + <% if @existing_track %> + <%= link_to _("Unsubscribe"), {:controller => 'track', :action => 'update', :track_id => @existing_track.id, :track_medium => "delete", :r => request.fullpath}, :class => "link_button_green" %> + <% else %> + <div class="feed_link"> + <%= link_to _("Follow"), do_track_path(@track_thing), :class => "link_button_green" %> + </div> + <% end %> + </div> <div class="action-bar__follower-count"> <%= n_("{{count}} follower", "{{count}} followers", - follower_count, - :count => content_tag(:span, follower_count, :id => "follow_count")) %> + @follower_count, + :count => content_tag(:span, @follower_count, :id => "follow_count")) %> </div> </div> </div> @@ -81,7 +83,7 @@ <div class="authority__body"> <div class="authority__body__foi-results"> - <% if @public_body.info_requests.size == 0 %> + <% if @number_of_visible_requests.zero? %> <% if @public_body.is_requestable? or @public_body.not_requestable_reason != 'defunct' %> <% if @public_body.eir_only? %> <h2><%= _('Environmental Information Regulations requests made using this site') %></h2> @@ -99,14 +101,13 @@ <% end %> <a name="results"></a> - <% if @public_body.info_requests.size > 4 %> + <% if @number_of_visible_requests > 4 %> <%= render :partial => 'request/request_filter_form' %> <% end %> <% end %> - <% if !@xapian_requests.nil? %> - - <% for result in @xapian_requests.results %> + <% if @xapian_requests %> + <% @xapian_requests.results.each do |result| %> <%= render :partial => 'request/request_listing_via_event', :locals => { :event => result[:model] } %> <% end %> @@ -132,11 +133,17 @@ </div> <div class="authority__body__sidebar"> - <% if @public_body.info_requests.size > 4 %> + <% if @number_of_visible_requests > 4 %> <%= render :partial => 'request/request_search_form' %> <% end %> + <%= render :partial => 'more_info', :locals => { :public_body => @public_body } %> - <%= render :partial => 'track/tracking_links', :locals => { :track_thing => @track_thing, :own_request => false, :location => 'sidebar' } %> + + <%= render :partial => 'track/tracking_links', + :locals => { :track_thing => @track_thing, + :existing_track => @existing_track, + :own_request => false, + :location => 'sidebar' } %> </div> </div> diff --git a/app/views/public_body_change_requests/new.html.erb b/app/views/public_body_change_requests/new.html.erb index b52d583be..9abe03732 100644 --- a/app/views/public_body_change_requests/new.html.erb +++ b/app/views/public_body_change_requests/new.html.erb @@ -12,7 +12,7 @@ <p> <label class="form_label" for="user_email"> - <%= ("Your email:") %> + <%= _("Your email:") %> </label> <%= f.text_field :user_email %> </p> diff --git a/app/views/request/_act.html.erb b/app/views/request/_act.html.erb index 878cdf4ff..c7bbd287f 100644 --- a/app/views/request/_act.html.erb +++ b/app/views/request/_act.html.erb @@ -20,3 +20,8 @@ <% end %> <%= link_to _("Start your own blog"), "http://wordpress.com/"%> </div> +<% if AlaveteliConfiguration::enable_widgets %> + <div class="act_link"> + <%= link_to _("Create a widget for this request"), new_request_widget_path(@info_request) %> + </div> +<% end %> diff --git a/app/views/request/_followup.html.erb b/app/views/request/_followup.html.erb index 2643b767f..24cede824 100644 --- a/app/views/request/_followup.html.erb +++ b/app/views/request/_followup.html.erb @@ -20,7 +20,7 @@ </h2> <% end %> <% if @info_request.who_can_followup_to(incoming_message).count > 0 %> -<div id="other_recipients"> +<div id="other_recipients" class="box"> <%= _("Don't want to address your message to {{person_or_body}}? You can also write to:", :person_or_body => name_for_followup) %> <ul> <% @info_request.who_can_followup_to(incoming_message).each do |name, email, id| %> diff --git a/app/views/request/_incoming_correspondence.html.erb b/app/views/request/_incoming_correspondence.html.erb index 70bd25c7f..9d205204e 100644 --- a/app/views/request/_incoming_correspondence.html.erb +++ b/app/views/request/_incoming_correspondence.html.erb @@ -1,4 +1,4 @@ -<div class="incoming correspondence <%= incoming_message.prominence %>" id="incoming-<%=incoming_message.id.to_s%>"> +<div class="incoming correspondence box <%= incoming_message.prominence %>" id="incoming-<%=incoming_message.id.to_s%>"> <%- if not incoming_message.user_can_view?(@user) %> <%= render :partial => 'request/hidden_correspondence', :locals => { :message => incoming_message }%> <%- else %> diff --git a/app/views/request/_outgoing_correspondence.html.erb b/app/views/request/_outgoing_correspondence.html.erb index dced5c94c..3b85cae7f 100644 --- a/app/views/request/_outgoing_correspondence.html.erb +++ b/app/views/request/_outgoing_correspondence.html.erb @@ -1,4 +1,4 @@ -<div class="outgoing correspondence" id="outgoing-<%=outgoing_message.id.to_s%>"> +<div class="outgoing correspondence box" id="outgoing-<%=outgoing_message.id.to_s%>"> <%- if not outgoing_message.user_can_view?(@user) %> <%= render :partial => 'request/hidden_correspondence', :locals => { :message => outgoing_message }%> <%- else %> diff --git a/app/views/request/_request_listing_via_event.html.erb b/app/views/request/_request_listing_via_event.html.erb index 20bc5b2c8..7ad568829 100644 --- a/app/views/request/_request_listing_via_event.html.erb +++ b/app/views/request/_request_listing_via_event.html.erb @@ -6,8 +6,8 @@ end %> <div class="request_left"> <span class="head"> <% if event.is_incoming_message? %> - <%= link_to highlight_words(event.info_request.title, @highlight_words), incoming_message_path(event.incoming_message_selective_columns("incoming_messages.id")) %> - <% elsif event.is_outgoing_message? and event.event_type == 'followup_sent' %> + <%= link_to highlight_words(event.info_request.title, @highlight_words), incoming_message_path(event.incoming_message) %> + <% elsif event.is_outgoing_message? && event.event_type == 'followup_sent' %> <%= link_to highlight_words(event.info_request.title, @highlight_words), outgoing_message_path(event.outgoing_message) %> <% elsif event.is_comment? %> <%= link_to highlight_words(event.info_request.title, @highlight_words), comment_path(event.comment) %> diff --git a/app/views/request/_request_search_form.html.erb b/app/views/request/_request_search_form.html.erb index 3f2f66950..795070337 100644 --- a/app/views/request/_request_search_form.html.erb +++ b/app/views/request/_request_search_form.html.erb @@ -2,34 +2,22 @@ <div id="list-filter"> <%= form_tag(request.path, :method => "get", :id=>"filter_requests_form") do %> - <div class="list-filter-item"> - <%= label_tag(:query, _("Keywords"), :class=>"form_label title") %> - <%= text_field_tag(:query, params[:query]) %> - </div> -<% if false # don't think we want this, but leaving as an example %> - <div class="list-filter-item"> - <%= _("Search for words in:") %> <br/> - <% [["sent", _("messages from users")], - ["response", _("messages from authorities")], - ["comment", _("comments")]].each_with_index do |item, index| - variety, title = item %> - - <%= check_box_tag "request_variety[]", variety, params[:request_variety].nil? ? true : params[:request_variety].include?(variety), :id => "request_variety_#{index}" %> - <%= label_tag("request_variety_#{index}", title) %> <br/> - <% end %> - </div> -<% end %> - <div class="list-filter-item"> - <%= label_tag(:query, _("Made between"), :class=>"form_label title") %> - <%= text_field_tag(:request_date_after, params[:request_date_after], {:class => "use-datepicker", :size => 10}) %> - <%= label_tag(:query, _("and"), :class=>"form_label") %> - <%= text_field_tag(:request_date_before, params[:request_date_before], {:class => "use-datepicker", :size => 10}) %> - </div> + <div class="list-filter-item"> + <%= label_tag(:query, _("Keywords"), :class=>"form_label title") %> + <%= text_field_tag(:query, params[:query]) %> + </div> + + <div class="list-filter-item"> + <%= label_tag(:query, _("Made between"), :class=>"form_label title") %> + <%= text_field_tag(:request_date_after, params[:request_date_after], {:class => "use-datepicker", :size => 10}) %> + <%= label_tag(:query, _("and"), :class=>"form_label") %> + <%= text_field_tag(:request_date_before, params[:request_date_before], {:class => "use-datepicker", :size => 10}) %> + </div> - <%= after_form_fields if defined?(after_form_fields) -%> + <%= after_form_fields if defined?(after_form_fields) -%> - <div class="list-filter-item"> - <%= submit_tag(_("Search")) %> - </div> -<% end %> + <div class="list-filter-item"> + <%= submit_tag(_("Search")) %> + </div> + <% end %> </div> diff --git a/app/views/request/_resent_outgoing_correspondence.html.erb b/app/views/request/_resent_outgoing_correspondence.html.erb index 17b6b635b..287a5cac5 100644 --- a/app/views/request/_resent_outgoing_correspondence.html.erb +++ b/app/views/request/_resent_outgoing_correspondence.html.erb @@ -1,4 +1,4 @@ -<div class="outgoing correspondence" id="outgoing-<%=outgoing_message.id.to_s%>"> +<div class="outgoing correspondence box" id="outgoing-<%=outgoing_message.id.to_s%>"> <h2> <%= simple_date(info_request_event.created_at) %> </h2> diff --git a/app/views/request/new.html.erb b/app/views/request/new.html.erb index 486a89d45..23f7ad76a 100644 --- a/app/views/request/new.html.erb +++ b/app/views/request/new.html.erb @@ -144,7 +144,7 @@ <% if @info_request.public_body.info_requests.size > 0 %> <%= _("Browse <a href='{{url}}'>other requests</a> to '{{public_body_name}}' for examples of how to word your request.", :public_body_name=>h(@info_request.public_body.name), :url=>public_body_path(@info_request.public_body)) %> <% else %> - <%= _("Browse <a href='{{url}}'>other requests</a> for examples of how to word your request.", :url=>request_list_url) %> + <%= _("Browse <a href='{{url}}'>other requests</a> for examples of how to word your request.", :url=>request_list_successful_url) %> <% end %> </p> <% end %> @@ -156,7 +156,7 @@ this website <a href="{{url}}">forever</a>', :url => (help_privacy_path+"#public_request").html_safe)) %>. </p> <p> - <%= raw(_('<a href="{{url}}">Thinking of using a pseudonym?</a>.', :url => (help_privacy_path+"#real_name").html_safe)) %> + <%= raw(_('<a href="{{url}}">Thinking of using a pseudonym?</a>', :url => (help_privacy_path+"#real_name").html_safe)) %> </p> <% else %> <p> diff --git a/app/views/request/new_bad_contact.html.erb b/app/views/request/new_bad_contact.html.erb index 56f3f4168..f9881b62b 100644 --- a/app/views/request/new_bad_contact.html.erb +++ b/app/views/request/new_bad_contact.html.erb @@ -5,6 +5,6 @@ <p><%= _('Unfortunately, we do not have a working {{info_request_law_used_full}} address for', :info_request_law_used_full => @info_request.law_used_full) %> <%=h @info_request.public_body.name %>. <%= _('You may be able to find one on their website, or by phoning them up and asking. If you manage -to find one, then please <a href="{{help_url}}">send it to us</a>.', :help_url => help_contact_path) %> +to find one, then please <a href="{{help_url}}">send it to us</a>.', :help_url => new_change_request_path(:body => @info_request.public_body.url_name)) %> </p> diff --git a/app/views/request/select_authorities.html.erb b/app/views/request/select_authorities.html.erb index cfbc21a28..861fc6068 100644 --- a/app/views/request/select_authorities.html.erb +++ b/app/views/request/select_authorities.html.erb @@ -74,4 +74,4 @@ </div> </div> </div> -<%= javascript_include_tag 'jquery_ujs.js', 'select-authorities.js' %> +<%= javascript_include_tag 'select-authorities.js' %> diff --git a/app/views/request/show.html.erb b/app/views/request/show.html.erb index 78e022aa9..5862413de 100644 --- a/app/views/request/show.html.erb +++ b/app/views/request/show.html.erb @@ -22,7 +22,7 @@ <% if ( @update_status || @info_request.awaiting_description ) && ! @info_request.is_external? %> - <div class="describe_state_form" id="describe_state_form_1"> + <div class="describe_state_form box" id="describe_state_form_1"> <%= render :partial => 'describe_state', :locals => { :id_suffix => "1" } %> </div> <% end %> @@ -146,7 +146,7 @@ <% end %> <% if @info_request.awaiting_description && ! @info_request.is_external? %> - <div class="describe_state_form" id="describe_state_form_2"> + <div class="describe_state_form box" id="describe_state_form_2"> <%= render :partial => 'describe_state', :locals => { :id_suffix => "2" } %> </div> <% end %> diff --git a/app/views/request_game/play.html.erb b/app/views/request_game/play.html.erb index 471a0e09e..44fe641f9 100644 --- a/app/views/request_game/play.html.erb +++ b/app/views/request_game/play.html.erb @@ -2,7 +2,12 @@ <div id="game_sidebar"> <p style="text-align: center"> - <img width=250 height=125 src="http://chart.apis.google.com/chart?chs=250x125&cht=gom&chd=t:<%=@percentage%>" alt="<%=@percentage%>% of requests have been categorised"> + <%= + image_tag "https://chart.googleapis.com/chart?chs=250x125&cht=gom&chd=t:#{@percentage}", + :size => "250x125", + :alt => "A chart showing #{@percentage}% of requests have been categorised", + :title => "#{@percentage}% of requests have been categorised" + %> <br><%=pluralize(@missing, 'request')%> left to categorise / <%=@total %> total </p> diff --git a/app/views/track/_tracking_links.html.erb b/app/views/track/_tracking_links.html.erb index c027e9732..d94d3be13 100644 --- a/app/views/track/_tracking_links.html.erb +++ b/app/views/track/_tracking_links.html.erb @@ -1,25 +1,23 @@ <% - if @user - existing_track = TrackThing.find_existing(@user, track_thing) - end + existing_track = local_assigns.fetch(:existing_track) do + TrackThing.find_existing(@user, track_thing) if @user + end %> <% if own_request %> - <p><%= _('This is your own request, so you will be automatically emailed when new responses arrive.')%></p> + <p><%= _('This is your own request, so you will be automatically emailed when new responses arrive.')%></p> <% elsif existing_track %> - <p><%= track_thing.params[:verb_on_page_already] %></p> - <div class="feed_link feed_link_<%=location%>"> - <%= link_to _("Unsubscribe"), {:controller => 'track', :action => 'update', :track_id => existing_track.id, :track_medium => "delete", :r => request.fullpath}, :class => "link_button_green" %> - </div> + <p><%= track_thing.params[:verb_on_page_already] %></p> + + <div class="feed_link feed_link_<%= location %>"> + <%= link_to _("Unsubscribe"), { :controller => 'track', :action => 'update', :track_id => existing_track.id, :track_medium => "delete", :r => request.fullpath }, :class => "link_button_green" %> + </div> <% elsif track_thing %> - <div class="feed_link feed_link_<%=location%>"> - <% if defined?(follower_count) && follower_count > 0 %> - <%= link_to _("I like this request"), do_track_path(track_thing), :class => "link_button_green" %> - <% else %> - <%= link_to _("Follow"), do_track_path(track_thing), :class => "link_button_green" %> - <% end %> - </div> + <div class="feed_link feed_link_<%= location %>"> + <% if defined?(follower_count) && follower_count > 0 %> + <%= link_to _("I like this request"), do_track_path(track_thing), :class => "link_button_green" %> + <% else %> + <%= link_to _("Follow"), do_track_path(track_thing), :class => "link_button_green" %> + <% end %> + </div> <% end %> - - - diff --git a/app/views/user/_user_listing_single.html.erb b/app/views/user/_user_listing_single.html.erb index 3cb0d283f..03ac7347b 100644 --- a/app/views/user/_user_listing_single.html.erb +++ b/app/views/user/_user_listing_single.html.erb @@ -17,7 +17,7 @@ end %> <span class="bottomline"> <%= pluralize(display_user.info_requests.size, "request") %> <%= _('made.')%> - <%= pluralize(display_user.visible_comments.size, "annotation") %> <%= _('made.')%> + <%= pluralize(display_user.comments.visible.size, "annotation") %> <%= _('made.')%> <%= _('Joined in')%> <%= display_user.created_at.year %>. </span> diff --git a/app/views/user/set_crop_profile_photo.html.erb b/app/views/user/set_crop_profile_photo.html.erb index 0a22d36dc..7aa8f61a4 100644 --- a/app/views/user/set_crop_profile_photo.html.erb +++ b/app/views/user/set_crop_profile_photo.html.erb @@ -18,7 +18,7 @@ </td> <td> <div style="width:96px;height:96px;overflow:hidden;"> - <img src="<%= get_draft_profile_photo_url(:id => @draft_profile_photo.id) %>" id="profile_photo_preview" /> + <img src="<%= get_draft_profile_photo_url(:id => @draft_profile_photo.id) %>" id="profile_photo_preview" class="jcrop-preview" /> </div> </td> diff --git a/app/views/user/show.html.erb b/app/views/user/show.html.erb index 78b513d6a..a67663389 100644 --- a/app/views/user/show.html.erb +++ b/app/views/user/show.html.erb @@ -173,7 +173,7 @@ <% end %> <% else %> <h2 id="annotations"> - <%= @is_you ? n_('Your {{count}} annotation', 'Your {{count}} annotations', @display_user.visible_comments.size, :count => @display_user.visible_comments.size) : n_("This person's {{count}} annotation", "This person's {{count}} annotations", @display_user.visible_comments.size, :count => @display_user.visible_comments.size) %> + <%= @is_you ? n_('Your {{count}} annotation', 'Your {{count}} annotations', @display_user.comments.visible.size, :count => @display_user.comments.visible.size) : n_("This person's {{count}} annotation", "This person's {{count}} annotations", @display_user.comments.visible.size, :count => @display_user.comments.visible.size) %> <!-- matches_estimated <%=@xapian_comments.matches_estimated%> --> <%= @page_desc %> </h2> @@ -182,7 +182,7 @@ <%= render :partial => 'request/request_listing_via_event', :locals => { :event => result[:model] } %> <% end %> - <%= will_paginate WillPaginate::Collection.new(@page, @per_page, @display_user.visible_comments.size) %> + <%= will_paginate WillPaginate::Collection.new(@page, @per_page, @display_user.comments.visible.size) %> <% end %> <% end %> diff --git a/app/views/widgets/new.html.erb b/app/views/widgets/new.html.erb new file mode 100644 index 000000000..c706155a5 --- /dev/null +++ b/app/views/widgets/new.html.erb @@ -0,0 +1,15 @@ +<h1>Add a widget</h1> + +<p> +To add a widget for <b><%= @info_request.title %></b>, copy and paste the +following code to your web page: +<textarea autofocus readonly rows='4' cols='60' id='widgetbox'> +<iframe src='<%= request_widget_url(@info_request) %>' width='320' height='215' frameborder='0' marginwidth='0' marginheight='0'></iframe> +</textarea> +</p> + +<p> +The widget will look like this: +<br> +<iframe src='<%= request_widget_url(@info_request) %>' width='320' height='215' frameborder='0' marginwidth='0' marginheight='0'></iframe> +</p> diff --git a/app/views/widgets/show.html.erb b/app/views/widgets/show.html.erb new file mode 100644 index 000000000..07c7b1908 --- /dev/null +++ b/app/views/widgets/show.html.erb @@ -0,0 +1,48 @@ +<head> + <%= stylesheet_link_tag "widget" %> +</head> +<body> + <div class="alaveteli-widget"> + <div class="alaveteli-widget__top"> + <div class="alaveteli-widget__left"> + <div class="alaveteli-widget__title"> + <%= link_to @info_request.title, request_path(@info_request), :target => "_top" %> + </div> + <div class="alaveteli-widget__status <%= @status %>"> + <p class="alaveteli-widget__status__status-label">Status</p> + <%= status_description(@info_request, @status) %> + </div> + </div> + <div class="alaveteli-widget__people-count"> + <%= n_('<div class="alaveteli-widget__count">{{count}}</div> person wants to know', '<div class="alaveteli-widget__count">{{count}}</div> people want to know', @count, :count => @count) %> + </div> + </div> + + + <div class="alaveteli-widget__bottom"> + <% if @info_request.user && @info_request.user == @user %> + <div class="alaveteli-widget__button alaveteli-widget__button--down"> + <%= _('This is your request') %> + </div> + <% elsif @existing_track %> + <a href="<%= url_for :controller => 'track', :action => 'update', :track_id => @existing_track.id, :track_medium => "delete", :r => request.fullpath %>"> + <div class="alaveteli-widget__button--down"> + <%= _('You are tracking this request') %> + </div> + </a> + <% else %> + <% if @user %> + <a href="<%= url_for do_track_path(@track_thing) %>" target="_blank"> + <div class="alaveteli-widget__button"> + <%= _('I also want to know!') %> + </div> + </a> + <% else %> + <%= form_tag request_widget_url(@info_request), :method => 'put', :target => '_blank' do %> + <%= submit_tag _('I also want to know!'), :class => 'alaveteli-widget__button' %> + <% end %> + <% end %> + <% end %> + </div> + </div> +</body> diff --git a/commonlib b/commonlib -Subproject 2a0271d3a6aaba9c429261b8c94e0e7acb6bd68 +Subproject dcc2e223ae1f76ed7db80b45ea12297e01bf5d4 diff --git a/config/.cvsignore b/config/.cvsignore deleted file mode 100644 index 2539dd3cd..000000000 --- a/config/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -general -database.yml -rails_env.rb diff --git a/config/alert-tracks-debian.ugly b/config/alert-tracks-debian.example index f1ca68b03..ac4a55c8f 100755 --- a/config/alert-tracks-debian.ugly +++ b/config/alert-tracks-debian.example @@ -24,6 +24,10 @@ DUSER=!!(*= $user *)!! # RAILS_ENV=your_rails_env # export RAILS_ENV +# Uncomment the following line if running under rbenv - we want this daemon to run +# in the context of the ruby version defined for the site +# PATH=/home/!!(*= $user *)!!/.rbenv/shims:/usr/local/bin:/usr/bin:/bin + trap "" 1 export PIDFILE LOGFILE @@ -41,7 +45,7 @@ start_daemon() { } stop_daemon() { - /sbin/start-stop-daemon --stop --oknodo --pidfile "$PIDFILE" + /sbin/start-stop-daemon --stop --oknodo --retry 5 --pidfile "$PIDFILE" } restart() { stop; start; } diff --git a/config/application.rb b/config/application.rb index 3c01e26c4..89b625cb4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path('../boot', __FILE__) require 'rails/all' @@ -60,7 +61,8 @@ module Alaveteli config.time_zone = ::AlaveteliConfiguration::time_zone # Set the cache to use a memcached backend - config.cache_store = :mem_cache_store, { :namespace => AlaveteliConfiguration::domain } + config.cache_store = :mem_cache_store, + { :namespace => "#{AlaveteliConfiguration::domain}_#{RUBY_VERSION}" } config.action_dispatch.rack_cache = nil config.after_initialize do |app| @@ -69,6 +71,7 @@ module Alaveteli app.routes.append{ match '*path', :to => 'general#not_found' } end + config.autoload_paths << "#{Rails.root.to_s}/app/models/concerns" config.autoload_paths << "#{Rails.root.to_s}/lib/mail_handler" config.autoload_paths << "#{Rails.root.to_s}/lib/attachment_to_html" config.autoload_paths << "#{Rails.root.to_s}/lib/health_checks" @@ -81,6 +84,11 @@ module Alaveteli require "#{Rails.root}/lib/whatdotheyknow/strip_empty_sessions" config.middleware.insert_before ::ActionDispatch::Cookies, WhatDoTheyKnow::StripEmptySessions, :key => '_wdtk_cookie_session', :path => "/", :httponly => true + # Strip non-UTF-8 request parameters + if RUBY_VERSION == '1.9.3' + config.middleware.insert 0, Rack::UTF8Sanitizer + end + # Allow the generation of full URLs in emails config.action_mailer.default_url_options = { :host => AlaveteliConfiguration::domain } if AlaveteliConfiguration::force_ssl @@ -105,10 +113,9 @@ module Alaveteli 'fancybox.js'] # ... while these are individual files that can't easily be # grouped: - config.assets.precompile += ['jquery.Jcrop.css', + config.assets.precompile += ['jquery.Jcrop.min.css', 'excanvas.min.js', 'select-authorities.js', - 'jquery_ujs.js', 'new-request.js', 'fonts.css', 'print.css', @@ -116,6 +123,7 @@ module Alaveteli 'ie6.css', 'ie7.css', 'bootstrap-dropdown.js', + 'widget.css', 'responsive/print.css', 'responsive/application-lte-ie7.css', 'responsive/application-ie8.css'] diff --git a/config/boot.rb b/config/boot.rb index a810be358..25da6546e 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'rubygems' # Set up gems listed in the Gemfile. diff --git a/config/crontab-example b/config/crontab-example index f65555b11..a83f418fa 100644 --- a/config/crontab-example +++ b/config/crontab-example @@ -5,6 +5,10 @@ # Email: hello@mysociety.org. WWW: http://www.mysociety.org/ PATH=/usr/local/bin:/usr/bin:/bin +# Uncomment the following line if running under rbenv - we want this cron to run +# in the context of the ruby version defined for the site +# PATH=/home/!!(*= $user *)!!/.rbenv/shims:/usr/local/bin:/usr/bin:/bin + MAILTO=!!(*= $mailto *)!! # Every 5 minutes @@ -16,9 +20,7 @@ MAILTO=!!(*= $mailto *)!! # Once an hour 09 * * * * !!(*= $user *)!! !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/commonlib/bin/run-with-lockfile.sh -n !!(*= $vhost_dir *)!!/alert-comment-on-request.lock !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/script/alert-comment-on-request || echo "stalled?" - -# Only root can read the log files -31 * * * * root !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/commonlib/bin/run-with-lockfile.sh -n !!(*= $vhost_dir *)!!/load-mail-server-logs.lock !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/script/load-mail-server-logs || echo "stalled?" +31 * * * * !!(*= $user *)!! !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/commonlib/bin/run-with-lockfile.sh -n !!(*= $vhost_dir *)!!/load-mail-server-logs.lock !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/script/load-mail-server-logs || echo "stalled?" # Once a day, early morning 31 1 * * * !!(*= $user *)!! !!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/commonlib/bin/run-with-lockfile.sh -n !!(*= $vhost_dir *)!!/change-xapian-database.lock "!!(*= $vhost_dir *)!!/!!(*= $vcspath *)!!/script/compact-xapian-database production !!(*= $site *)!!" || echo "stalled?" diff --git a/config/deploy.rb b/config/deploy.rb index f4a0b536a..6998b3ed7 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'bundler/capistrano' set :stage, 'staging' unless exists? :stage @@ -58,6 +59,7 @@ namespace :deploy do "#{release_path}/log" => "#{shared_path}/log", "#{release_path}/tmp/pids" => "#{shared_path}/tmp/pids", "#{release_path}/lib/acts_as_xapian/xapiandbs" => "#{shared_path}/xapiandbs", + "#{release_path}/lib/themes" => "#{shared_path}/themes", } # "ln -sf <a> <b>" creates a symbolic link but deletes <b> if it already exists @@ -70,6 +72,7 @@ namespace :deploy do run "mkdir -p #{shared_path}/log" run "mkdir -p #{shared_path}/tmp/pids" run "mkdir -p #{shared_path}/xapiandbs" + run "mkdir -p #{shared_path}/themes" end end diff --git a/config/environment.rb b/config/environment.rb index 196680b23..ca436cc29 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Load the rails application require File.expand_path('../application', __FILE__) diff --git a/config/environments/development.rb b/config/environments/development.rb index dbf8d7b2a..39bd98da1 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- Alaveteli::Application.configure do # Settings specified here will take precedence over those in config/environment.rb @@ -46,4 +47,12 @@ Alaveteli::Application.configure do # with SQLite, MySQL, and PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5 + if AlaveteliConfiguration.use_bullet_in_development + config.after_initialize do + Bullet.enable = true + Bullet.bullet_logger = true + Bullet.console = true + Bullet.add_footer = true + end + end end diff --git a/config/environments/production.rb b/config/environments/production.rb index a3e3cebd2..bc5b724d0 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- Alaveteli::Application.configure do # Settings specified here will take precedence over those in config/environment.rb @@ -17,7 +18,20 @@ Alaveteli::Application.configure do # Disable delivery errors, bad email addresses will be ignored # config.action_mailer.raise_delivery_errors = false - config.action_mailer.delivery_method = :sendmail # so is queued, rather than giving immediate errors + + config.action_mailer.delivery_method = AlaveteliConfiguration::production_mailer_delivery_method.to_sym + + if AlaveteliConfiguration::production_mailer_delivery_method.to_sym == :smtp + config.action_mailer.smtp_settings = { + :address => AlaveteliConfiguration::smtp_mailer_address, + :port => AlaveteliConfiguration.smtp_mailer_port, + :domain => AlaveteliConfiguration.smtp_mailer_domain, + :user_name => AlaveteliConfiguration.smtp_mailer_user_name, + :password => AlaveteliConfiguration.smtp_mailer_password, + :authentication => AlaveteliConfiguration.smtp_mailer_authentication, + :enable_starttls_auto => AlaveteliConfiguration.smtp_mailer_enable_starttls_auto + } + end config.active_support.deprecation = :notify diff --git a/config/environments/staging.rb b/config/environments/staging.rb index 0bb0db71a..0d791e03e 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- Alaveteli::Application.configure do # Settings specified here will take precedence over those in config/environment.rb diff --git a/config/environments/test.rb b/config/environments/test.rb index 97c2d4f7c..483a4874f 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- Alaveteli::Application.configure do # Settings specified here will take precedence over those in config/environment.rb diff --git a/config/general.yml-example b/config/general.yml-example index 8acea374b..a6980b71c 100644 --- a/config/general.yml-example +++ b/config/general.yml-example @@ -673,6 +673,14 @@ PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE: false # --- USE_MAILCATCHER_IN_DEVELOPMENT: true +# Bullet is a tool to help to kill N+1 queries and unused eager loading +# https://github.com/flyerhzm/bullet +# +# USE_BULLET_IN_DEVELOPMENT - Boolean (default: false) +# +# --- +USE_BULLET_IN_DEVELOPMENT: false + # Use memcached to cache HTML fragments for better performance. This will # only have an effect in environments where # config.action_controller.perform_caching is set to true @@ -775,3 +783,38 @@ ALLOW_BATCH_REQUESTS: false # # --- RESPONSIVE_STYLING: true + +# Define the mailer delivery method to be used only in the production environment. +# By default, use sendmail. +# +# The list of accepted options are available in the Rails ActionMailer configuration +# documentation: http://guides.rubyonrails.org/action_mailer_basics.html#example-action-mailer-configuration +# +# The most common alternative is to use 'smtp' +# If you choose to use an external SMTP service then you will need to also include the SMTP configuration settings. +# +# As a string this is coerced into a symbol in config/environments/production.rb +# +# PRODUCTION_MAILER_DELIVERY_METHOD - String (default: sendmail) +# +# Examples: +# +# PRODUCTION_MAILER_DELIVERY_METHOD: smtp +# SMTP_MAILER_ADDRESS: smtp.gmail.com +# SMTP_MAILER_PORT: 587 +# SMTP_MAILER_DOMAIN: example.com +# SMTP_MAILER_USER_NAME: jane322 +# SMTP_MAILER_PASSWORD: supersecretpassword +# SMTP_MAILER_AUTHENTICATION: 'plain' +# SMTP_MAILER_ENABLE_STARTTLS_AUTO: true +# --- +PRODUCTION_MAILER_DELIVERY_METHOD: sendmail + +# If ENABLE_WIDGETS is set to true, Alaveteli will allow the embedding of a +# 'widget' linking to a request on other sites. This widget will record +# how many people click on an 'I also want to know' button. +# +# ENABLE_WIDGETS - Boolean (default: false) +# +# --- +ENABLE_WIDGETS: false diff --git a/config/httpd.conf-example b/config/httpd.conf-example index 00722fbdf..f70068481 100644 --- a/config/httpd.conf-example +++ b/config/httpd.conf-example @@ -25,6 +25,10 @@ PassengerAppRoot /var/www/alaveteli PassengerResolveSymlinksInDocumentRoot on + # Uncomment the following line if you want to run Alaveteli + # with the ruby set by rbenv + # PassengerRuby /home/alaveteli/.rbenv/shims/ruby + # See http://blog.phusion.nl/2013/03/12/tuning-phusion-passengers-concurrency-settings/ # and http://blog.scoutapp.com/articles/2009/12/08/production-rails-tuning-with-passenger-passengermaxprocesses # for more information on tuning Passenger diff --git a/config/initializers/acts_as_xapian.rb b/config/initializers/acts_as_xapian.rb index f82193c85..56eb75ed3 100644 --- a/config/initializers/acts_as_xapian.rb +++ b/config/initializers/acts_as_xapian.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # acts_as_xapian/init.rb: # # Copyright (c) 2008 UK Citizens Online Democracy. All rights reserved. diff --git a/config/initializers/alaveteli.rb b/config/initializers/alaveteli.rb index 7c3f9192b..1a35dc5ee 100644 --- a/config/initializers/alaveteli.rb +++ b/config/initializers/alaveteli.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # MySociety specific helper functions $:.push(File.join(File.dirname(__FILE__), '../../commonlib/rblib')) # ... if these fail to include, you need the commonlib submodule from git @@ -35,7 +36,6 @@ end # Load monkey patches and other things from lib/ -require 'ruby19.rb' require 'activesupport_cache_extensions.rb' require 'use_spans_for_errors.rb' require 'activerecord_errors_extensions.rb' diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 59385cdf3..b5e9a55a2 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. diff --git a/config/initializers/fast_gettext.rb b/config/initializers/fast_gettext.rb index b00524993..c7fcc480b 100644 --- a/config/initializers/fast_gettext.rb +++ b/config/initializers/fast_gettext.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- AlaveteliLocalization.set_default_text_domain('app', File.join(Rails.root, 'locale')) I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) diff --git a/config/initializers/gettext_i18n_rails.rb b/config/initializers/gettext_i18n_rails.rb index ef306682b..3beb2e58b 100644 --- a/config/initializers/gettext_i18n_rails.rb +++ b/config/initializers/gettext_i18n_rails.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # FIXME: Audit the translations for XSS opportunities. Ultimately it would be # good to get rid of this and explicitly mark strings as html_safe GettextI18nRails.translations_are_html_safe = true diff --git a/config/initializers/has_tag_string.rb b/config/initializers/has_tag_string.rb index 5fa33cc70..c9f66414f 100644 --- a/config/initializers/has_tag_string.rb +++ b/config/initializers/has_tag_string.rb @@ -1,2 +1,3 @@ +# -*- encoding : utf-8 -*- require 'has_tag_string/has_tag_string' diff --git a/config/initializers/health_checks.rb b/config/initializers/health_checks.rb index 7fd1d3dda..f85b7b272 100644 --- a/config/initializers/health_checks.rb +++ b/config/initializers/health_checks.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- Rails.application.config.after_initialize do user_last_created = HealthChecks::Checks::DaysAgoCheck.new( :failure_message => _('The last user was created over a day ago'), diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 9e8b0131f..e3c680d36 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Be sure to restart your server when you modify this file. # Add new inflection rules using the following format diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 72aca7e44..9070e0caa 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Be sure to restart your server when you modify this file. # Add new mime types for use in respond_to blocks: diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index d120b94ae..78b86f92c 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Be sure to restart your server when you modify this file. # Your secret key for verifying the integrity of signed cookies. diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb index 99730e6b2..af476c78c 100644 --- a/config/initializers/secure_headers.rb +++ b/config/initializers/secure_headers.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- ::SecureHeaders::Configuration.configure do |config| # https://tools.ietf.org/html/rfc6797 diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index ca283d4e0..c582ebc87 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,2 +1,3 @@ +# -*- encoding : utf-8 -*- # Be sure to restart your server when you modify this file. Rails.application.config.session_store :cookie_store, :key => '_wdtk_cookie_session' diff --git a/config/initializers/strip_attributes.rb b/config/initializers/strip_attributes.rb index 25f70b2f3..2bdc17f21 100644 --- a/config/initializers/strip_attributes.rb +++ b/config/initializers/strip_attributes.rb @@ -1,2 +1,3 @@ +# -*- encoding : utf-8 -*- require 'strip_attributes/strip_attributes' ActiveRecord::Base.extend(StripAttributes) diff --git a/config/initializers/theme_loader.rb b/config/initializers/theme_loader.rb index 9c79e513c..cdc34fe31 100644 --- a/config/initializers/theme_loader.rb +++ b/config/initializers/theme_loader.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # This is a global array of route extensions. Alaveteli modules may add to it. # It is used by our config/routes.rb to decide which route extension files to load. $alaveteli_route_extensions = [] diff --git a/config/initializers/xml.rb b/config/initializers/xml.rb new file mode 100644 index 000000000..aefd54214 --- /dev/null +++ b/config/initializers/xml.rb @@ -0,0 +1,2 @@ +ActiveSupport::XmlMini.backend = 'Nokogiri' + diff --git a/config/packages b/config/packages index a6eeb8079..7ed6579ee 100644 --- a/config/packages +++ b/config/packages @@ -31,7 +31,6 @@ ruby ruby1.8 ruby1.8-dev rubygems (>= 1.8.15) -sharutils sqlite3 tnef (>= 1.4.5) ttf-bitstream-vera diff --git a/config/packages.debian-squeeze b/config/packages.debian-squeeze index c34abefde..082f2162b 100644 --- a/config/packages.debian-squeeze +++ b/config/packages.debian-squeeze @@ -29,7 +29,6 @@ ruby ruby1.8 ruby1.8-dev rubygems/squeeze-backports -sharutils sqlite3 tnef ttf-bitstream-vera diff --git a/config/packages.debian-wheezy b/config/packages.debian-wheezy index 4129aa930..3740cd1da 100644 --- a/config/packages.debian-wheezy +++ b/config/packages.debian-wheezy @@ -25,7 +25,6 @@ rake ruby-dev ruby1.9.3 rubygems -sharutils sqlite3 tnef unrtf @@ -35,3 +34,4 @@ wkhtmltopdf-static wv xapian-tools xlhtml +ttf-bitstream-vera diff --git a/config/packages.ubuntu-precise b/config/packages.ubuntu-precise index d97579bc1..d1aa0b670 100644 --- a/config/packages.ubuntu-precise +++ b/config/packages.ubuntu-precise @@ -24,7 +24,6 @@ ruby-bundler ruby1.9.1 ruby1.9.1-dev rubygems -sharutils sqlite3 tnef ttf-bitstream-vera diff --git a/config/packages_development b/config/packages_development index 14ca815a2..d8522ccef 100644 --- a/config/packages_development +++ b/config/packages_development @@ -6,4 +6,4 @@ # # To install, paste this list after `sudo apt-get install` and run. -postgresql sharutils pdftk elinks php5-cli tnef python-yaml +postgresql pdftk elinks php5-cli tnef python-yaml diff --git a/config/preinitializer.rb b/config/preinitializer.rb index 3ad02415d..71112a28e 100644 --- a/config/preinitializer.rb +++ b/config/preinitializer.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- begin require "rubygems" require "bundler" diff --git a/config/purge-varnish-debian.ugly b/config/purge-varnish-debian.example index dc3f74ff6..779266d2d 100755 --- a/config/purge-varnish-debian.ugly +++ b/config/purge-varnish-debian.example @@ -24,6 +24,10 @@ DUSER=!!(*= $user *)!! # RAILS_ENV=your_rails_env # export RAILS_ENV +# Uncomment the following line if running under rbenv - we want this daemon to run +# in the context of the ruby version defined for the site +# PATH=/home/!!(*= $user *)!!/.rbenv/shims:/usr/local/bin:/usr/bin:/bin + type varnishadm > /dev/null 2>&1 || exit trap "" 1 @@ -43,7 +47,7 @@ start_daemon() { } stop_daemon() { - /sbin/start-stop-daemon --stop --oknodo --pidfile "$PIDFILE" + /sbin/start-stop-daemon --stop --oknodo --retry 5 --pidfile "$PIDFILE" } restart() { stop; start; } diff --git a/config/routes.rb b/config/routes.rb index c975d6007..ba378119e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- # config/routes.rb: # Mapping URLs to controllers for FOIFA. # @@ -65,6 +65,7 @@ Alaveteli::Application.routes.draw do resources :request, :only => [] do resource :report, :only => [:new, :create] + resource :widget, :only => [:new, :show, :update] end resources :info_request_batch, :only => :show @@ -142,6 +143,7 @@ Alaveteli::Application.routes.draw do match '/track/update/:track_id' => 'track#update', :as => :update match '/track/delete_all_type' => 'track#delete_all_type', :as => :delete_all_type match '/track/feed/:track_id' => 'track#atom_feed', :as => :atom_feed + match '/track/widget_vote/:info_request_id' => 'track#widget_vote', :as => :widget_vote #### #### Help controller diff --git a/config/run-with-rbenv-path.example b/config/run-with-rbenv-path.example new file mode 100644 index 000000000..25dec9b60 --- /dev/null +++ b/config/run-with-rbenv-path.example @@ -0,0 +1,8 @@ +#!/bin/bash + +# We want this script to run in the context of the ruby version defined for the site +PATH=/home/!!(*= $user *)!!/.rbenv/shims:$PATH + +source "$1" + +exit $? diff --git a/config/sysvinit-passenger.ugly b/config/sysvinit-passenger.example index 0940a4d63..0940a4d63 100755 --- a/config/sysvinit-passenger.ugly +++ b/config/sysvinit-passenger.example diff --git a/config/sysvinit-thin.ugly b/config/sysvinit-thin.example index 0155ff8c3..0155ff8c3 100755 --- a/config/sysvinit-thin.ugly +++ b/config/sysvinit-thin.example diff --git a/config/varnish-alaveteli.vcl b/config/varnish-alaveteli.vcl index d3726682c..59d76b0d1 100644 --- a/config/varnish-alaveteli.vcl +++ b/config/varnish-alaveteli.vcl @@ -2,10 +2,10 @@ # of Alaveteli. See the vcl(7) man page for details on VCL syntax and # semantics. -# +# # Default backend definition. Set this to point to your content # server. In this case, apache + Passenger running on port 80 -# +# backend default { .host = "127.0.0.1"; @@ -32,7 +32,7 @@ sub vcl_recv { # Sanitise X-Forwarded-For... remove req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; - + # Remove Google Analytics, has_js, and last-seen cookies set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js|has_seen_country_message|seen_foi2)=[^;]*", ""); @@ -50,14 +50,14 @@ sub vcl_recv { remove req.http.Accept-Encoding; } } - + # Ignore empty cookies if (req.http.Cookie ~ "^\s*$") { remove req.http.Cookie; } - + if (req.request != "GET" && - req.request != "HEAD" && + req.request != "HEAD" && req.request != "POST" && req.request != "PUT" && req.request != "PURGE" && @@ -70,9 +70,9 @@ sub vcl_recv { /* We only deal with GET and HEAD by default, the rest get passed direct to backend */ return (pass); } - + # Ignore Cookies on images... - if (req.url ~ "\.(png|gif|jpg|jpeg|swf|css|js|rdf|ico|txt)(\?.*|)$") { + if (req.url ~ "\.(png|gif|jpg|jpeg|swf|css|js|rdf|ico)(\?.*|)$") { remove req.http.Cookie; return (lookup); } diff --git a/db/migrate/001_create_users.rb b/db/migrate/001_create_users.rb index ba528c038..4181a37d4 100644 --- a/db/migrate/001_create_users.rb +++ b/db/migrate/001_create_users.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| diff --git a/db/migrate/002_add_sessions.rb b/db/migrate/002_add_sessions.rb index 22b4a0065..571321683 100644 --- a/db/migrate/002_add_sessions.rb +++ b/db/migrate/002_add_sessions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddSessions < ActiveRecord::Migration def self.up create_table :sessions do |t| diff --git a/db/migrate/004_create_info_requests.rb b/db/migrate/004_create_info_requests.rb index 29a3a9f22..7de918c3f 100644 --- a/db/migrate/004_create_info_requests.rb +++ b/db/migrate/004_create_info_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateInfoRequests < ActiveRecord::Migration def self.up create_table :info_requests do |t| diff --git a/db/migrate/005_create_public_bodies.rb b/db/migrate/005_create_public_bodies.rb index d37def301..9d51e4942 100644 --- a/db/migrate/005_create_public_bodies.rb +++ b/db/migrate/005_create_public_bodies.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreatePublicBodies < ActiveRecord::Migration def self.up create_table :public_bodies do |t| diff --git a/db/migrate/006_version_public_body.rb b/db/migrate/006_version_public_body.rb index 0e4527133..3656f738f 100644 --- a/db/migrate/006_version_public_body.rb +++ b/db/migrate/006_version_public_body.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class VersionPublicBody < ActiveRecord::Migration def self.up PublicBody.create_versioned_table diff --git a/db/migrate/007_add_public_body_editor_notes.rb b/db/migrate/007_add_public_body_editor_notes.rb index 7500ee649..d07e02b2e 100644 --- a/db/migrate/007_add_public_body_editor_notes.rb +++ b/db/migrate/007_add_public_body_editor_notes.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddPublicBodyEditorNotes < ActiveRecord::Migration def self.up add_column :public_bodies, :last_edit_editor, :string diff --git a/db/migrate/008_request_has_public_body.rb b/db/migrate/008_request_has_public_body.rb index c7a2e9f34..95fa2731a 100644 --- a/db/migrate/008_request_has_public_body.rb +++ b/db/migrate/008_request_has_public_body.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RequestHasPublicBody < ActiveRecord::Migration def self.up add_column :info_requests, :public_body_id, :integer diff --git a/db/migrate/009_create_outgoing_messages.rb b/db/migrate/009_create_outgoing_messages.rb index 62bf25392..a36d37cf2 100644 --- a/db/migrate/009_create_outgoing_messages.rb +++ b/db/migrate/009_create_outgoing_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateOutgoingMessages < ActiveRecord::Migration def self.up create_table :outgoing_messages do |t| diff --git a/db/migrate/010_remove_public_body_id_from_outgoing_messages.rb b/db/migrate/010_remove_public_body_id_from_outgoing_messages.rb index da5ffc87e..5599d6131 100644 --- a/db/migrate/010_remove_public_body_id_from_outgoing_messages.rb +++ b/db/migrate/010_remove_public_body_id_from_outgoing_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemovePublicBodyIdFromOutgoingMessages < ActiveRecord::Migration def self.up remove_column :outgoing_messages, :public_body_id diff --git a/db/migrate/011_add_created_updated_fields.rb b/db/migrate/011_add_created_updated_fields.rb index 47bb27b78..0152ec842 100644 --- a/db/migrate/011_add_created_updated_fields.rb +++ b/db/migrate/011_add_created_updated_fields.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCreatedUpdatedFields < ActiveRecord::Migration def self.up # InfoRequest diff --git a/db/migrate/012_add_sent_outgoing_message.rb b/db/migrate/012_add_sent_outgoing_message.rb index 8b3059347..c7b42951c 100644 --- a/db/migrate/012_add_sent_outgoing_message.rb +++ b/db/migrate/012_add_sent_outgoing_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddSentOutgoingMessage < ActiveRecord::Migration def self.up add_column :outgoing_messages, :sent_at, :datetime diff --git a/db/migrate/013_create_incoming_messages.rb b/db/migrate/013_create_incoming_messages.rb index c747fcb8c..bd7dc20cd 100644 --- a/db/migrate/013_create_incoming_messages.rb +++ b/db/migrate/013_create_incoming_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateIncomingMessages < ActiveRecord::Migration def self.up create_table :incoming_messages do |t| diff --git a/db/migrate/014_create_post_redirects.rb b/db/migrate/014_create_post_redirects.rb index 26c561dac..1f5c8f146 100644 --- a/db/migrate/014_create_post_redirects.rb +++ b/db/migrate/014_create_post_redirects.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreatePostRedirects < ActiveRecord::Migration def self.up create_table :post_redirects do |t| diff --git a/db/migrate/015_add_email_token_to_post_redirects.rb b/db/migrate/015_add_email_token_to_post_redirects.rb index 47d070533..991df8cfd 100644 --- a/db/migrate/015_add_email_token_to_post_redirects.rb +++ b/db/migrate/015_add_email_token_to_post_redirects.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddEmailTokenToPostRedirects < ActiveRecord::Migration def self.up add_column :post_redirects, :email_token, :text diff --git a/db/migrate/016_add_reasons_to_post_redirects.rb b/db/migrate/016_add_reasons_to_post_redirects.rb index 622e1173b..e0d4af5e3 100644 --- a/db/migrate/016_add_reasons_to_post_redirects.rb +++ b/db/migrate/016_add_reasons_to_post_redirects.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddReasonsToPostRedirects < ActiveRecord::Migration def self.up add_column :post_redirects, :reason_params_yaml, :text diff --git a/db/migrate/017_add_email_confirmed_to_users.rb b/db/migrate/017_add_email_confirmed_to_users.rb index b552e853e..56b3dacb4 100644 --- a/db/migrate/017_add_email_confirmed_to_users.rb +++ b/db/migrate/017_add_email_confirmed_to_users.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddEmailConfirmedToUsers < ActiveRecord::Migration def self.up add_column :users, :email_confirmed, :boolean, :default => false diff --git a/db/migrate/018_add_response_type_to_incoming_message.rb b/db/migrate/018_add_response_type_to_incoming_message.rb index c841b599a..8ef2c7dd4 100644 --- a/db/migrate/018_add_response_type_to_incoming_message.rb +++ b/db/migrate/018_add_response_type_to_incoming_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddResponseTypeToIncomingMessage < ActiveRecord::Migration def self.up add_column :incoming_messages, :user_classified, :boolean, :default => false diff --git a/db/migrate/021_remove_contains_information_default.rb b/db/migrate/021_remove_contains_information_default.rb index 9969cbc2c..a50e06299 100644 --- a/db/migrate/021_remove_contains_information_default.rb +++ b/db/migrate/021_remove_contains_information_default.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveContainsInformationDefault < ActiveRecord::Migration def self.up change_column :incoming_messages, :contains_information, :boolean, :default => nil diff --git a/db/migrate/022_create_info_request_events.rb b/db/migrate/022_create_info_request_events.rb index 858444298..3efc69ccf 100644 --- a/db/migrate/022_create_info_request_events.rb +++ b/db/migrate/022_create_info_request_events.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateInfoRequestEvents < ActiveRecord::Migration def self.up create_table :info_request_events do |t| diff --git a/db/migrate/023_outgoing_message_last_sent_at.rb b/db/migrate/023_outgoing_message_last_sent_at.rb index 24cb55257..2a2fd4eac 100644 --- a/db/migrate/023_outgoing_message_last_sent_at.rb +++ b/db/migrate/023_outgoing_message_last_sent_at.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class OutgoingMessageLastSentAt < ActiveRecord::Migration def self.up rename_column(:outgoing_messages, :sent_at, :last_sent_at) diff --git a/db/migrate/024_add_is_bounce_to_incoming_messages.rb b/db/migrate/024_add_is_bounce_to_incoming_messages.rb index f81ff4401..54ac6d334 100644 --- a/db/migrate/024_add_is_bounce_to_incoming_messages.rb +++ b/db/migrate/024_add_is_bounce_to_incoming_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIsBounceToIncomingMessages < ActiveRecord::Migration def self.up add_column :incoming_messages, :is_bounce, :boolean, :default => false diff --git a/db/migrate/025_add_followup_to_outgoing_message.rb b/db/migrate/025_add_followup_to_outgoing_message.rb index d3bd7444c..2e50ced27 100644 --- a/db/migrate/025_add_followup_to_outgoing_message.rb +++ b/db/migrate/025_add_followup_to_outgoing_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddFollowupToOutgoingMessage < ActiveRecord::Migration def self.up add_column :outgoing_messages, :incoming_message_followup_id, :integer diff --git a/db/migrate/026_add_many_null_constraints.rb b/db/migrate/026_add_many_null_constraints.rb index 7abd2e8f2..8ff01fe1f 100644 --- a/db/migrate/026_add_many_null_constraints.rb +++ b/db/migrate/026_add_many_null_constraints.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddManyNullConstraints < ActiveRecord::Migration def self.up change_column :users, :email, :string, :null => false diff --git a/db/migrate/027_change_classification_system.rb b/db/migrate/027_change_classification_system.rb index d9e6ad844..d1f68500a 100644 --- a/db/migrate/027_change_classification_system.rb +++ b/db/migrate/027_change_classification_system.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ChangeClassificationSystem < ActiveRecord::Migration def self.up remove_column :incoming_messages, :contains_information diff --git a/db/migrate/028_give_incoming_messages_events.rb b/db/migrate/028_give_incoming_messages_events.rb index 46acd831e..f2f5e7706 100644 --- a/db/migrate/028_give_incoming_messages_events.rb +++ b/db/migrate/028_give_incoming_messages_events.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # TODO: If this one fails with errors about described_state on save, then you need # to temporarily modify the model for InfoRequestEvents to remove this part: # validates_inclusion_of :described_state, :in => [ diff --git a/db/migrate/029_add_describe_status_history.rb b/db/migrate/029_add_describe_status_history.rb index 0c6095d69..8b448284c 100644 --- a/db/migrate/029_add_describe_status_history.rb +++ b/db/migrate/029_add_describe_status_history.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddDescribeStatusHistory < ActiveRecord::Migration def self.up add_column :info_request_events, :described_state, :string diff --git a/db/migrate/030_add_some_indices.rb b/db/migrate/030_add_some_indices.rb index 066fc29cb..0c58617e9 100644 --- a/db/migrate/030_add_some_indices.rb +++ b/db/migrate/030_add_some_indices.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddSomeIndices < ActiveRecord::Migration def self.up if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" diff --git a/db/migrate/031_add_indices_for_session_deletion.rb b/db/migrate/031_add_indices_for_session_deletion.rb index 9a6f6b326..2a263fece 100644 --- a/db/migrate/031_add_indices_for_session_deletion.rb +++ b/db/migrate/031_add_indices_for_session_deletion.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIndicesForSessionDeletion < ActiveRecord::Migration def self.up add_index :post_redirects, :updated_at diff --git a/db/migrate/032_addforeignkeys.rb b/db/migrate/032_addforeignkeys.rb index f8d8f8b0d..5cff3b9d0 100644 --- a/db/migrate/032_addforeignkeys.rb +++ b/db/migrate/032_addforeignkeys.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class Addforeignkeys < ActiveRecord::Migration def self.up if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" diff --git a/db/migrate/033_add_prominence.rb b/db/migrate/033_add_prominence.rb index 15d548f37..e192044b2 100644 --- a/db/migrate/033_add_prominence.rb +++ b/db/migrate/033_add_prominence.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddProminence < ActiveRecord::Migration def self.up add_column :info_requests, :prominence, :string, :null => false, :default => 'normal' diff --git a/db/migrate/034_run_solr_indexing.rb b/db/migrate/034_run_solr_indexing.rb index 3cdfdbde9..c48fd4702 100644 --- a/db/migrate/034_run_solr_indexing.rb +++ b/db/migrate/034_run_solr_indexing.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RunSolrIndexing < ActiveRecord::Migration def self.up # Not using SOLR yet after all diff --git a/db/migrate/035_track_overdue_alerts.rb b/db/migrate/035_track_overdue_alerts.rb index 7ef164271..48dc23e7d 100644 --- a/db/migrate/035_track_overdue_alerts.rb +++ b/db/migrate/035_track_overdue_alerts.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class TrackOverdueAlerts < ActiveRecord::Migration def self.up create_table :user_info_request_sent_alerts do |t| diff --git a/db/migrate/036_add_public_body_tags.rb b/db/migrate/036_add_public_body_tags.rb index f7fefdf48..523b7a05b 100644 --- a/db/migrate/036_add_public_body_tags.rb +++ b/db/migrate/036_add_public_body_tags.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddPublicBodyTags < ActiveRecord::Migration def self.up create_table :public_body_tags do |t| diff --git a/db/migrate/037_add_url_name.rb b/db/migrate/037_add_url_name.rb index 84aad9cc8..b1141e176 100644 --- a/db/migrate/037_add_url_name.rb +++ b/db/migrate/037_add_url_name.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddUrlName < ActiveRecord::Migration def self.up add_column :public_bodies, :url_name, :text diff --git a/db/migrate/038_add_more_url_names.rb b/db/migrate/038_add_more_url_names.rb index 9798f4b4b..568610417 100644 --- a/db/migrate/038_add_more_url_names.rb +++ b/db/migrate/038_add_more_url_names.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddMoreUrlNames < ActiveRecord::Migration def self.up add_column :users, :url_name, :text diff --git a/db/migrate/039_request_url_names.rb b/db/migrate/039_request_url_names.rb index 5227b887a..999e7c290 100644 --- a/db/migrate/039_request_url_names.rb +++ b/db/migrate/039_request_url_names.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RequestUrlNames < ActiveRecord::Migration def self.up add_column :info_requests, :url_title, :text diff --git a/db/migrate/040_email_is_unique.rb b/db/migrate/040_email_is_unique.rb index c61362de2..aba1ef28d 100644 --- a/db/migrate/040_email_is_unique.rb +++ b/db/migrate/040_email_is_unique.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class EmailIsUnique < ActiveRecord::Migration def self.up if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" diff --git a/db/migrate/041_index_requests_with_solr.rb b/db/migrate/041_index_requests_with_solr.rb index f18b947a6..8b95e6604 100644 --- a/db/migrate/041_index_requests_with_solr.rb +++ b/db/migrate/041_index_requests_with_solr.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class IndexRequestsWithSolr < ActiveRecord::Migration def self.up add_column :info_requests, :solr_up_to_date, :boolean, :default => false, :null => false diff --git a/db/migrate/042_unique_user_urls.rb b/db/migrate/042_unique_user_urls.rb index 45e4fd11d..39a7a4849 100644 --- a/db/migrate/042_unique_user_urls.rb +++ b/db/migrate/042_unique_user_urls.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class UniqueUserUrls < ActiveRecord::Migration def self.up # do last registered ones first, so the last ones get rubbish URLs diff --git a/db/migrate/043_remove_complaint_email.rb b/db/migrate/043_remove_complaint_email.rb index cc03f6507..7c57ce2fc 100644 --- a/db/migrate/043_remove_complaint_email.rb +++ b/db/migrate/043_remove_complaint_email.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveComplaintEmail < ActiveRecord::Migration def self.up remove_column :public_body_versions, :complaint_email diff --git a/db/migrate/044_remove_is_bounce.rb b/db/migrate/044_remove_is_bounce.rb index 8e2307060..6656a237c 100644 --- a/db/migrate/044_remove_is_bounce.rb +++ b/db/migrate/044_remove_is_bounce.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveIsBounce < ActiveRecord::Migration def self.up remove_column :incoming_messages, :is_bounce diff --git a/db/migrate/045_add_circumstance_to_post_redirect.rb b/db/migrate/045_add_circumstance_to_post_redirect.rb index e6e7ca513..bddd5b24a 100644 --- a/db/migrate/045_add_circumstance_to_post_redirect.rb +++ b/db/migrate/045_add_circumstance_to_post_redirect.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCircumstanceToPostRedirect < ActiveRecord::Migration def self.up add_column :post_redirects, :circumstance, :text, :default => "normal" diff --git a/db/migrate/046_add_last_event_id_to_alert_table.rb b/db/migrate/046_add_last_event_id_to_alert_table.rb index 361bd0af4..aab547a63 100644 --- a/db/migrate/046_add_last_event_id_to_alert_table.rb +++ b/db/migrate/046_add_last_event_id_to_alert_table.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddLastEventIdToAlertTable < ActiveRecord::Migration def self.up add_column :user_info_request_sent_alerts, :info_request_event_id, :integer, :default => nil diff --git a/db/migrate/047_add_calculated_state.rb b/db/migrate/047_add_calculated_state.rb index 5e5b93512..ad77b366d 100644 --- a/db/migrate/047_add_calculated_state.rb +++ b/db/migrate/047_add_calculated_state.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCalculatedState < ActiveRecord::Migration def self.up add_column :info_request_events, :calculated_state, :string, :default => nil diff --git a/db/migrate/048_add_calculated_state_at.rb b/db/migrate/048_add_calculated_state_at.rb index 63f7e996d..8a4ffa4ef 100644 --- a/db/migrate/048_add_calculated_state_at.rb +++ b/db/migrate/048_add_calculated_state_at.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCalculatedStateAt < ActiveRecord::Migration def self.up # This is for use in RSS feeds diff --git a/db/migrate/049_track_things.rb b/db/migrate/049_track_things.rb index aad50a69e..8d94602b9 100644 --- a/db/migrate/049_track_things.rb +++ b/db/migrate/049_track_things.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class TrackThings < ActiveRecord::Migration def self.up create_table :track_things do |t| diff --git a/db/migrate/050_improve_track_things.rb b/db/migrate/050_improve_track_things.rb index 430dd5946..5d621ad36 100644 --- a/db/migrate/050_improve_track_things.rb +++ b/db/migrate/050_improve_track_things.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ImproveTrackThings < ActiveRecord::Migration def self.up # SQLite at least needs a default for this diff --git a/db/migrate/051_add_track_things_unique_indices.rb b/db/migrate/051_add_track_things_unique_indices.rb index 27d901734..3ff90d79e 100644 --- a/db/migrate/051_add_track_things_unique_indices.rb +++ b/db/migrate/051_add_track_things_unique_indices.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddTrackThingsUniqueIndices < ActiveRecord::Migration def self.up add_index :track_things, [:tracking_user_id, :track_query], :unique => true diff --git a/db/migrate/052_include_event_foreign_references.rb b/db/migrate/052_include_event_foreign_references.rb index 5dfcce4a7..c48a65a6f 100644 --- a/db/migrate/052_include_event_foreign_references.rb +++ b/db/migrate/052_include_event_foreign_references.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class IncludeEventForeignReferences < ActiveRecord::Migration def self.up add_column :info_request_events, :incoming_message_id, :integer diff --git a/db/migrate/053_acts_as_xapian_migration.rb b/db/migrate/053_acts_as_xapian_migration.rb index cc2680533..291e0bb4e 100644 --- a/db/migrate/053_acts_as_xapian_migration.rb +++ b/db/migrate/053_acts_as_xapian_migration.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ActsAsXapianMigration < ActiveRecord::Migration def self.up create_table :acts_as_xapian_jobs do |t| diff --git a/db/migrate/054_allow_longer_comments.rb b/db/migrate/054_allow_longer_comments.rb index 35f2bee9c..fb19a1045 100644 --- a/db/migrate/054_allow_longer_comments.rb +++ b/db/migrate/054_allow_longer_comments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AllowLongerComments < ActiveRecord::Migration def self.up change_column :public_body_versions, :last_edit_comment, :text diff --git a/db/migrate/055_stop_new_responses.rb b/db/migrate/055_stop_new_responses.rb index 1ebe2142a..dce034b95 100644 --- a/db/migrate/055_stop_new_responses.rb +++ b/db/migrate/055_stop_new_responses.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class StopNewResponses < ActiveRecord::Migration def self.up add_column :info_requests, :stop_new_responses, :boolean, :default => false, :null => false diff --git a/db/migrate/056_add_attachment_text.rb b/db/migrate/056_add_attachment_text.rb index adcb97d5f..f9c0801cf 100644 --- a/db/migrate/056_add_attachment_text.rb +++ b/db/migrate/056_add_attachment_text.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddAttachmentText < ActiveRecord::Migration def self.up add_column :incoming_messages, :cached_attachment_text, :text diff --git a/db/migrate/057_add_law_used.rb b/db/migrate/057_add_law_used.rb index ec4efd0bc..1ed73bee0 100644 --- a/db/migrate/057_add_law_used.rb +++ b/db/migrate/057_add_law_used.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddLawUsed < ActiveRecord::Migration def self.up add_column :info_requests, :law_used, :string, :null => false, :default => 'foi' diff --git a/db/migrate/058_remove_sessions.rb b/db/migrate/058_remove_sessions.rb index 316fcfdda..d94865eb7 100644 --- a/db/migrate/058_remove_sessions.rb +++ b/db/migrate/058_remove_sessions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveSessions < ActiveRecord::Migration def self.up drop_table :sessions diff --git a/db/migrate/059_add_url_notes.rb b/db/migrate/059_add_url_notes.rb index ae6a998aa..c0e708e12 100644 --- a/db/migrate/059_add_url_notes.rb +++ b/db/migrate/059_add_url_notes.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddUrlNotes < ActiveRecord::Migration def self.up add_column :public_bodies, :home_page, :text, :null => false, :default => "" diff --git a/db/migrate/060_add_cached_main_text.rb b/db/migrate/060_add_cached_main_text.rb index c372b471c..2317de1ad 100644 --- a/db/migrate/060_add_cached_main_text.rb +++ b/db/migrate/060_add_cached_main_text.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCachedMainText < ActiveRecord::Migration def self.up add_column :incoming_messages, :cached_main_body_text, :text diff --git a/db/migrate/061_include_responses_in_tracks.rb b/db/migrate/061_include_responses_in_tracks.rb index c7a3b26cf..8ebee5a1f 100644 --- a/db/migrate/061_include_responses_in_tracks.rb +++ b/db/migrate/061_include_responses_in_tracks.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class IncludeResponsesInTracks < ActiveRecord::Migration def self.up TrackThing.update_all "track_query = replace(track_query, 'variety:sent ', '') where track_type in ('public_body_updates', 'user_updates')" diff --git a/db/migrate/062_add_comments.rb b/db/migrate/062_add_comments.rb index d523dd808..da42786d8 100644 --- a/db/migrate/062_add_comments.rb +++ b/db/migrate/062_add_comments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddComments < ActiveRecord::Migration def self.up create_table :comments do |t| diff --git a/db/migrate/063_add_admin_users.rb b/db/migrate/063_add_admin_users.rb index 9daa64a35..ca6acc679 100644 --- a/db/migrate/063_add_admin_users.rb +++ b/db/migrate/063_add_admin_users.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddAdminUsers < ActiveRecord::Migration def self.up add_column :users, :admin_level, :string, :null => false, :default => 'none' diff --git a/db/migrate/064_indices_for_annotations.rb b/db/migrate/064_indices_for_annotations.rb index 5b89271fe..88e267c64 100644 --- a/db/migrate/064_indices_for_annotations.rb +++ b/db/migrate/064_indices_for_annotations.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class IndicesForAnnotations < ActiveRecord::Migration def self.up add_index :info_request_events, :created_at diff --git a/db/migrate/065_add_comments_to_user_track.rb b/db/migrate/065_add_comments_to_user_track.rb index 50d1f9d5d..9b2ef8747 100644 --- a/db/migrate/065_add_comments_to_user_track.rb +++ b/db/migrate/065_add_comments_to_user_track.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCommentsToUserTrack < ActiveRecord::Migration def self.up TrackThing.update_all "track_query = replace(track_query, 'variety:sent ', '') where track_type in ('public_body_updates', 'user_updates')" diff --git a/db/migrate/066_add_first_letter.rb b/db/migrate/066_add_first_letter.rb index 7878098e0..e29dfef37 100644 --- a/db/migrate/066_add_first_letter.rb +++ b/db/migrate/066_add_first_letter.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddFirstLetter < ActiveRecord::Migration def self.up add_column :public_bodies, :first_letter, :string diff --git a/db/migrate/067_factor_out_raw_email.rb b/db/migrate/067_factor_out_raw_email.rb index be4153938..869430e05 100644 --- a/db/migrate/067_factor_out_raw_email.rb +++ b/db/migrate/067_factor_out_raw_email.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class FactorOutRawEmail < ActiveRecord::Migration def self.up create_table :raw_emails do |t| diff --git a/db/migrate/068_add_censor_table.rb b/db/migrate/068_add_censor_table.rb index 92a17d2bc..8bfc4fbd6 100644 --- a/db/migrate/068_add_censor_table.rb +++ b/db/migrate/068_add_censor_table.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCensorTable < ActiveRecord::Migration def self.up create_table :censor_rules do |t| diff --git a/db/migrate/069_add_what_doing.rb b/db/migrate/069_add_what_doing.rb index be8039fec..2ede40603 100644 --- a/db/migrate/069_add_what_doing.rb +++ b/db/migrate/069_add_what_doing.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddWhatDoing < ActiveRecord::Migration def self.up add_column :outgoing_messages, :what_doing, :string diff --git a/db/migrate/070_sent_are_waiting_response.rb b/db/migrate/070_sent_are_waiting_response.rb index af66705b5..a2c2278ee 100644 --- a/db/migrate/070_sent_are_waiting_response.rb +++ b/db/migrate/070_sent_are_waiting_response.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class SentAreWaitingResponse < ActiveRecord::Migration def self.up InfoRequestEvent.update_all "described_state = 'waiting_response', calculated_state = 'waiting_response', last_described_at = created_at where event_type = 'sent'" diff --git a/db/migrate/071_add_exim_log.rb b/db/migrate/071_add_exim_log.rb index d3780affa..94924569c 100644 --- a/db/migrate/071_add_exim_log.rb +++ b/db/migrate/071_add_exim_log.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddEximLog < ActiveRecord::Migration def self.up create_table :exim_logs do |t| diff --git a/db/migrate/072_add_publication_scheme.rb b/db/migrate/072_add_publication_scheme.rb index 5040d1709..16507411d 100644 --- a/db/migrate/072_add_publication_scheme.rb +++ b/db/migrate/072_add_publication_scheme.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddPublicationScheme < ActiveRecord::Migration def self.up add_column :public_bodies, :publication_scheme, :text, :null => false, :default => "" diff --git a/db/migrate/073_add_ban_user.rb b/db/migrate/073_add_ban_user.rb index 15a1ea121..045c65fcd 100644 --- a/db/migrate/073_add_ban_user.rb +++ b/db/migrate/073_add_ban_user.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddBanUser < ActiveRecord::Migration def self.up add_column :users, :ban_text, :text, :null => false, :default => "" diff --git a/db/migrate/074_create_holidays.rb b/db/migrate/074_create_holidays.rb index f2197e89e..406b9c44e 100644 --- a/db/migrate/074_create_holidays.rb +++ b/db/migrate/074_create_holidays.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateHolidays < ActiveRecord::Migration def self.up create_table :holidays do |t| diff --git a/db/migrate/075_add_charity_number.rb b/db/migrate/075_add_charity_number.rb index 41743a922..af0208b44 100644 --- a/db/migrate/075_add_charity_number.rb +++ b/db/migrate/075_add_charity_number.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCharityNumber < ActiveRecord::Migration def self.up add_column :public_bodies, :charity_number, :text, :null => false, :default => "" diff --git a/db/migrate/076_add_indices.rb b/db/migrate/076_add_indices.rb index fd102caba..50fc1e3ea 100644 --- a/db/migrate/076_add_indices.rb +++ b/db/migrate/076_add_indices.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIndices < ActiveRecord::Migration def self.up add_index :track_things_sent_emails, :track_thing_id diff --git a/db/migrate/077_add_exim_log_index.rb b/db/migrate/077_add_exim_log_index.rb index c2d04d7ca..c7526c252 100644 --- a/db/migrate/077_add_exim_log_index.rb +++ b/db/migrate/077_add_exim_log_index.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddEximLogIndex < ActiveRecord::Migration def self.up add_index :exim_logs, :exim_log_done_id diff --git a/db/migrate/078_expand_stop_new_responses.rb b/db/migrate/078_expand_stop_new_responses.rb index ae0d4db91..24b384ea1 100644 --- a/db/migrate/078_expand_stop_new_responses.rb +++ b/db/migrate/078_expand_stop_new_responses.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ExpandStopNewResponses < ActiveRecord::Migration def self.up add_column :info_requests, :allow_new_responses_from, :string diff --git a/db/migrate/079_add_profile_photo.rb b/db/migrate/079_add_profile_photo.rb index a6c031d89..9777b1948 100644 --- a/db/migrate/079_add_profile_photo.rb +++ b/db/migrate/079_add_profile_photo.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddProfilePhoto < ActiveRecord::Migration def self.up create_table :profile_photos do |t| diff --git a/db/migrate/080_cache_only_clipped_attachment_text.rb b/db/migrate/080_cache_only_clipped_attachment_text.rb index 0cd835e49..71b801e53 100644 --- a/db/migrate/080_cache_only_clipped_attachment_text.rb +++ b/db/migrate/080_cache_only_clipped_attachment_text.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CacheOnlyClippedAttachmentText < ActiveRecord::Migration def self.up remove_column :incoming_messages, :cached_attachment_text diff --git a/db/migrate/081_add_event_prominence.rb b/db/migrate/081_add_event_prominence.rb index 184e1a267..2b0d3a8ea 100644 --- a/db/migrate/081_add_event_prominence.rb +++ b/db/migrate/081_add_event_prominence.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddEventProminence < ActiveRecord::Migration def self.up add_column :info_request_events, :prominence, :string, :null => false, :default => 'normal' diff --git a/db/migrate/082_change_raw_email_to_binary.rb b/db/migrate/082_change_raw_email_to_binary.rb index ec16d54a0..5123f2825 100644 --- a/db/migrate/082_change_raw_email_to_binary.rb +++ b/db/migrate/082_change_raw_email_to_binary.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ChangeRawEmailToBinary < ActiveRecord::Migration def self.up change_column :raw_emails, :data, :text, :null => true # allow null diff --git a/db/migrate/083_add_indices_track_sent.rb b/db/migrate/083_add_indices_track_sent.rb index 2b0908af8..f292b02ab 100644 --- a/db/migrate/083_add_indices_track_sent.rb +++ b/db/migrate/083_add_indices_track_sent.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIndicesTrackSent < ActiveRecord::Migration def self.up add_index :track_things_sent_emails, :created_at diff --git a/db/migrate/084_alter_profile_photo.rb b/db/migrate/084_alter_profile_photo.rb index d2717b047..14c84ac99 100644 --- a/db/migrate/084_alter_profile_photo.rb +++ b/db/migrate/084_alter_profile_photo.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AlterProfilePhoto < ActiveRecord::Migration def self.up remove_column :users, :profile_photo_id diff --git a/db/migrate/085_draft_profile_photo.rb b/db/migrate/085_draft_profile_photo.rb index c0b507485..98c08a35e 100644 --- a/db/migrate/085_draft_profile_photo.rb +++ b/db/migrate/085_draft_profile_photo.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class DraftProfilePhoto < ActiveRecord::Migration def self.up add_column :profile_photos, :draft, :boolean, :default => false, :null => false diff --git a/db/migrate/086_allow_null_profile_photo_user.rb b/db/migrate/086_allow_null_profile_photo_user.rb index f4e107848..a070df560 100644 --- a/db/migrate/086_allow_null_profile_photo_user.rb +++ b/db/migrate/086_allow_null_profile_photo_user.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AllowNullProfilePhotoUser < ActiveRecord::Migration def self.up change_column :profile_photos, :user_id, :integer, :null => true diff --git a/db/migrate/087_add_about_me.rb b/db/migrate/087_add_about_me.rb index 9916454f3..907cd472b 100644 --- a/db/migrate/087_add_about_me.rb +++ b/db/migrate/087_add_about_me.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddAboutMe < ActiveRecord::Migration def self.up add_column :users, :about_me, :text, :null => false, :default => "" diff --git a/db/migrate/088_public_body_machine_tags.rb b/db/migrate/088_public_body_machine_tags.rb index 6a0815568..33f035a8e 100644 --- a/db/migrate/088_public_body_machine_tags.rb +++ b/db/migrate/088_public_body_machine_tags.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class PublicBodyMachineTags < ActiveRecord::Migration def self.up add_column :public_body_tags, :value, :text diff --git a/db/migrate/089_remove_charity_number.rb b/db/migrate/089_remove_charity_number.rb index 9b7d0935b..0d67bef04 100644 --- a/db/migrate/089_remove_charity_number.rb +++ b/db/migrate/089_remove_charity_number.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveCharityNumber < ActiveRecord::Migration def self.up remove_column :public_bodies, :charity_number diff --git a/db/migrate/090_remove_tag_uniqueness.rb b/db/migrate/090_remove_tag_uniqueness.rb index d1affade3..37b9a39b4 100644 --- a/db/migrate/090_remove_tag_uniqueness.rb +++ b/db/migrate/090_remove_tag_uniqueness.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveTagUniqueness < ActiveRecord::Migration def self.up # MySQL cannot index text blobs like this diff --git a/db/migrate/091_add_censor_rules_indices.rb b/db/migrate/091_add_censor_rules_indices.rb index 59f5db6cc..88869be1c 100644 --- a/db/migrate/091_add_censor_rules_indices.rb +++ b/db/migrate/091_add_censor_rules_indices.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCensorRulesIndices < ActiveRecord::Migration def self.up add_index :censor_rules, :info_request_id diff --git a/db/migrate/092_cache_only_marked_body_text.rb b/db/migrate/092_cache_only_marked_body_text.rb index e05e23e74..5ce26f1c1 100644 --- a/db/migrate/092_cache_only_marked_body_text.rb +++ b/db/migrate/092_cache_only_marked_body_text.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CacheOnlyMarkedBodyText < ActiveRecord::Migration def self.up remove_column :incoming_messages, :cached_main_body_text diff --git a/db/migrate/093_move_to_has_tag_string.rb b/db/migrate/093_move_to_has_tag_string.rb index 58f36c224..f819045a9 100644 --- a/db/migrate/093_move_to_has_tag_string.rb +++ b/db/migrate/093_move_to_has_tag_string.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class MoveToHasTagString < ActiveRecord::Migration def self.up rename_table :public_body_tags, :has_tag_string_tags diff --git a/db/migrate/094_remove_old_tags_foreign_key.rb b/db/migrate/094_remove_old_tags_foreign_key.rb index 5a6a00acc..1e9abaff6 100644 --- a/db/migrate/094_remove_old_tags_foreign_key.rb +++ b/db/migrate/094_remove_old_tags_foreign_key.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveOldTagsForeignKey < ActiveRecord::Migration def self.up if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" diff --git a/db/migrate/095_add_post_redirect_user_index.rb b/db/migrate/095_add_post_redirect_user_index.rb index 05d5f7a35..d6e9162d1 100644 --- a/db/migrate/095_add_post_redirect_user_index.rb +++ b/db/migrate/095_add_post_redirect_user_index.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddPostRedirectUserIndex < ActiveRecord::Migration # This index is for admin interface diff --git a/db/migrate/096_create_translation_tables.rb b/db/migrate/096_create_translation_tables.rb index 4b47c11f7..fe076cbfd 100644 --- a/db/migrate/096_create_translation_tables.rb +++ b/db/migrate/096_create_translation_tables.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateTranslationTables < ActiveRecord::Migration def self.up fields = {:name => :text, diff --git a/db/migrate/097_add_comment_locale.rb b/db/migrate/097_add_comment_locale.rb index 92ac7c4a5..8a47351a6 100644 --- a/db/migrate/097_add_comment_locale.rb +++ b/db/migrate/097_add_comment_locale.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCommentLocale < ActiveRecord::Migration def self.up add_column :comments, :locale, :text, :null => false, :default => "" diff --git a/db/migrate/098_fix_public_body_translations.rb b/db/migrate/098_fix_public_body_translations.rb index 25f36336f..53d62ab7e 100644 --- a/db/migrate/098_fix_public_body_translations.rb +++ b/db/migrate/098_fix_public_body_translations.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # The PublicBody model class had a bug that meant the # translations for first_letter and publication_scheme # were not being correctly populated. diff --git a/db/migrate/099_move_raw_email_to_filesystem.rb b/db/migrate/099_move_raw_email_to_filesystem.rb index ea77580e1..bd9e8efb4 100644 --- a/db/migrate/099_move_raw_email_to_filesystem.rb +++ b/db/migrate/099_move_raw_email_to_filesystem.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class MoveRawEmailToFilesystem < ActiveRecord::Migration def self.up batch_size = 10 diff --git a/db/migrate/100_remove_redundant_raw_email_columns.rb b/db/migrate/100_remove_redundant_raw_email_columns.rb index edf6006d7..d974e78df 100644 --- a/db/migrate/100_remove_redundant_raw_email_columns.rb +++ b/db/migrate/100_remove_redundant_raw_email_columns.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveRedundantRawEmailColumns < ActiveRecord::Migration def self.up remove_column :raw_emails, :data_text diff --git a/db/migrate/101_add_hash_to_info_request.rb b/db/migrate/101_add_hash_to_info_request.rb index e38384cd6..564067438 100644 --- a/db/migrate/101_add_hash_to_info_request.rb +++ b/db/migrate/101_add_hash_to_info_request.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'digest/sha1' class AddHashToInfoRequest < ActiveRecord::Migration diff --git a/db/migrate/102_add_locale_to_users.rb b/db/migrate/102_add_locale_to_users.rb index a299a8561..eff9f60da 100644 --- a/db/migrate/102_add_locale_to_users.rb +++ b/db/migrate/102_add_locale_to_users.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddLocaleToUsers < ActiveRecord::Migration def self.up add_column :users, :locale, :string diff --git a/db/migrate/103_add_user_bounce_columns.rb b/db/migrate/103_add_user_bounce_columns.rb index a16ecde75..81daf3ed5 100644 --- a/db/migrate/103_add_user_bounce_columns.rb +++ b/db/migrate/103_add_user_bounce_columns.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'digest/sha1' class AddUserBounceColumns < ActiveRecord::Migration diff --git a/db/migrate/104_create_foi_attachments.rb b/db/migrate/104_create_foi_attachments.rb index c53cd4f64..bcef00985 100644 --- a/db/migrate/104_create_foi_attachments.rb +++ b/db/migrate/104_create_foi_attachments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateFoiAttachments < ActiveRecord::Migration def self.up diff --git a/db/migrate/105_extend_incoming_message.rb b/db/migrate/105_extend_incoming_message.rb index 9db8649a0..bb244e777 100644 --- a/db/migrate/105_extend_incoming_message.rb +++ b/db/migrate/105_extend_incoming_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ExtendIncomingMessage < ActiveRecord::Migration def self.up add_column :incoming_messages, :sent_at, :time diff --git a/db/migrate/106_add_hex_digest_to_foi_attachment.rb b/db/migrate/106_add_hex_digest_to_foi_attachment.rb index d9520a934..20a9d5fb2 100644 --- a/db/migrate/106_add_hex_digest_to_foi_attachment.rb +++ b/db/migrate/106_add_hex_digest_to_foi_attachment.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddHexDigestToFoiAttachment < ActiveRecord::Migration def self.up add_column :foi_attachments, :hexdigest, :string, :limit => 32 diff --git a/db/migrate/107_add_date_parsed_field_to_incoming_message.rb b/db/migrate/107_add_date_parsed_field_to_incoming_message.rb index fbc017134..e13f7b776 100644 --- a/db/migrate/107_add_date_parsed_field_to_incoming_message.rb +++ b/db/migrate/107_add_date_parsed_field_to_incoming_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddDateParsedFieldToIncomingMessage < ActiveRecord::Migration def self.up add_column :incoming_messages, :last_parsed, :datetime diff --git a/db/migrate/108_change_safe_mail_from_to_mail_from.rb b/db/migrate/108_change_safe_mail_from_to_mail_from.rb index 57997f674..7bc5e47b6 100644 --- a/db/migrate/108_change_safe_mail_from_to_mail_from.rb +++ b/db/migrate/108_change_safe_mail_from_to_mail_from.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ChangeSafeMailFromToMailFrom < ActiveRecord::Migration def self.up remove_column :incoming_messages, :safe_mail_from diff --git a/db/migrate/109_change_sent_at_to_datetime.rb b/db/migrate/109_change_sent_at_to_datetime.rb index 5fc9b29ae..4ce1831c0 100644 --- a/db/migrate/109_change_sent_at_to_datetime.rb +++ b/db/migrate/109_change_sent_at_to_datetime.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class ChangeSentAtToDatetime < ActiveRecord::Migration def self.up remove_column :incoming_messages, :sent_at diff --git a/db/migrate/110_add_user_no_limit.rb b/db/migrate/110_add_user_no_limit.rb index d78a05f75..4d8274fbf 100644 --- a/db/migrate/110_add_user_no_limit.rb +++ b/db/migrate/110_add_user_no_limit.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'digest/sha1' class AddUserNoLimit < ActiveRecord::Migration diff --git a/db/migrate/111_create_purge_requests.rb b/db/migrate/111_create_purge_requests.rb index 0b4fd1d1d..c5ddaf4a2 100644 --- a/db/migrate/111_create_purge_requests.rb +++ b/db/migrate/111_create_purge_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreatePurgeRequests < ActiveRecord::Migration def self.up create_table :purge_requests do |t| diff --git a/db/migrate/112_add_api_key_to_public_bodies.rb b/db/migrate/112_add_api_key_to_public_bodies.rb index 43dccb198..a7b3903f1 100644 --- a/db/migrate/112_add_api_key_to_public_bodies.rb +++ b/db/migrate/112_add_api_key_to_public_bodies.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require "securerandom" class AddApiKeyToPublicBodies < ActiveRecord::Migration diff --git a/db/migrate/113_add_external_fields_to_info_requests.rb b/db/migrate/113_add_external_fields_to_info_requests.rb index 1ad7634ff..c350f432b 100644 --- a/db/migrate/113_add_external_fields_to_info_requests.rb +++ b/db/migrate/113_add_external_fields_to_info_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddExternalFieldsToInfoRequests < ActiveRecord::Migration def self.up change_column_null :info_requests, :user_id, true diff --git a/db/migrate/114_add_attention_requested_flag_to_info_requests.rb b/db/migrate/114_add_attention_requested_flag_to_info_requests.rb index 48c98e5a9..61a3b5e5e 100644 --- a/db/migrate/114_add_attention_requested_flag_to_info_requests.rb +++ b/db/migrate/114_add_attention_requested_flag_to_info_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'digest/sha1' class AddAttentionRequestedFlagToInfoRequests < ActiveRecord::Migration diff --git a/db/migrate/115_add_receive_email_alerts_to_user.rb b/db/migrate/115_add_receive_email_alerts_to_user.rb index 7e06dd275..0f3747294 100644 --- a/db/migrate/115_add_receive_email_alerts_to_user.rb +++ b/db/migrate/115_add_receive_email_alerts_to_user.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddReceiveEmailAlertsToUser < ActiveRecord::Migration def self.up add_column :users, :receive_email_alerts, :boolean, :default => true, :null => false diff --git a/db/migrate/116_add_censor_rule_regexp.rb b/db/migrate/116_add_censor_rule_regexp.rb index d9c4664cd..235a3a0cc 100644 --- a/db/migrate/116_add_censor_rule_regexp.rb +++ b/db/migrate/116_add_censor_rule_regexp.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCensorRuleRegexp < ActiveRecord::Migration def self.up add_column :censor_rules, :regexp, :boolean diff --git a/db/migrate/117_create_sessions.rb b/db/migrate/117_create_sessions.rb index 4ccc353b1..7d95f8935 100644 --- a/db/migrate/117_create_sessions.rb +++ b/db/migrate/117_create_sessions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateSessions < ActiveRecord::Migration def self.up create_table :sessions do |t| diff --git a/db/migrate/118_remove_sessions_again.rb b/db/migrate/118_remove_sessions_again.rb index dc5a63df7..88e896c08 100644 --- a/db/migrate/118_remove_sessions_again.rb +++ b/db/migrate/118_remove_sessions_again.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveSessionsAgain < ActiveRecord::Migration def self.up drop_table :sessions diff --git a/db/migrate/20120822145640_correct_external_request_constraint.rb b/db/migrate/20120822145640_correct_external_request_constraint.rb index 6902f3cb2..6d6b58f28 100644 --- a/db/migrate/20120822145640_correct_external_request_constraint.rb +++ b/db/migrate/20120822145640_correct_external_request_constraint.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CorrectExternalRequestConstraint < ActiveRecord::Migration def self.up if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" diff --git a/db/migrate/20120910153022_create_request_classifications.rb b/db/migrate/20120910153022_create_request_classifications.rb index 7c6270c9e..253e45909 100644 --- a/db/migrate/20120910153022_create_request_classifications.rb +++ b/db/migrate/20120910153022_create_request_classifications.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateRequestClassifications < ActiveRecord::Migration def self.up create_table :request_classifications do |t| diff --git a/db/migrate/20120912111713_add_raw_email_index_to_incoming_messages.rb b/db/migrate/20120912111713_add_raw_email_index_to_incoming_messages.rb index 14174935e..b69006e88 100644 --- a/db/migrate/20120912111713_add_raw_email_index_to_incoming_messages.rb +++ b/db/migrate/20120912111713_add_raw_email_index_to_incoming_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddRawEmailIndexToIncomingMessages < ActiveRecord::Migration def self.up add_index :incoming_messages, :raw_email_id diff --git a/db/migrate/20120912112036_add_info_request_id_index_to_exim_logs.rb b/db/migrate/20120912112036_add_info_request_id_index_to_exim_logs.rb index 81e2a7946..e926b110e 100644 --- a/db/migrate/20120912112036_add_info_request_id_index_to_exim_logs.rb +++ b/db/migrate/20120912112036_add_info_request_id_index_to_exim_logs.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddInfoRequestIdIndexToEximLogs < ActiveRecord::Migration def self.up add_index :exim_logs, :info_request_id diff --git a/db/migrate/20120912112312_add_info_request_id_index_to_incoming_and_outgoing_messages.rb b/db/migrate/20120912112312_add_info_request_id_index_to_incoming_and_outgoing_messages.rb index 814fa7540..d77196062 100644 --- a/db/migrate/20120912112312_add_info_request_id_index_to_incoming_and_outgoing_messages.rb +++ b/db/migrate/20120912112312_add_info_request_id_index_to_incoming_and_outgoing_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddInfoRequestIdIndexToIncomingAndOutgoingMessages < ActiveRecord::Migration def self.up add_index :incoming_messages, :info_request_id diff --git a/db/migrate/20120912112655_add_incoming_message_id_index_to_foi_attachments.rb b/db/migrate/20120912112655_add_incoming_message_id_index_to_foi_attachments.rb index be0bf76c3..c6d8008cf 100644 --- a/db/migrate/20120912112655_add_incoming_message_id_index_to_foi_attachments.rb +++ b/db/migrate/20120912112655_add_incoming_message_id_index_to_foi_attachments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIncomingMessageIdIndexToFoiAttachments < ActiveRecord::Migration def self.up add_index :foi_attachments, :incoming_message_id diff --git a/db/migrate/20120912113004_add_indexes_to_info_request_events.rb b/db/migrate/20120912113004_add_indexes_to_info_request_events.rb index b3780322f..49178e4ce 100644 --- a/db/migrate/20120912113004_add_indexes_to_info_request_events.rb +++ b/db/migrate/20120912113004_add_indexes_to_info_request_events.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIndexesToInfoRequestEvents < ActiveRecord::Migration def self.up add_index :info_request_events, :incoming_message_id diff --git a/db/migrate/20120912113720_add_public_body_index_to_info_requests.rb b/db/migrate/20120912113720_add_public_body_index_to_info_requests.rb index a56cad1f9..a105fbc6d 100644 --- a/db/migrate/20120912113720_add_public_body_index_to_info_requests.rb +++ b/db/migrate/20120912113720_add_public_body_index_to_info_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddPublicBodyIndexToInfoRequests < ActiveRecord::Migration def self.up add_index :info_requests, :public_body_id diff --git a/db/migrate/20120912114022_add_user_index_to_info_requests.rb b/db/migrate/20120912114022_add_user_index_to_info_requests.rb index 8be51c0c8..b44934feb 100644 --- a/db/migrate/20120912114022_add_user_index_to_info_requests.rb +++ b/db/migrate/20120912114022_add_user_index_to_info_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddUserIndexToInfoRequests < ActiveRecord::Migration def self.up add_index :info_requests, :user_id diff --git a/db/migrate/20120912170035_add_info_requests_count_to_public_bodies.rb b/db/migrate/20120912170035_add_info_requests_count_to_public_bodies.rb index d187dcfa5..5cc82106f 100644 --- a/db/migrate/20120912170035_add_info_requests_count_to_public_bodies.rb +++ b/db/migrate/20120912170035_add_info_requests_count_to_public_bodies.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddInfoRequestsCountToPublicBodies < ActiveRecord::Migration def self.up add_column :public_bodies, :info_requests_count, :integer, :null => false, :default => 0 diff --git a/db/migrate/20120913074940_add_incoming_message_index_to_outgoing_messages.rb b/db/migrate/20120913074940_add_incoming_message_index_to_outgoing_messages.rb index 893395f41..a2a855d9d 100644 --- a/db/migrate/20120913074940_add_incoming_message_index_to_outgoing_messages.rb +++ b/db/migrate/20120913074940_add_incoming_message_index_to_outgoing_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIncomingMessageIndexToOutgoingMessages < ActiveRecord::Migration def self.up add_index :outgoing_messages, :incoming_message_followup_id diff --git a/db/migrate/20120913080807_add_info_request_event_index_to_track_things_sent_emails.rb b/db/migrate/20120913080807_add_info_request_event_index_to_track_things_sent_emails.rb index d119f55b3..0270c3e1e 100644 --- a/db/migrate/20120913080807_add_info_request_event_index_to_track_things_sent_emails.rb +++ b/db/migrate/20120913080807_add_info_request_event_index_to_track_things_sent_emails.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddInfoRequestEventIndexToTrackThingsSentEmails < ActiveRecord::Migration def self.up add_index :track_things_sent_emails, :info_request_event_id diff --git a/db/migrate/20120913081136_add_info_request_event_index_to_user_info_request_sent_alerts.rb b/db/migrate/20120913081136_add_info_request_event_index_to_user_info_request_sent_alerts.rb index aa9f404f7..1b789c4e9 100644 --- a/db/migrate/20120913081136_add_info_request_event_index_to_user_info_request_sent_alerts.rb +++ b/db/migrate/20120913081136_add_info_request_event_index_to_user_info_request_sent_alerts.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddInfoRequestEventIndexToUserInfoRequestSentAlerts < ActiveRecord::Migration def self.up add_index :user_info_request_sent_alerts, :info_request_event_id diff --git a/db/migrate/20120913135745_add_updated_at_index_to_public_body_versions.rb b/db/migrate/20120913135745_add_updated_at_index_to_public_body_versions.rb index 6ae58c884..ceeee6efd 100644 --- a/db/migrate/20120913135745_add_updated_at_index_to_public_body_versions.rb +++ b/db/migrate/20120913135745_add_updated_at_index_to_public_body_versions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddUpdatedAtIndexToPublicBodyVersions < ActiveRecord::Migration def self.up add_index :public_body_versions, :updated_at diff --git a/db/migrate/20120919140404_add_comments_allowed_to_info_request.rb b/db/migrate/20120919140404_add_comments_allowed_to_info_request.rb index 4ae0bce18..a7671507f 100644 --- a/db/migrate/20120919140404_add_comments_allowed_to_info_request.rb +++ b/db/migrate/20120919140404_add_comments_allowed_to_info_request.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCommentsAllowedToInfoRequest < ActiveRecord::Migration def self.up add_column :info_requests, :comments_allowed, :boolean, :null => false, :default => true diff --git a/db/migrate/20121010214348_rename_exim_log_tables.rb b/db/migrate/20121010214348_rename_exim_log_tables.rb index 75fcff065..5c8ee8297 100644 --- a/db/migrate/20121010214348_rename_exim_log_tables.rb +++ b/db/migrate/20121010214348_rename_exim_log_tables.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RenameEximLogTables < ActiveRecord::Migration def self.up rename_table :exim_logs, :mail_server_logs diff --git a/db/migrate/20121022031914_add_disclosure_log.rb b/db/migrate/20121022031914_add_disclosure_log.rb index 82ea7dbcd..65ab7162d 100644 --- a/db/migrate/20121022031914_add_disclosure_log.rb +++ b/db/migrate/20121022031914_add_disclosure_log.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddDisclosureLog < ActiveRecord::Migration def self.up add_column :public_bodies, :disclosure_log, :text, :null => false, :default => "" diff --git a/db/migrate/20130731142632_remove_prominence_from_info_request_event.rb b/db/migrate/20130731142632_remove_prominence_from_info_request_event.rb index df0278c20..c0509e2e4 100644 --- a/db/migrate/20130731142632_remove_prominence_from_info_request_event.rb +++ b/db/migrate/20130731142632_remove_prominence_from_info_request_event.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class RemoveProminenceFromInfoRequestEvent < ActiveRecord::Migration def up remove_column :info_request_events, :prominence diff --git a/db/migrate/20130731145325_add_prominence_to_incoming_message.rb b/db/migrate/20130731145325_add_prominence_to_incoming_message.rb index 01c4906a7..89d2eb26c 100644 --- a/db/migrate/20130731145325_add_prominence_to_incoming_message.rb +++ b/db/migrate/20130731145325_add_prominence_to_incoming_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddProminenceToIncomingMessage < ActiveRecord::Migration def change add_column :incoming_messages, :prominence, :string, :null => false, :default => 'normal' diff --git a/db/migrate/20130801154033_add_prominence_reason_to_incoming_message.rb b/db/migrate/20130801154033_add_prominence_reason_to_incoming_message.rb index 2d189f658..9f6ecac27 100644 --- a/db/migrate/20130801154033_add_prominence_reason_to_incoming_message.rb +++ b/db/migrate/20130801154033_add_prominence_reason_to_incoming_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddProminenceReasonToIncomingMessage < ActiveRecord::Migration def change add_column :incoming_messages, :prominence_reason, :text diff --git a/db/migrate/20130816150110_add_statistics_to_public_body.rb b/db/migrate/20130816150110_add_statistics_to_public_body.rb index fb3a67e83..aaa7b0f27 100644 --- a/db/migrate/20130816150110_add_statistics_to_public_body.rb +++ b/db/migrate/20130816150110_add_statistics_to_public_body.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddStatisticsToPublicBody < ActiveRecord::Migration def self.up add_column :public_bodies, :info_requests_successful_count, :integer diff --git a/db/migrate/20130822161803_add_prominence_fields_to_outgoing_message.rb b/db/migrate/20130822161803_add_prominence_fields_to_outgoing_message.rb index a75e0d426..fc4c5540f 100644 --- a/db/migrate/20130822161803_add_prominence_fields_to_outgoing_message.rb +++ b/db/migrate/20130822161803_add_prominence_fields_to_outgoing_message.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddProminenceFieldsToOutgoingMessage < ActiveRecord::Migration def change add_column :outgoing_messages, :prominence, :string, :null => false, :default => 'normal' diff --git a/db/migrate/20130919151140_add_can_make_batch_requests_to_user.rb b/db/migrate/20130919151140_add_can_make_batch_requests_to_user.rb index cc9d8e76f..5bf1db6de 100644 --- a/db/migrate/20130919151140_add_can_make_batch_requests_to_user.rb +++ b/db/migrate/20130919151140_add_can_make_batch_requests_to_user.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddCanMakeBatchRequestsToUser < ActiveRecord::Migration def change add_column :users, :can_make_batch_requests, :boolean, :default => false, :null => false diff --git a/db/migrate/20131024114346_create_info_request_batches.rb b/db/migrate/20131024114346_create_info_request_batches.rb index 09c6f467b..bb56be6d2 100644 --- a/db/migrate/20131024114346_create_info_request_batches.rb +++ b/db/migrate/20131024114346_create_info_request_batches.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateInfoRequestBatches < ActiveRecord::Migration def up create_table :info_request_batches do |t| diff --git a/db/migrate/20131024152540_add_body_to_info_request_batches.rb b/db/migrate/20131024152540_add_body_to_info_request_batches.rb index 5f9b3af10..ad547c467 100644 --- a/db/migrate/20131024152540_add_body_to_info_request_batches.rb +++ b/db/migrate/20131024152540_add_body_to_info_request_batches.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddBodyToInfoRequestBatches < ActiveRecord::Migration def up add_column :info_request_batches, :body, :text diff --git a/db/migrate/20131101155844_add_stats_denominator.rb b/db/migrate/20131101155844_add_stats_denominator.rb index 7df4c8200..05920084b 100644 --- a/db/migrate/20131101155844_add_stats_denominator.rb +++ b/db/migrate/20131101155844_add_stats_denominator.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddStatsDenominator < ActiveRecord::Migration def up add_column :public_bodies, :info_requests_visible_classified_count, :integer diff --git a/db/migrate/20131127105438_create_info_request_batch_public_bodies_join_table.rb b/db/migrate/20131127105438_create_info_request_batch_public_bodies_join_table.rb index 11a9c7066..8e75eb9bf 100644 --- a/db/migrate/20131127105438_create_info_request_batch_public_bodies_join_table.rb +++ b/db/migrate/20131127105438_create_info_request_batch_public_bodies_join_table.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateInfoRequestBatchPublicBodiesJoinTable < ActiveRecord::Migration def change create_table :info_request_batches_public_bodies, :id => false do |t| diff --git a/db/migrate/20131127135622_add_sent_at_to_info_request_batch.rb b/db/migrate/20131127135622_add_sent_at_to_info_request_batch.rb index 27d4aecee..2d485a065 100644 --- a/db/migrate/20131127135622_add_sent_at_to_info_request_batch.rb +++ b/db/migrate/20131127135622_add_sent_at_to_info_request_batch.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddSentAtToInfoRequestBatch < ActiveRecord::Migration def change add_column :info_request_batches, :sent_at, :datetime diff --git a/db/migrate/20131211152641_create_public_body_change_requests.rb b/db/migrate/20131211152641_create_public_body_change_requests.rb index e3fb560a6..76e24d589 100644 --- a/db/migrate/20131211152641_create_public_body_change_requests.rb +++ b/db/migrate/20131211152641_create_public_body_change_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreatePublicBodyChangeRequests < ActiveRecord::Migration def up create_table :public_body_change_requests do |t| diff --git a/db/migrate/20140325120619_create_spam_addresses.rb b/db/migrate/20140325120619_create_spam_addresses.rb index 7c730a5c7..0258e01b9 100644 --- a/db/migrate/20140325120619_create_spam_addresses.rb +++ b/db/migrate/20140325120619_create_spam_addresses.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateSpamAddresses < ActiveRecord::Migration def change create_table :spam_addresses do |t| diff --git a/db/migrate/20140408145616_add_default_short_name_to_public_bodies.rb b/db/migrate/20140408145616_add_default_short_name_to_public_bodies.rb index 5fb239ebd..0a4ce19b3 100644 --- a/db/migrate/20140408145616_add_default_short_name_to_public_bodies.rb +++ b/db/migrate/20140408145616_add_default_short_name_to_public_bodies.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddDefaultShortNameToPublicBodies < ActiveRecord::Migration def up diff --git a/db/migrate/20140528110536_update_track_things_index.rb b/db/migrate/20140528110536_update_track_things_index.rb index 55ee0b70b..209beecce 100644 --- a/db/migrate/20140528110536_update_track_things_index.rb +++ b/db/migrate/20140528110536_update_track_things_index.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class UpdateTrackThingsIndex < ActiveRecord::Migration def up diff --git a/db/migrate/20140710094405_create_public_body_headings_and_categories.rb b/db/migrate/20140710094405_create_public_body_headings_and_categories.rb index 0ba7f64a0..b65d2078b 100644 --- a/db/migrate/20140710094405_create_public_body_headings_and_categories.rb +++ b/db/migrate/20140710094405_create_public_body_headings_and_categories.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreatePublicBodyHeadingsAndCategories < ActiveRecord::Migration def up create_table :public_body_headings, :force => true do |t| @@ -24,4 +25,4 @@ class CreatePublicBodyHeadingsAndCategories < ActiveRecord::Migration drop_table :public_body_headings drop_table :public_body_categories_public_body_headings end -end
\ No newline at end of file +end diff --git a/db/migrate/20140716131107_create_category_translation_tables.rb b/db/migrate/20140716131107_create_category_translation_tables.rb index f4b90b330..95591caf2 100644 --- a/db/migrate/20140716131107_create_category_translation_tables.rb +++ b/db/migrate/20140716131107_create_category_translation_tables.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateCategoryTranslationTables < ActiveRecord::Migration class PublicBodyCategory < ActiveRecord::Base translates :title, :description diff --git a/db/migrate/20140801132719_add_index_to_info_request_events.rb b/db/migrate/20140801132719_add_index_to_info_request_events.rb index 5f0a77eac..48c36f2b4 100644 --- a/db/migrate/20140801132719_add_index_to_info_request_events.rb +++ b/db/migrate/20140801132719_add_index_to_info_request_events.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddIndexToInfoRequestEvents < ActiveRecord::Migration def change add_index :info_request_events, :event_type diff --git a/db/migrate/20140804120601_add_display_order_to_categories_and_headings.rb b/db/migrate/20140804120601_add_display_order_to_categories_and_headings.rb index c2e7e2ac3..a7160995d 100644 --- a/db/migrate/20140804120601_add_display_order_to_categories_and_headings.rb +++ b/db/migrate/20140804120601_add_display_order_to_categories_and_headings.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AddDisplayOrderToCategoriesAndHeadings < ActiveRecord::Migration def up add_column :public_body_categories_public_body_headings, :category_display_order, :integer diff --git a/db/migrate/20140824191444_create_widget_votes.rb b/db/migrate/20140824191444_create_widget_votes.rb new file mode 100644 index 000000000..467f937e2 --- /dev/null +++ b/db/migrate/20140824191444_create_widget_votes.rb @@ -0,0 +1,12 @@ +# -*- encoding : utf-8 -*- +class CreateWidgetVotes < ActiveRecord::Migration + def change + create_table :widget_votes do |t| + t.string :cookie + t.belongs_to :info_request, :null => false + + t.timestamps + end + add_index :widget_votes, :info_request_id + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 664d8c74c..d12490d17 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # diff --git a/doc/CHANGES.md b/doc/CHANGES.md index a654f3b6a..27397ed5c 100644 --- a/doc/CHANGES.md +++ b/doc/CHANGES.md @@ -1,3 +1,133 @@ +# develop + +# Version 0.22 + +## Highlighted Features + +* Upgrades and fixes for security announcements CVE-2015-3225, CVE-2015-3227 and + CVE-2015-1840 (Louise Crow). +* Attachment text conversion to UTF-8 is now handled in a clearer way by the + `FoiAttachment` model. Censor rules are applied with the appropriate encoding + (Louise Crow). +* A rake task `temp:fix_invalid_utf8` has been added to help people migrating an + Alaveteli install from ruby 1.8.7 to a later ruby version (Louise Crow). +* An example wrapper script, `config/run-with-rbenv-path` has been added to run + the mail scripts using the ruby version set by `rbenv`. Example code for this + has also been added to the daemon and cron example files. +* Remove dependency on tools provided by sharutils package (Gareth Rees). +* Use rack-utf8_sanitizer to handle badly-formed UTF-8 in request URI and + headers (Louise Crow). +* Correctly handle names with commas in ContactMailer (Louise Crow). +* Various performance improvements in InfoRequestEvent (Gareth Rees). +* Improve performance of PublicBodyController#show (Gareth Rees). +* Various performance improvements in PublicBody (Gareth Rees). +* General improvements to string encoding handling (Louise Crow). +* Allow locale specific language names (Louise Crow). +* Fix count of requests on authority page (Henare Degan). +* Added Croatian Alaveteli to the list of world FOI websites + (Miroslav Schlossberg). +* Various code duplication cleanup (James McKinney). +* Improve error reporting on graph generation (Petter Reinholdtsen). +* Admin summary page performance improvements (Gareth Rees). +* Various performance improvements in InfoRequest (Gareth Rees). +* Add missing ttf-bitstream-vera package (Petter Reinholdtsen). +* Send mail import errors to exception notification address (Louise Crow). +* Add bullet for tracking N+1 queries in development environment. Turn on by + setting `USE_BULLET_IN_DEVELOPMENT` to `true` (Gareth Rees). +* Performance improvement when initializing InfoRequest instances (Gareth Rees). +* root no longer required to read mail logs +* Code quality improvements to ActsAsXapian (Louise Crow). +* Don't put HTML entities in email subject lines (Henare Degan). +* Defunct authorities are removed from the list of authorities with mising + emails on the admin summary page (Henare Degan). +* Correctly encode words to highlight (Caleb Tutty). +* The request email of a PublicBody with a blank request_email database + attribute will not be overridden by `OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS` + (Henare Degan). +* Fixed a bug in the HealthChecksHelper when applying 'OK' style (Caleb Tutty). +* Keep cookies from txt files in suggested Varnish configuration (Henare Degan). +* Improvements to the Categorisation Game charts (Henare Degan). +* Destroing an InfoRequest now destroys associated Comments and CensorRules + (Louise Crow). +* There is experimental support for using an STMP server, rather than sendmail, + for outgoing mail. There is not yet any ability to retry if the SMTP server is + unavailable (Caleb Tutty, Louise Crow). +* HTML 'widgets' advertising requests can be displayed on other sites in iframes. + If `ENABLE_WIDGETS` is set to true in `general.yml` (the default is false), a link + to the widget code will appear in the right hand sidebar of a request page. + (Jody McIntyre, Louise Crow). +* Capistrano now caches themes (Henare Degan). +* Improve correspondence box padding (Luke Bacon). +* Improve empty PublicBody translation rejection (Henare Degan). +* New message attachment icons (Martin Wright). +* Improve localisation (Louise Crow, Petter Reinholdtsen, Gorm Eriksen). +* Update xapian-full-alaveteli for Ruby 2.1 compatibility (Louise Crow). +* Improve header search form (Luke Bacon). +* Fix 'link to this' button on touch devices (Luke Bacon). + +## Upgrade Notes + +* **Version 0.22 is the last release to support Ruby 1.8.7.** + + We have an evolving [upgrade guide](http://git.io/vLNg0) on the wiki, and + we're always available on the [alaveteli-dev mailing list](https://goo.gl/6u67Jg). +* Ruby version files are ignored – these are delegated to people's development + or deployment environments. See https://goo.gl/01MCCi and e5180fa89. +* Ensure all overridden Ruby source files have encoding specifier. See + 576b58803. +* Memcached namespace is now dependent on Ruby version. No action required. +* Capistrano now caches themes in `shared/themes`. Run the `deploy:setup` task + to create the shared directory before making a new code deploy. +* Example daemon files have been renamed (7af5e9d). You'll need to use the new + names in any scripts or documentation you've written. +* Regenerate alert tracks and purge varnish daemons to get better stop daemon + handling. +* Regenerate Varnish config so that cookies from txt files are not ignored. + See db2db066. +* Regenerate the crontab so that root is no longer used to read mail logs. +* Give the unix application user membership of the adm group so that they can + read the mail log files `usermod -a -G adm "$UNIX_USER"` +* Remove summary stats from admin summary page. They're duplicated on + /admin/summary. No action required. +* The default branch has been changed from `rails-3-develop` to `develop`. Use + of `rails-3-develop` will stop, and the branch will be removed at some point. +* Add the ttf-bitstream-vera package to provide Vera.ttf to the cron jobs. +* Alaveteli no longer requires the sharutils package. +* Remember to `rake db:migrate` and `git submodule update` +* If you handle attachment text in your theme, note that: + * `FoiAttachment#body` will always return a binary encoded string + * `FoiAttachment#body_as_text` will always return a UTF-8 encoded string + * `FoiAttachment#default_body` will return a UTF-8 encoded string for text + content types, and a binary encoded string for all other types. + +### Changed Templates + +The following templates have been changed. Please update overrides in your theme +to match the new templates. + + app/views/admin_general/index.html.erb + app/views/admin_public_body/edit.html.erb + app/views/comment/_comment_form.html.erb + app/views/comment/_single_comment.html.erb + app/views/general/_responsive_topnav.html.erb + app/views/help/unhappy.html.erb + app/views/public_body/show.html.erb + app/views/public_body_change_requests/new.html.erb + app/views/request/_act.html.erb + app/views/request/_followup.html.erb + app/views/request/_incoming_correspondence.html.erb + app/views/request/_outgoing_correspondence.html.erb + app/views/request/_request_listing_via_event.html.erb + app/views/request/_request_search_form.html.erb + app/views/request/_resent_outgoing_correspondence.html.erb + app/views/request/new.html.erb + app/views/request/new_bad_contact.html.erb + app/views/request/show.html.erb + app/views/request_game/play.html.erb + app/views/track/_tracking_links.html.erb + app/views/user/_user_listing_single.html.erb + app/views/user/show.html.erb + # Version 0.21 ## Highlighted Features @@ -464,7 +594,7 @@ Example: `rm public/download` * This release upgrades the assumed version of Ubuntu from lucid (10.04) to precise (12.04) * This release upgrades rubygems in config/packages - version 1.8.15 is available from squeeze-backports on Debian or by default in Ubuntu precise. This upgrade may result in "invalid date format in specification:" errors - these should be fixable by manually deleting the gems specs that are being referenced in the error and re-running rails-post-deploy -* If you would like to have a public body statistics page (this will be publicly available), set the `PUBLIC_BODY_STATISTICS_PAGE` param in general.yml to `true`. You should also add a new cron job based on the one in config/crontab-example `https://github.com/mysociety/alaveteli/blob/rails-3-develop/config/crontab-example#L29` to update the public body stats each day. +* If you would like to have a public body statistics page (this will be publicly available), set the `PUBLIC_BODY_STATISTICS_PAGE` param in general.yml to `true`. You should also add a new cron job based on the one in config/crontab-example `https://github.com/mysociety/alaveteli/blob/develop/config/crontab-example#L29` to update the public body stats each day. * If you would like the public body list page to include bodies that have no translation in the current locale, but do have a translation in the default locale, add a `PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE` param set to `true` to your config/general.yml file. diff --git a/lib/ability.rb b/lib/ability.rb index f63845e84..607f55286 100644 --- a/lib/ability.rb +++ b/lib/ability.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module Ability def self.can_update_request_state?(user, request) (user && request.is_old_unclassified?) || request.is_owning_user?(user) diff --git a/lib/activerecord_errors_extensions.rb b/lib/activerecord_errors_extensions.rb index 8135d34f7..19bede539 100644 --- a/lib/activerecord_errors_extensions.rb +++ b/lib/activerecord_errors_extensions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Monkeypatch! activerecord/lib/active_record/validations.rb # Method to remove individual error messages from an ActiveRecord. module ActiveRecord diff --git a/lib/activesupport_cache_extensions.rb b/lib/activesupport_cache_extensions.rb index 2791d5996..4e9a6a69c 100644 --- a/lib/activesupport_cache_extensions.rb +++ b/lib/activesupport_cache_extensions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # lib/activesupport_cache_extensions.rb: # Extensions / fixes to ActiveSupport::Cache # diff --git a/lib/acts_as_xapian/acts_as_xapian.rb b/lib/acts_as_xapian/acts_as_xapian.rb index 9194e8cc4..e0c7c6ae7 100644 --- a/lib/acts_as_xapian/acts_as_xapian.rb +++ b/lib/acts_as_xapian/acts_as_xapian.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- # acts_as_xapian/lib/acts_as_xapian.rb: # Xapian full text search in Ruby on Rails. # @@ -39,7 +39,7 @@ module ActsAsXapian ###################################################################### # Module level variables # TODO: must be some kind of cattr_accessor that can do this better - def ActsAsXapian.bindings_available + def self.bindings_available $acts_as_xapian_bindings_available end class NoXapianRubyBindingsError < StandardError @@ -58,40 +58,40 @@ module ActsAsXapian $acts_as_xapian_class_var_init = true end - def ActsAsXapian.db + def self.db @@db end - def ActsAsXapian.db_path=(db_path) + def self.db_path=(db_path) @@db_path = db_path end - def ActsAsXapian.db_path + def self.db_path @@db_path end - def ActsAsXapian.writable_db + def self.writable_db @@writable_db end - def ActsAsXapian.stemmer + def self.stemmer @@stemmer end - def ActsAsXapian.term_generator + def self.term_generator @@term_generator end - def ActsAsXapian.enquire + def self.enquire @@enquire end - def ActsAsXapian.query_parser + def self.query_parser @@query_parser end - def ActsAsXapian.values_by_prefix + def self.values_by_prefix @@values_by_prefix end - def ActsAsXapian.config + def self.config @@config end ###################################################################### # Initialisation - def ActsAsXapian.init(classname = nil, options = nil) + def self.init(classname = nil, options = nil) if not classname.nil? # store class and options for use later, when we open the db in readable_init @@init_values.push([classname,options]) @@ -99,7 +99,7 @@ module ActsAsXapian end # Reads the config file (if any) and sets up the path to the database we'll be using - def ActsAsXapian.prepare_environment + def self.prepare_environment return unless @@db_path.nil? # barf if we can't figure out the environment @@ -130,17 +130,17 @@ module ActsAsXapian # Opens / reopens the db for reading # TODO: we perhaps don't need to rebuild database and enquire and queryparser - # but db.reopen wasn't enough by itself, so just do everything it's easier. - def ActsAsXapian.readable_init + def self.readable_init raise NoXapianRubyBindingsError.new("Xapian Ruby bindings not installed") unless ActsAsXapian.bindings_available raise "acts_as_xapian hasn't been called in any models" if @@init_values.empty? prepare_environment # We need to reopen the database each time, so Xapian gets changes to it. - # Calling reopen() does not always pick up changes for reasons that I can + # Calling reopen does not always pick up changes for reasons that I can # only speculate about at the moment. (It is easy to reproduce this by - # changing the code below to use reopen() rather than open() followed by - # close(), and running rake spec.) + # changing the code below to use reopen rather than open followed by + # close, and running rake spec.) if !@@db.nil? @@db.close end @@ -157,23 +157,20 @@ module ActsAsXapian end # Make a new query parser - def ActsAsXapian.init_query_parser + def self.init_query_parser # for queries @@query_parser = Xapian::QueryParser.new @@query_parser.stemmer = @@stemmer @@query_parser.stemming_strategy = Xapian::QueryParser::STEM_SOME @@query_parser.database = @@db @@query_parser.default_op = Xapian::Query::OP_AND - begin - @@query_parser.set_max_wildcard_expansion(1000) - rescue NoMethodError - # The set_max_wildcard_expansion method was introduced in Xapian 1.2.7, - # so may legitimately not be available. - # - # Large installations of Alaveteli should consider - # upgrading, because uncontrolled wildcard expansion - # can crash the whole server: see http://trac.xapian.org/ticket/350 - end + # The set_max_wildcard_expansion method was introduced in Xapian 1.2.7, + # so may legitimately not be available. + # + # Large installations of Alaveteli should consider + # upgrading, because uncontrolled wildcard expansion + # can crash the whole server: see http://trac.xapian.org/ticket/350 + @@query_parser.set_max_wildcard_expansion(1000) if @@query_parser.respond_to? :set_max_wildcard_expansion @@stopper = Xapian::SimpleStopper.new @@stopper.add("and") @@ -186,61 +183,68 @@ module ActsAsXapian @@values_by_prefix = {} @@value_ranges_store = [] - for init_value_pair in @@init_values - classname = init_value_pair[0] - options = init_value_pair[1] - + @@init_values.each do |classname, options| # go through the various field types, and tell query parser about them, # and error check them - i.e. check for consistency between models @@query_parser.add_boolean_prefix("model", "M") @@query_parser.add_boolean_prefix("modelid", "I") - if options[:terms] - for term in options[:terms] - raise "Use a single capital letter for term code" if not term[1].match(/^[A-Z]$/) - raise "M and I are reserved for use as the model/id term" if term[1] == "M" or term[1] == "I" - raise "model and modelid are reserved for use as the model/id prefixes" if term[2] == "model" or term[2] == "modelid" - raise "Z is reserved for stemming terms" if term[1] == "Z" - raise "Already have code '" + term[1] + "' in another model but with different prefix '" + @@terms_by_capital[term[1]] + "'" if @@terms_by_capital.include?(term[1]) && @@terms_by_capital[term[1]] != term[2] - @@terms_by_capital[term[1]] = term[2] - # TODO: use boolean here so doesn't stem our URL names in WhatDoTheyKnow - # If making acts_as_xapian generic, would really need to make the :terms have - # another option that lets people choose non-boolean for terms that need it - # (i.e. searching explicitly within a free text field) - @@query_parser.add_boolean_prefix(term[2], term[1]) - end + init_terms(options[:terms]) if options[:terms] + init_values(options[:values]) if options[:values] + end + end + + def self.init_values(values) + values.each do |method, index, prefix, value_type| + raise "Value index '#{index}' must be an Integer, is #{index.class}" unless index.is_a? Integer + if @@values_by_number.include?(index) && @@values_by_number[index] != prefix + raise "Already have value index '#{index}' in another model " \ + "but with different prefix '#{@@values_by_number[index]}'" end - if options[:values] - for value in options[:values] - raise "Value index '"+value[1].to_s+"' must be an integer, is " + value[1].class.to_s if value[1].class != 1.class - raise "Already have value index '" + value[1].to_s + "' in another model but with different prefix '" + @@values_by_number[value[1]].to_s + "'" if @@values_by_number.include?(value[1]) && @@values_by_number[value[1]] != value[2] - - # date types are special, mark them so the first model they're seen for - if !@@values_by_number.include?(value[1]) - if value[3] == :date - value_range = Xapian::DateValueRangeProcessor.new(value[1]) - elsif value[3] == :string - value_range = Xapian::StringValueRangeProcessor.new(value[1]) - elsif value[3] == :number - value_range = Xapian::NumberValueRangeProcessor.new(value[1]) - else - raise "Unknown value type '" + value[3].to_s + "'" - end - - @@query_parser.add_valuerangeprocessor(value_range) - - # stop it being garbage collected, as - # add_valuerangeprocessor ref is outside Ruby's GC - @@value_ranges_store.push(value_range) - end + # date types are special, mark them so the first model they're seen for + unless @@values_by_number.include?(index) + case value_type + when :date + value_range = Xapian::DateValueRangeProcessor.new(index) + when :string + value_range = Xapian::StringValueRangeProcessor.new(index) + when :number + value_range = Xapian::NumberValueRangeProcessor.new(index) + else + raise "Unknown value type '#{value_type}'" + end - @@values_by_number[value[1]] = value[2] - @@values_by_prefix[value[2]] = value[1] - end + @@query_parser.add_valuerangeprocessor(value_range) + + # stop it being garbage collected, as + # add_valuerangeprocessor ref is outside Ruby's GC + @@value_ranges_store.push(value_range) + end + + @@values_by_number[index] = prefix + @@values_by_prefix[prefix] = index + end + end + + def self.init_terms(terms) + terms.each do |method, term_code, prefix| + raise "Use a single capital letter for term code" if not term_code.match(/^[A-Z]$/) + raise "M and I are reserved for use as the model/id term" if term_code == "M" || term_code == "I" + raise "model and modelid are reserved for use as the model/id prefixes" if prefix == "model" || prefix == "modelid" + raise "Z is reserved for stemming terms" if term_code == "Z" + if @@terms_by_capital.include?(term_code) && @@terms_by_capital[term_code] != prefix + raise "Already have code '#{term_code}' in another model but with different prefix " \ + "'#{@@terms_by_capital[term_code]}'" end + @@terms_by_capital[term_code] = prefix + # TODO: use boolean here so doesn't stem our URL names in WhatDoTheyKnow + # If making acts_as_xapian generic, would really need to make the :terms have + # another option that lets people choose non-boolean for terms that need it + # (i.e. searching explicitly within a free text field) + @@query_parser.add_boolean_prefix(prefix, term_code) end end - def ActsAsXapian.writable_init(suffix = "") + def self.writable_init(suffix = "") raise NoXapianRubyBindingsError.new("Xapian Ruby bindings not installed") unless ActsAsXapian.bindings_available raise "acts_as_xapian hasn't been called in any models" if @@init_values.empty? @@ -256,7 +260,7 @@ module ActsAsXapian # for indexing @@writable_db = Xapian::WritableDatabase.new(full_path, Xapian::DB_CREATE_OR_OPEN) @@enquire = Xapian::Enquire.new(@@writable_db) - @@term_generator = Xapian::TermGenerator.new() + @@term_generator = Xapian::TermGenerator.new @@term_generator.set_flags(Xapian::TermGenerator::FLAG_SPELLING, 0) @@term_generator.database = @@writable_db @@term_generator.stemmer = @@stemmer @@ -332,7 +336,7 @@ module ActsAsXapian delay *= 2 delay = MSET_MAX_DELAY if delay > MSET_MAX_DELAY - ActsAsXapian.db.reopen() + ActsAsXapian.db.reopen retry else raise @@ -558,7 +562,7 @@ module ActsAsXapian matches = ActsAsXapian.enquire.mset(0, 100, 100) # TODO: so this whole method will only work with 100 docs # Get set of relevant terms for those documents - selection = Xapian::RSet.new() + selection = Xapian::RSet.new iter = matches._begin while not iter.equals(matches._end) selection.add_document(iter) @@ -610,30 +614,29 @@ module ActsAsXapian # flush your changes. Specifying flush will reduce performance, but make # sure that each index update is definitely saved to disk before # logging in the database that it has been. - def ActsAsXapian.update_index(flush = false, verbose = false) + def self.update_index(flush = false, verbose = false) # STDOUT.puts("start of ActsAsXapian.update_index") if verbose # Before calling writable_init we have to make sure every model class has been initialized. # i.e. has had its class code loaded, so acts_as_xapian has been called inside it, and # we have the info from acts_as_xapian. - model_classes = ActsAsXapianJob.find_by_sql("select model from acts_as_xapian_jobs group by model").map {|a| a.model.constantize} + model_classes = ActsAsXapianJob.pluck("DISTINCT model").map { |a| a.constantize } # If there are no models in the queue, then nothing to do - return if model_classes.size == 0 + return if model_classes.empty? ActsAsXapian.writable_init # Abort if full rebuild is going on new_path = ActsAsXapian.db_path + ".new" if File.exist?(new_path) - raise "aborting incremental index update while full index rebuild happens; found existing " + new_path + raise "aborting incremental index update while full index rebuild happens; found existing #{new_path}" end - ids_to_refresh = ActsAsXapianJob.find(:all).map() { |i| i.id } - for id in ids_to_refresh + ActsAsXapianJob.pluck(:id).each do |id| job = nil begin ActiveRecord::Base.transaction do begin - job = ActsAsXapianJob.find(id, :lock =>true) + job = ActsAsXapianJob.find(id, :lock => true) rescue ActiveRecord::RecordNotFound => e # This could happen if while we are working the model # was updated a second time by another process. In that case @@ -642,30 +645,7 @@ module ActsAsXapian #STDERR.puts("job with #{id} vanished under foot") if verbose next end - STDOUT.puts("ActsAsXapian.update_index #{job.action} #{job.model} #{job.model_id.to_s} #{Time.now.to_s}") if verbose - - begin - if job.action == 'update' - # TODO: Index functions may reference other models, so we could eager load here too? - model = job.model.constantize.find(job.model_id) # :include => cls.constantize.xapian_options[:include] - model.xapian_index - elsif job.action == 'destroy' - # Make dummy model with right id, just for destruction - model = job.model.constantize.new - model.id = job.model_id - model.xapian_destroy - else - raise "unknown ActsAsXapianJob action '" + job.action + "'" - end - rescue ActiveRecord::RecordNotFound => e - # this can happen if the record was hand deleted in the database - job.action = 'destroy' - retry - end - if flush - ActsAsXapian.writable_db.flush - end - job.destroy + run_job(job, flush, verbose) end rescue => detail # print any error, and carry on so other things are indexed @@ -678,7 +658,34 @@ module ActsAsXapian ActsAsXapian.writable_db.close end - def ActsAsXapian._is_xapian_db(path) + def self.run_job(job, flush, verbose) + STDOUT.puts("ActsAsXapian.update_index #{job.action} #{job.model} #{job.model_id.to_s} #{Time.now.to_s}") if verbose + + begin + if job.action == 'update' + # TODO: Index functions may reference other models, so we could eager load here too? + model = job.model.constantize.find(job.model_id) # :include => cls.constantize.xapian_options[:include] + model.xapian_index + elsif job.action == 'destroy' + # Make dummy model with right id, just for destruction + model = job.model.constantize.new + model.id = job.model_id + model.xapian_destroy + else + raise "unknown ActsAsXapianJob action '#{job.action}'" + end + rescue ActiveRecord::RecordNotFound => e + # this can happen if the record was hand deleted in the database + job.action = 'destroy' + retry + end + if flush + ActsAsXapian.writable_db.flush + end + job.destroy + end + + def self._is_xapian_db(path) is_db = File.exist?(File.join(path, "iamflint")) || File.exist?(File.join(path, "iamchert")) return is_db end @@ -690,7 +697,7 @@ module ActsAsXapian # happens (i.e. while the .new database is there) - any index update jobs # are left in the database, and will run after the rebuild has finished. - def ActsAsXapian.rebuild_index(model_classes, verbose = false, terms = true, values = true, texts = true, safe_rebuild = true) + def self.rebuild_index(model_classes, verbose = false, terms = true, values = true, texts = true, safe_rebuild = true) #raise "when rebuilding all, please call as first and only thing done in process / task" if not ActsAsXapian.writable_db.nil? prepare_environment @@ -751,7 +758,7 @@ module ActsAsXapian @@db_path = old_path end - def ActsAsXapian._rebuild_index_safely(model_classes, verbose, terms, values, texts) + def self._rebuild_index_safely(model_classes, verbose, terms, values, texts) batch_size = 1000 for model_class in model_classes model_class_count = model_class.count diff --git a/lib/acts_as_xapian/tasks/xapian.rake b/lib/acts_as_xapian/tasks/xapian.rake index c1986ce1e..52d94011a 100644 --- a/lib/acts_as_xapian/tasks/xapian.rake +++ b/lib/acts_as_xapian/tasks/xapian.rake @@ -9,7 +9,7 @@ namespace :xapian do # "verbose=true" to print model name as it is run. desc 'Updates Xapian search index with changes to models since last call' task :update_index => :environment do - ActsAsXapian.update_index(ENV['flush'] ? true : false, ENV['verbose'] ? true : false) + ActsAsXapian.update_index(ENV['flush'], ENV['verbose']) end # Parameters - specify 'models="PublicBody User"' to say which models diff --git a/lib/alaveteli_external_command.rb b/lib/alaveteli_external_command.rb index ddf968f90..36a709c16 100644 --- a/lib/alaveteli_external_command.rb +++ b/lib/alaveteli_external_command.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'external_command' module AlaveteliExternalCommand diff --git a/lib/alaveteli_file_types.rb b/lib/alaveteli_file_types.rb index 617048c05..2b5aa3efb 100644 --- a/lib/alaveteli_file_types.rb +++ b/lib/alaveteli_file_types.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AlaveteliFileTypes # To add an image, create a file with appropriate name corresponding to the # mime type in public/images e.g. icon_image_tiff_large.png @@ -87,4 +88,4 @@ class AlaveteliFileTypes return nil end end -end
\ No newline at end of file +end diff --git a/lib/alaveteli_localization.rb b/lib/alaveteli_localization.rb index 2b6978c92..6e9dbeac3 100644 --- a/lib/alaveteli_localization.rb +++ b/lib/alaveteli_localization.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class AlaveteliLocalization class << self def set_locales(available_locales, default_locale) diff --git a/lib/alaveteli_text_masker.rb b/lib/alaveteli_text_masker.rb index 68ff0d318..49dd15ae5 100644 --- a/lib/alaveteli_text_masker.rb +++ b/lib/alaveteli_text_masker.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module AlaveteliTextMasker extend self DoNotBinaryMask = [ 'image/tiff', @@ -7,6 +8,21 @@ module AlaveteliTextMasker 'image/bmp', 'application/zip' ] + TextMask = [ 'text/css', + 'text/csv', + 'text/html', + 'text/plain', + 'text/rfc822-headers', + 'text/rtf', + 'text/tab-separated-values', + 'text/x-c', + 'text/x-diff', + 'text/x-fortran', + 'text/x-mail', + 'text/xml', + 'text/x-pascal', + 'text/x-vcard' ] + # Replaces all email addresses in (possibly binary) data # Also applies custom masks and censor items def apply_masks!(text, content_type, options = {}) @@ -18,7 +34,7 @@ module AlaveteliTextMasker case content_type when *DoNotBinaryMask # do nothing - when 'text/html' + when *TextMask apply_text_masks!(text, options) when 'application/pdf' apply_pdf_masks!(text, options) @@ -28,9 +44,7 @@ module AlaveteliTextMasker end def apply_pdf_masks!(text, options = {}) - uncompressed_text = nil - uncompressed_text = AlaveteliExternalCommand.run("pdftk", "-", "output", "-", "uncompress", - :stdin_string => text) + uncompressed_text = uncompress_pdf(text) # if we managed to uncompress the PDF... if !uncompressed_text.blank? # then censor stuff (making a copy so can compare again in a bit) @@ -39,19 +53,13 @@ module AlaveteliTextMasker # if the censor rule removed something... if censored_uncompressed_text != uncompressed_text # then use the altered file (recompressed) - recompressed_text = nil - if AlaveteliConfiguration::use_ghostscript_compression == true - command = ["gs", "-sDEVICE=pdfwrite", "-dCompatibilityLevel=1.4", "-dPDFSETTINGS=/screen", "-dNOPAUSE", "-dQUIET", "-dBATCH", "-sOutputFile=-", "-"] - else - command = ["pdftk", "-", "output", "-", "compress"] - end - recompressed_text = AlaveteliExternalCommand.run(*(command + [{:stdin_string=>censored_uncompressed_text}])) + recompressed_text = compress_pdf(censored_uncompressed_text) if recompressed_text.blank? # buggy versions of pdftk sometimes fail on # compression, I don't see it's a disaster in # these cases to save an uncompressed version? recompressed_text = censored_uncompressed_text - logger.warn "Unable to compress PDF; problem with your pdftk version?" + Rails.logger.warn "Unable to compress PDF; problem with your pdftk version?" end if !recompressed_text.blank? text.replace recompressed_text @@ -62,10 +70,31 @@ module AlaveteliTextMasker private + def uncompress_pdf(text) + AlaveteliExternalCommand.run("pdftk", "-", "output", "-", "uncompress", :stdin_string => text) + end + + def compress_pdf(text) + if AlaveteliConfiguration::use_ghostscript_compression + command = ["gs", + "-sDEVICE=pdfwrite", + "-dCompatibilityLevel=1.4", + "-dPDFSETTINGS=/screen", + "-dNOPAUSE", + "-dQUIET", + "-dBATCH", + "-sOutputFile=-", + "-"] + else + command = ["pdftk", "-", "output", "-", "compress"] + end + AlaveteliExternalCommand.run(*(command + [ :stdin_string => text ])) + end + # Replace text in place def apply_binary_masks!(text, options = {}) # Keep original size, so can check haven't resized it - orig_size = text.mb_chars.size + orig_size = text.size # Replace ASCII email addresses... text.gsub!(MySociety::Validate.email_find_regexp) do |email| @@ -100,7 +129,7 @@ module AlaveteliTextMasker # Replace censor items censor_rules = options[:censor_rules] || [] censor_rules.each{ |censor_rule| censor_rule.apply_to_binary!(text) } - raise "internal error in apply_binary_masks!" if text.mb_chars.size != orig_size + raise "internal error in apply_binary_masks!" if text.size != orig_size return text end diff --git a/lib/attachment_to_html/adapter.rb b/lib/attachment_to_html/adapter.rb new file mode 100644 index 000000000..ac8a16411 --- /dev/null +++ b/lib/attachment_to_html/adapter.rb @@ -0,0 +1,67 @@ +module AttachmentToHTML + class Adapter + attr_reader :attachment + + # Public: Initialize a converter + # + # attachment - the FoiAttachment to convert to HTML + # opts - a Hash of options (default: {}): + # No options currently accepted + def initialize(attachment, opts = {}) + @attachment = attachment + end + + # Public: The title to use in the <title> tag + # + # Returns a String + def title + @title ||= attachment.display_filename + end + + # Public: The contents of the extracted html <body> tag + # + # Returns a String + def body + @body ||= parse_body + end + + def parse_body + convert + end + + # Public: Was the document conversion successful? + # + # Returns true + def success? + true + end + + def has_content? + !body.gsub(/\s+/,"").gsub(/\<[^\>]*\>/, "").empty? + end + + def contains_images? + body.match(/<img[^>]*>/mi) + end + + def create_tempfile(text) + tempfile = if RUBY_VERSION.to_f >= 1.9 + Tempfile.new('foiextract', '.', :encoding => text.encoding) + else + Tempfile.new('foiextract', '.') + end + tempfile.print(text) + tempfile.flush + tempfile + end + + def cleanup_tempfile(tempfile) + tempfile.close + tempfile.delete + end + + def attachment_body + @attachment_body ||= attachment.default_body + end + end +end diff --git a/lib/attachment_to_html/adapters/could_not_convert.rb b/lib/attachment_to_html/adapters/could_not_convert.rb index 8e4bf39dc..745a54114 100644 --- a/lib/attachment_to_html/adapters/could_not_convert.rb +++ b/lib/attachment_to_html/adapters/could_not_convert.rb @@ -1,49 +1,15 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML module Adapters - class CouldNotConvert - - attr_reader :attachment - - # Public: Initialize a PDF converter - # - # attachment - the FoiAttachment to convert to HTML - # opts - a Hash of options (default: {}): - # No options currently accepted - def initialize(attachment, opts = {}) - @attachment = attachment - end - - # Public: The title to use in the <title> tag - # - # Returns a String - def title - @title ||= attachment.display_filename - end - - # Public: The contents of the extracted html <body> tag - # - # Returns a String - def body - @body ||= parse_body - end - - - # Public: Was the document conversion successful? - # As this is a fallback option and not doing anything dynamic - # we're assuming this is successful whatever the case - # - # Returns true - def success? - true - end - + # As this is a fallback option and not doing anything dynamic + # we're assuming this is successful whatever the case + class CouldNotConvert < Adapter private def parse_body "<p>Sorry, we were unable to convert this file to HTML. " \ "Please use the download link at the top right.</p>" end - end end -end
\ No newline at end of file +end diff --git a/lib/attachment_to_html/adapters/google_docs_viewer.rb b/lib/attachment_to_html/adapters/google_docs_viewer.rb index 991fbb757..0817d08fd 100644 --- a/lib/attachment_to_html/adapters/google_docs_viewer.rb +++ b/lib/attachment_to_html/adapters/google_docs_viewer.rb @@ -1,9 +1,14 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML module Adapters # Renders the attachment in a Google Docs Viewer - class GoogleDocsViewer - - attr_reader :attachment, :attachment_url + # + # We can't really tell whether the document conversion has been + # successful as such; We're assuming that given a correctly + # constructed iframe (which is tested) that Google will make this + # Just Work. + class GoogleDocsViewer < Adapter + attr_reader :attachment_url # Public: Initialize a GoogleDocsViewer converter # @@ -12,35 +17,10 @@ module AttachmentToHTML # :attachment_url - a String url to the attachment for # Google to render (default: nil) def initialize(attachment, opts = {}) - @attachment = attachment + super @attachment_url = opts.fetch(:attachment_url, nil) end - # Public: The title to use in the <title> tag - # - # Returns a String - def title - @title ||= attachment.display_filename - end - - # Public: The contents of the extracted html <body> tag - # - # Returns a String - def body - @body ||= parse_body - end - - # Public: Was the document conversion successful? - # We can't really tell whether the document conversion has been - # successful as such; We're assuming that given a correctly - # constructed iframe (which is tested) that Google will make this - # Just Work. - # - # Returns true - def success? - true - end - private def parse_body @@ -50,7 +30,6 @@ module AttachmentToHTML def protocol AlaveteliConfiguration.force_ssl ? 'https' : 'http' end - end end end diff --git a/lib/attachment_to_html/adapters/pdf.rb b/lib/attachment_to_html/adapters/pdf.rb index a010b0342..afc8fbcb0 100644 --- a/lib/attachment_to_html/adapters/pdf.rb +++ b/lib/attachment_to_html/adapters/pdf.rb @@ -1,10 +1,11 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML module Adapters # Convert application/pdf documents in to HTML - class PDF + class PDF < Adapter TOO_MANY_IMAGES = 51 - attr_reader :attachment, :tmpdir + attr_reader :tmpdir # Public: Initialize a PDF converter # @@ -13,24 +14,10 @@ module AttachmentToHTML # :tmpdir - String name of directory to store the # converted document def initialize(attachment, opts = {}) - @attachment = attachment + super @tmpdir = opts.fetch(:tmpdir, ::Rails.root.join('tmp')) end - # Public: The title to use in the <title> tag - # - # Returns a String - def title - @title ||= attachment.display_filename - end - - # Public: The contents of the extracted html <body> tag - # - # Returns a String - def body - @body ||= parse_body - end - # Public: Was the document conversion successful? # # Returns a Boolean @@ -47,14 +34,6 @@ module AttachmentToHTML match ? match[1] : '' end - def has_content? - !body.gsub(/\s+/,"").gsub(/\<[^\>]*\>/, "").empty? - end - - def contains_images? - body.match(/<img[^>]*>/mi) ? true : false - end - # Works around https://bugs.freedesktop.org/show_bug.cgi?id=77932 in pdftohtml def contains_too_many_images? number_of_images_in_body >= TOO_MANY_IMAGES @@ -81,28 +60,6 @@ module AttachmentToHTML html end end - - def create_tempfile(text) - tempfile = if RUBY_VERSION.to_f >= 1.9 - Tempfile.new('foiextract', '.', - :encoding => text.encoding) - else - Tempfile.new('foiextract', '.') - end - tempfile.print(text) - tempfile.flush - tempfile - end - - def cleanup_tempfile(tempfile) - tempfile.close - tempfile.delete - end - - def attachment_body - @attachment_body ||= attachment.body - end - end end end diff --git a/lib/attachment_to_html/adapters/rtf.rb b/lib/attachment_to_html/adapters/rtf.rb index 95f499689..4a08bf618 100644 --- a/lib/attachment_to_html/adapters/rtf.rb +++ b/lib/attachment_to_html/adapters/rtf.rb @@ -1,9 +1,10 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML module Adapters # Convert application/rtf documents in to HTML - class RTF + class RTF < Adapter - attr_reader :attachment, :tmpdir + attr_reader :tmpdir # Public: Initialize a RTF converter # @@ -12,24 +13,10 @@ module AttachmentToHTML # :tmpdir - String name of directory to store the # converted document def initialize(attachment, opts = {}) - @attachment = attachment + super @tmpdir = opts.fetch(:tmpdir, ::Rails.root.join('tmp')) end - # Public: The title to use in the <title> tag - # - # Returns a String - def title - @title ||= attachment.display_filename - end - - # Public: The contents of the extracted html <body> tag - # - # Returns a String - def body - @body ||= parse_body - end - # Public: Was the document conversion successful? # # Returns a Boolean @@ -44,14 +31,6 @@ module AttachmentToHTML match ? match[1] : '' end - def has_content? - !body.gsub(/\s+/,"").gsub(/\<[^\>]*\>/, "").empty? - end - - def contains_images? - body.match(/<img[^>]*>/mi) ? true : false - end - def convert # Get the attachment body outside of the chdir call as getting # the body may require opening files too @@ -82,28 +61,6 @@ module AttachmentToHTML end html end - - def create_tempfile(text) - tempfile = if RUBY_VERSION.to_f >= 1.9 - Tempfile.new('foiextract', '.', - :encoding => text.encoding) - else - Tempfile.new('foiextract', '.') - end - tempfile.print(text) - tempfile.flush - tempfile - end - - def cleanup_tempfile(tempfile) - tempfile.close - tempfile.delete - end - - def attachment_body - @attachment_body ||= attachment.body - end - end end end diff --git a/lib/attachment_to_html/adapters/text.rb b/lib/attachment_to_html/adapters/text.rb index e99183f0e..61e4e57a8 100644 --- a/lib/attachment_to_html/adapters/text.rb +++ b/lib/attachment_to_html/adapters/text.rb @@ -1,33 +1,8 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML module Adapters # Convert text/plain documents in to HTML - class Text - - attr_reader :attachment - - # Public: Initialize a Text converter - # - # attachment - the FoiAttachment to convert to HTML - # opts - a Hash of options (default: {}): - # No options currently accepted - def initialize(attachment, opts = {}) - @attachment = attachment - end - - # Public: The title to use in the <title> tag - # - # Returns a String - def title - @title ||= attachment.display_filename - end - - # Public: The contents of the extracted html <body> tag - # - # Returns a String - def body - @body ||= parse_body - end - + class Text < Adapter # Public: Was the document conversion successful? # # Returns a Boolean @@ -43,19 +18,6 @@ module AttachmentToHTML text = MySociety::Format.make_clickable(text) text = text.gsub(/\n/, '<br>') end - - def parse_body - convert - end - - def has_content? - !body.gsub(/\s+/,"").gsub(/\<[^\>]*\>/, "").empty? - end - - def contains_images? - body.match(/<img[^>]*>/mi) ? true : false - end - end end end diff --git a/lib/attachment_to_html/attachment_to_html.rb b/lib/attachment_to_html/attachment_to_html.rb index 2f7c08264..2e8d35ca9 100644 --- a/lib/attachment_to_html/attachment_to_html.rb +++ b/lib/attachment_to_html/attachment_to_html.rb @@ -1,5 +1,8 @@ +# -*- encoding : utf-8 -*- require 'view' +require 'attachment_to_html/adapter' + Dir[File.dirname(__FILE__) + '/adapters/*.rb'].each do |file| require file end diff --git a/lib/attachment_to_html/view.rb b/lib/attachment_to_html/view.rb index e6991d44e..0d5b205b7 100644 --- a/lib/attachment_to_html/view.rb +++ b/lib/attachment_to_html/view.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module AttachmentToHTML class View < ERB diff --git a/lib/confidence_intervals.rb b/lib/confidence_intervals.rb index 9fe38045a..83f736c63 100644 --- a/lib/confidence_intervals.rb +++ b/lib/confidence_intervals.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Calculate the confidence interval for a samples from a binonial # distribution using Wilson's score interval. For more theoretical # details, please see: diff --git a/lib/configuration.rb b/lib/configuration.rb index 90fd30d5f..ab7d1a65c 100644 --- a/lib/configuration.rb +++ b/lib/configuration.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.dirname(__FILE__) + '/../commonlib/rblib/config' # Load intial mySociety config @@ -32,8 +33,9 @@ module AlaveteliConfiguration :DISABLE_EMERGENCY_USER => false, :DOMAIN => 'localhost:3000', :DONATION_URL => '', - :EXCEPTION_NOTIFICATIONS_FROM => '', - :EXCEPTION_NOTIFICATIONS_TO => '', + :ENABLE_WIDGETS => false, + :EXCEPTION_NOTIFICATIONS_FROM => 'errors@localhost', + :EXCEPTION_NOTIFICATIONS_TO => 'user-support@localhost', :FORCE_REGISTRATION_ON_NEW_REQUEST => false, :FORCE_SSL => true, :FORWARD_NONBOUNCE_RESPONSES_TO => 'user-support@localhost', @@ -52,6 +54,7 @@ module AlaveteliConfiguration :MTA_LOG_TYPE => 'exim', :NEW_RESPONSE_REMINDER_AFTER_DAYS => [3, 10, 24], :OVERRIDE_ALL_PUBLIC_BODY_REQUEST_EMAILS => '', + :PRODUCTION_MAILER_DELIVERY_METHOD => 'sendmail', :PUBLIC_BODY_STATISTICS_PAGE => false, :PUBLIC_BODY_LIST_FALLBACK_TO_DEFAULT_LOCALE => false, :RAW_EMAILS_LOCATION => 'files/raw_emails', @@ -63,6 +66,13 @@ module AlaveteliConfiguration :RESPONSIVE_STYLING => true, :SITE_NAME => 'Alaveteli', :SKIP_ADMIN_AUTH => false, + :SMTP_MAILER_ADDRESS => 'localhost', + :SMTP_MAILER_PORT => 25, + :SMTP_MAILER_DOMAIN => '', + :SMTP_MAILER_USER_NAME => '', + :SMTP_MAILER_PASSWORD => '', + :SMTP_MAILER_AUTHENTICATION => 'plain', + :SMTP_MAILER_ENABLE_STARTTLS_AUTO => true, :SPECIAL_REPLY_VERY_LATE_AFTER_DAYS => 60, :THEME_BRANCH => false, :THEME_URL => "", @@ -78,10 +88,11 @@ module AlaveteliConfiguration :UTILITY_SEARCH_PATH => ["/usr/bin", "/usr/local/bin"], :VARNISH_HOST => '', :WORKING_OR_CALENDAR_DAYS => 'working', + :USE_BULLET_IN_DEVELOPMENT => false } - end + end - def AlaveteliConfiguration.method_missing(name) + def self.method_missing(name) key = name.to_s.upcase if DEFAULTS.has_key?(key.to_sym) MySociety::Config.get(key, DEFAULTS[key.to_sym]) diff --git a/lib/date_quarter.rb b/lib/date_quarter.rb index ac159b420..b8cb03593 100644 --- a/lib/date_quarter.rb +++ b/lib/date_quarter.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module DateQuarter extend self diff --git a/lib/generators/acts_as_xapian/acts_as_xapian_generator.rb b/lib/generators/acts_as_xapian/acts_as_xapian_generator.rb index 434c02cb5..0e525d868 100644 --- a/lib/generators/acts_as_xapian/acts_as_xapian_generator.rb +++ b/lib/generators/acts_as_xapian/acts_as_xapian_generator.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'rails/generators/active_record/migration' class ActsAsXapianGenerator < Rails::Generators::Base diff --git a/lib/generators/acts_as_xapian/templates/migration.rb b/lib/generators/acts_as_xapian/templates/migration.rb index 84a9dd766..b390cd933 100644 --- a/lib/generators/acts_as_xapian/templates/migration.rb +++ b/lib/generators/acts_as_xapian/templates/migration.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- class CreateActsAsXapian < ActiveRecord::Migration def self.up create_table :acts_as_xapian_jobs do |t| diff --git a/lib/has_tag_string/has_tag_string.rb b/lib/has_tag_string/has_tag_string.rb index c28720f04..42d6c8898 100644 --- a/lib/has_tag_string/has_tag_string.rb +++ b/lib/has_tag_string/has_tag_string.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # lib/has_tag_string.rb: # Lets a model have tags, represented as space separate strings in a public # interface, but stored in the database as keys. Each tag can have a value @@ -31,7 +32,7 @@ module HasTagString # Parses a text version of one single tag, such as "a:b" and returns # the name and value, with nil for value if there isn't one. - def HasTagStringTag.split_tag_into_name_value(tag) + def self.split_tag_into_name_value(tag) sections = tag.split(/:/) name = sections[0] if sections[1] @@ -151,7 +152,7 @@ module HasTagString ###################################################################### # Main entry point, add has_tag_string to your model. module HasMethods - def has_tag_string() + def has_tag_string has_many :tags, :conditions => "model = '" + self.to_s + "'", :foreign_key => "model_id", :class_name => 'HasTagString::HasTagStringTag' include InstanceMethods diff --git a/lib/health_checks/checks/days_ago_check.rb b/lib/health_checks/checks/days_ago_check.rb index 793fff586..3c1cb784f 100644 --- a/lib/health_checks/checks/days_ago_check.rb +++ b/lib/health_checks/checks/days_ago_check.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module HealthChecks module Checks class DaysAgoCheck @@ -19,7 +20,7 @@ module HealthChecks "#{ super }: #{ subject.call }" end - def check + def ok? subject.call >= days.days.ago end diff --git a/lib/health_checks/health_checkable.rb b/lib/health_checks/health_checkable.rb index 5d674ca32..1e324c1c7 100644 --- a/lib/health_checks/health_checkable.rb +++ b/lib/health_checks/health_checkable.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module HealthChecks module HealthCheckable @@ -12,12 +13,8 @@ module HealthChecks self.class.to_s end - def check - raise NotImplementedError - end - def ok? - check ? true : false + raise NotImplementedError end def message diff --git a/lib/health_checks/health_checks.rb b/lib/health_checks/health_checks.rb index 6f0c9de8e..6c98365fc 100644 --- a/lib/health_checks/health_checks.rb +++ b/lib/health_checks/health_checks.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'health_checkable' Dir[File.dirname(__FILE__) + '/checks/*.rb'].each do |file| @@ -31,7 +32,7 @@ module HealthChecks private def assert_valid_check(check) - check.respond_to?(:check) + check.respond_to?(:ok?) end end diff --git a/lib/i18n_fixes.rb b/lib/i18n_fixes.rb index 64c370477..6c7cb8877 100644 --- a/lib/i18n_fixes.rb +++ b/lib/i18n_fixes.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Some of the monkeypatches in this file should possibly be submitted # as patches, but most are here because they should go away when we # upgrade to Rails 3.x diff --git a/lib/languages.rb b/lib/languages.rb index a45071a67..4f51f9bee 100644 --- a/lib/languages.rb +++ b/lib/languages.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- class LanguageNames def self.get_language_name(locale) language_names = { @@ -32,6 +32,7 @@ class LanguageNames 'ce' => 'нохчийн мотт', 'ny' => 'chiCheŵa', 'zh' => '中文 (Zhōngwén)', + 'zh-HK' => '中文(香港)', 'cv' => 'чӑваш чӗлхи', 'kw' => 'Kernewek', 'co' => 'corsu', @@ -188,6 +189,7 @@ class LanguageNames 'zu' => 'isiZulu' } locale = locale.sub("_", "-") # normalize + return language_names[locale] if language_names[locale] main_part = I18n::Locale::Tag::Simple.tag(locale).subtags[0] return language_names[main_part] end diff --git a/lib/mail_handler/backends/mail_backend.rb b/lib/mail_handler/backends/mail_backend.rb index 974873b30..19f502275 100644 --- a/lib/mail_handler/backends/mail_backend.rb +++ b/lib/mail_handler/backends/mail_backend.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'mail' require 'mapi/msg' require 'mapi/convert' @@ -35,7 +36,7 @@ module MailHandler module Backends module MailBackend - def backend() + def backend 'Mail' end @@ -64,7 +65,12 @@ module MailHandler # Return a copy of the file name for the mail part def get_part_file_name(part) part_file_name = part.filename - part_file_name.nil? ? nil : part_file_name.dup + part_file_name = part_file_name.nil? ? nil : part_file_name.dup + if part_file_name + part_file_name = CGI.unescape(part_file_name) + part_file_name = convert_string_to_utf8(part_file_name, part.charset).string + end + part_file_name end # Get the body of a mail part diff --git a/lib/mail_handler/backends/mail_extensions.rb b/lib/mail_handler/backends/mail_extensions.rb index f778cbc14..b39e54d08 100644 --- a/lib/mail_handler/backends/mail_extensions.rb +++ b/lib/mail_handler/backends/mail_extensions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'mail/message' require 'mail/part' require 'mail/fields/common/parameter_hash' @@ -37,7 +38,7 @@ module Mail # Can be removed when we no longer support Ruby 1.8 class Ruby18 - def Ruby18.b_value_decode(str) + def self.b_value_decode(str) match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m) if match encoding = match[1] @@ -55,7 +56,7 @@ module Mail str end - def Ruby18.q_value_decode(str) + def self.q_value_decode(str) match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m) if match encoding = match[1] @@ -75,7 +76,7 @@ module Mail private - def Ruby18.fix_encoding(encoding) + def self.fix_encoding(encoding) case encoding.upcase when 'UTF8' 'UTF-8' @@ -86,7 +87,7 @@ module Mail end class Ruby19 - def Ruby19.b_value_decode(str) + def self.b_value_decode(str) match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m) if match charset = match[1] diff --git a/lib/mail_handler/mail_handler.rb b/lib/mail_handler/mail_handler.rb index 33d939e22..313869d16 100644 --- a/lib/mail_handler/mail_handler.rb +++ b/lib/mail_handler/mail_handler.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Handles the parsing of email require 'tmpdir' @@ -133,7 +134,7 @@ module MailHandler begin zip_file = Zip::ZipFile.open(tempfile.path) text += get_attachment_text_from_zip_file(zip_file) - zip_file.close() + zip_file.close rescue $stderr.puts("Error processing zip file: #{$!.inspect}") end diff --git a/lib/memory_profiler.rb b/lib/memory_profiler.rb index 15e8457ee..fd056dc0d 100644 --- a/lib/memory_profiler.rb +++ b/lib/memory_profiler.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Taken from # http://scottstuff.net/blog/2006/08/17/memory-leak-profiling-with-rails diff --git a/lib/message_prominence.rb b/lib/message_prominence.rb index 8f54fcc95..8f8008784 100644 --- a/lib/message_prominence.rb +++ b/lib/message_prominence.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MessageProminence def has_prominence diff --git a/lib/no_constraint_disabling.rb b/lib/no_constraint_disabling.rb index 32a4a6bfe..539b491b3 100644 --- a/lib/no_constraint_disabling.rb +++ b/lib/no_constraint_disabling.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # In order to work around the problem of the database use not having # the permission to disable referential integrity when loading fixtures, # we redefine disable_referential_integrity so that it doesn't try to diff --git a/lib/normalize_string.rb b/lib/normalize_string.rb index 3b6116970..69853fd6e 100644 --- a/lib/normalize_string.rb +++ b/lib/normalize_string.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'iconv' unless String.method_defined?(:encode) require 'charlock_holmes' @@ -72,6 +73,29 @@ def convert_string_to_utf8_or_binary(s, suggested_character_encoding=nil) result end +class StringConversionResult < Struct.new(:string, :scrubbed) + alias_method :scrubbed?, :scrubbed +end + +def convert_string_to_utf8(s, suggested_character_encoding=nil) + begin + result = normalize_string_to_utf8 s, suggested_character_encoding + StringConversionResult.new(result, false) + rescue EncodingNormalizationError + result = scrub(s) + StringConversionResult.new(result, true) + end +end + +def scrub(string) + if String.method_defined?(:encode) + string = string.force_encoding("utf-8") + string.valid_encoding? ? string : string.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8") + else + Iconv.conv('UTF-8//IGNORE', 'UTF-8', string) + end +end + def log_text_details(message, text) if String.method_defined?(:encode) STDERR.puts "#{message}, we have text: #{text}, of class #{text.class} and encoding #{text.encoding}" diff --git a/lib/public_body_csv.rb b/lib/public_body_csv.rb index afb5d9043..3dab7b805 100644 --- a/lib/public_body_csv.rb +++ b/lib/public_body_csv.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'csv' # Public: Generate a CSV representation of PublicBody instances diff --git a/lib/quiet_opener.rb b/lib/quiet_opener.rb index c6e259b93..9745e22a4 100644 --- a/lib/quiet_opener.rb +++ b/lib/quiet_opener.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'open-uri' require 'net-purge' if RUBY_VERSION.to_f < 2.0 diff --git a/lib/routing_filters.rb b/lib/routing_filters.rb index 5b5da6870..2aad6f437 100644 --- a/lib/routing_filters.rb +++ b/lib/routing_filters.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module RoutingFilter class Conditionallyprependlocale < RoutingFilter::Locale # Override core Locale filter not to prepend locale path segment diff --git a/lib/ruby19.rb b/lib/ruby19.rb deleted file mode 100644 index 39f48d74e..000000000 --- a/lib/ruby19.rb +++ /dev/null @@ -1,8 +0,0 @@ -if RUBY_VERSION.to_f == 1.9 - class String - # @see syck/lib/syck/rubytypes.rb - def is_binary_data? - self.count("\x00-\x7F", "^ -~\t\r\n").fdiv(self.size) > 0.3 || self.index("\x00") unless self.empty? - end - end -end
\ No newline at end of file diff --git a/lib/strip_attributes/strip_attributes.rb b/lib/strip_attributes/strip_attributes.rb index 12350277d..2e4383194 100644 --- a/lib/strip_attributes/strip_attributes.rb +++ b/lib/strip_attributes/strip_attributes.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module StripAttributes # Strips whitespace from model fields and leaves nil values as nil. # TODO: this differs from official StripAttributes, as it doesn't make blank cells null. diff --git a/lib/strip_attributes/test/strip_attributes_test.rb b/lib/strip_attributes/test/strip_attributes_test.rb index 8158dc664..d06ef0671 100644 --- a/lib/strip_attributes/test/strip_attributes_test.rb +++ b/lib/strip_attributes/test/strip_attributes_test.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require "#{File.dirname(__FILE__)}/test_helper" module MockAttributes diff --git a/lib/strip_attributes/test/test_helper.rb b/lib/strip_attributes/test/test_helper.rb index 7d06c40db..6a4f6136a 100644 --- a/lib/strip_attributes/test/test_helper.rb +++ b/lib/strip_attributes/test/test_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'test/unit' require 'rubygems' require 'active_record' @@ -9,7 +10,7 @@ require "#{PLUGIN_ROOT}/init" class ActiveRecord::Base alias_method :save, :valid? - def self.columns() + def self.columns @columns ||= [] end diff --git a/lib/tasks/config_files.rake b/lib/tasks/config_files.rake index 1528d7324..d0dc8f594 100644 --- a/lib/tasks/config_files.rake +++ b/lib/tasks/config_files.rake @@ -11,7 +11,7 @@ namespace :config_files do var = $1.to_sym replacement = replacements[var] if replacement == nil - raise "Unhandled variable in .ugly file: $#{var}" + raise "Unhandled variable in example file: $#{var}" else replacements[var] end @@ -21,9 +21,25 @@ namespace :config_files do converted_lines end - desc 'Convert Debian .ugly init script in config to a form suitable for installing in /etc/init.d' + desc 'Convert wrapper example in config to a form suitable for running mail handling scripts with rbenv' + task :convert_wrapper => :environment do + example = 'rake config_files:convert_wrapper DEPLOY_USER=deploy SCRIPT_FILE=config/run-with-rbenv-path.example' + check_for_env_vars(['DEPLOY_USER', + 'SCRIPT_FILE'], example) + + replacements = { + :user => ENV['DEPLOY_USER'], + } + + # Generate the template for potential further processing + convert_ugly(ENV['SCRIPT_FILE'], replacements).each do |line| + puts line + end + end + + desc 'Convert Debian example init script in config to a form suitable for installing in /etc/init.d' task :convert_init_script => :environment do - example = 'rake config_files:convert_init_script DEPLOY_USER=deploy VHOST_DIR=/dir/above/alaveteli VCSPATH=alaveteli SITE=alaveteli SCRIPT_FILE=config/alert-tracks-debian.ugly' + example = 'rake config_files:convert_init_script DEPLOY_USER=deploy VHOST_DIR=/dir/above/alaveteli VCSPATH=alaveteli SITE=alaveteli SCRIPT_FILE=config/alert-tracks-debian.example' check_for_env_vars(['DEPLOY_USER', 'VHOST_DIR', 'SCRIPT_FILE'], example) @@ -37,7 +53,7 @@ namespace :config_files do } # Use the filename for the $daemon_name ugly variable - daemon_name = File.basename(ENV['SCRIPT_FILE'], '-debian.ugly') + daemon_name = File.basename(ENV['SCRIPT_FILE'], '-debian.example') replacements.update(:daemon_name => "#{ replacements[:site] }-#{ daemon_name }") # Generate the template for potential further processing @@ -57,7 +73,7 @@ namespace :config_files do end end - desc 'Convert Debian .ugly crontab file in config to a form suitable for installing in /etc/cron.d' + desc 'Convert Debian example crontab file in config to a form suitable for installing in /etc/cron.d' task :convert_crontab => :environment do example = 'rake config_files:convert_crontab DEPLOY_USER=deploy VHOST_DIR=/dir/above/alaveteli VCSPATH=alaveteli SITE=alaveteli CRONTAB=config/crontab-example MAILTO=cron-alaveteli@example.org' check_for_env_vars(['DEPLOY_USER', diff --git a/lib/tasks/temp.rake b/lib/tasks/temp.rake index 67fa10174..d5f7e8b22 100644 --- a/lib/tasks/temp.rake +++ b/lib/tasks/temp.rake @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- namespace :temp do @@ -37,4 +38,99 @@ namespace :temp do end + desc 'Look for and fix invalid UTF-8 text in various models. Should be run under ruby 1.9 or above' + task :fix_invalid_utf8 => :environment do + + dryrun = ENV['DRYRUN'] != '0' + if dryrun + $stderr.puts "This is a dryrun - nothing will be changed" + end + + + PublicBody.find_each do |public_body| + unless public_body.name.valid_encoding? + name = convert_string_to_utf8(public_body.name) + puts "Bad encoding in PublicBody name, id: #{public_body.id}, " \ + "old name: #{public_body.name.force_encoding('UTF-8')}, new name #{name}" + unless dryrun + public_body.name_will_change! + public_body.name = name + public_body.last_edit_editor = 'system' + public_body.last_edit_comment = 'Invalid utf-8 encoding fixed by temp:fix_invalid_utf8' + public_body.save! + end + end + + # Editing old versions of public bodies - we don't want to affect the timestamp + PublicBody::Version.record_timestamps = false + public_body.versions.each do |public_body_version| + unless public_body_version.name.valid_encoding? + name = convert_string_to_utf8(public_body_version.name).string + puts "Bad encoding in PublicBody::Version name, " \ + "id: #{public_body_version.id}, old name: #{public_body_version.name.force_encoding('UTF-8')}, " \ + "new name: #{name}" + unless dryrun + public_body_version.name_will_change! + public_body_version.name = name + public_body_version.save! + end + end + end + PublicBody::Version.record_timestamps = true + + end + + IncomingMessage.find_each do |incoming_message| + if (incoming_message.cached_attachment_text_clipped && + !incoming_message.cached_attachment_text_clipped.valid_encoding?) || + (incoming_message.cached_main_body_text_folded && + !incoming_message.cached_main_body_text_folded.valid_encoding?) || + (incoming_message.cached_main_body_text_unfolded && + !incoming_message.cached_main_body_text_unfolded.valid_encoding?) + puts "Bad encoding in IncomingMessage cached fields, :id #{incoming_message.id} " + unless dryrun + incoming_message.clear_in_database_caches! + end + end + end + + FoiAttachment.find_each do |foi_attachment| + unescaped_filename = CGI.unescape(foi_attachment.filename) + unless unescaped_filename.valid_encoding? + filename = convert_string_to_utf8(unescaped_filename).string + puts "Bad encoding in FoiAttachment filename, id: #{foi_attachment.id} " \ + "old filename #{unescaped_filename.force_encoding('UTF-8')}, new filename #{filename}" + unless dryrun + foi_attachment.filename = filename + foi_attachment.save! + end + end + end + + OutgoingMessage.find_each do |outgoing_message| + unless outgoing_message.raw_body.valid_encoding? + + raw_body = convert_string_to_utf8(outgoing_message.raw_body).string + puts "Bad encoding in OutgoingMessage raw_body, id: #{outgoing_message.id} " \ + "old raw_body: #{outgoing_message.raw_body.force_encoding('UTF-8')}, new raw_body: #{raw_body}" + unless dryrun + outgoing_message.body = raw_body + outgoing_message.save! + end + end + end + + User.find_each do |user| + unless user.name.valid_encoding? + name = convert_string_to_utf8(user.name).string + puts "Bad encoding in User name, id: #{user.id}, " \ + "old name: #{user.name.force_encoding('UTF-8')}, new name: #{name}" + unless dryrun + user.name = name + user.save! + end + end + end + + end end diff --git a/lib/tasks/usage.rb b/lib/tasks/usage.rb index d6aac454d..350a6b07e 100644 --- a/lib/tasks/usage.rb +++ b/lib/tasks/usage.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module Usage def usage_message message @@ -23,4 +24,4 @@ module Usage end end -end
\ No newline at end of file +end diff --git a/lib/theme.rb b/lib/theme.rb index 4f03b5d99..f2d4ba8b3 100644 --- a/lib/theme.rb +++ b/lib/theme.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- def theme_url_to_theme_name(theme_url) File.basename theme_url, '.git' end diff --git a/lib/use_spans_for_errors.rb b/lib/use_spans_for_errors.rb index 135453f78..ecc117964 100644 --- a/lib/use_spans_for_errors.rb +++ b/lib/use_spans_for_errors.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Monkeypatch! Use SPAN instead of DIV. # # Rails core refuse to fix this properly, by making it an official option. diff --git a/lib/whatdotheyknow/strip_empty_sessions.rb b/lib/whatdotheyknow/strip_empty_sessions.rb index 6d175ca98..1e5078172 100644 --- a/lib/whatdotheyknow/strip_empty_sessions.rb +++ b/lib/whatdotheyknow/strip_empty_sessions.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module WhatDoTheyKnow class StripEmptySessions diff --git a/lib/world_foi_websites.rb b/lib/world_foi_websites.rb index fc2395986..a1e705c82 100644 --- a/lib/world_foi_websites.rb +++ b/lib/world_foi_websites.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # -*- coding: utf-8 -*- class WorldFOIWebsites def self.world_foi_websites @@ -77,7 +78,11 @@ class WorldFOIWebsites {:name => "Слободен пристап", :country_name => "Република Македонија", :country_iso_code => "MK", - :url => "http://www.slobodenpristap.mk/"} + :url => "http://www.slobodenpristap.mk/"}, + {:name => "Imamo pravo znati", + :country_name => "Republika Hrvatska", + :country_iso_code => "HR", + :url => "http://imamopravoznati.org/"} ] return world_foi_websites end diff --git a/lib/xapian_queries.rb b/lib/xapian_queries.rb index b3599740a..dbb17f592 100644 --- a/lib/xapian_queries.rb +++ b/lib/xapian_queries.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module XapianQueries # These methods take some filter criteria expressed in a hash and convert them @@ -76,10 +77,10 @@ module XapianQueries end def make_query_from_params(params) - query = params[:query] || "" if query.nil? + query = params.fetch(:query) { '' } query += get_date_range_from_params(params) query += get_request_variety_from_params(params) query += get_status_from_params(params) - return query + query end end diff --git a/locale/aln/app.po b/locale/aln/app.po index 020d41830..de79ac279 100644 --- a/locale/aln/app.po +++ b/locale/aln/app.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Albanian Gheg (http://www.transifex.com/projects/p/alaveteli/language/aln/)\n" "Language: aln\n" "MIME-Version: 1.0\n" @@ -142,9 +142,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -451,12 +456,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -664,6 +678,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -694,6 +711,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -993,6 +1013,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1062,6 +1085,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1296,6 +1322,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1368,6 +1400,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1473,6 +1508,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1542,6 +1580,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1641,6 +1685,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2096,6 +2143,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2222,9 +2272,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2389,6 +2436,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2404,9 +2454,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2742,6 +2798,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3004,9 +3063,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3212,6 +3277,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3311,6 +3385,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3443,6 +3520,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/app.pot b/locale/app.pot index 5c03a7197..ce52c4273 100644 --- a/locale/app.pot +++ b/locale/app.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: version 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" "PO-Revision-Date: 2011-10-09 01:10+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -139,9 +139,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -448,12 +453,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -661,6 +675,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -691,6 +708,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -990,6 +1010,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1059,6 +1082,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1293,6 +1319,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1365,6 +1397,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1470,6 +1505,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1539,6 +1577,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1638,6 +1682,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2093,6 +2140,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2219,9 +2269,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2386,6 +2433,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2401,9 +2451,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2739,6 +2795,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3001,9 +3060,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3209,6 +3274,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3308,6 +3382,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3440,6 +3517,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/ar/app.po b/locale/ar/app.po index 31ea2703c..2b7cd8078 100644 --- a/locale/ar/app.po +++ b/locale/ar/app.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Arabic (http://www.transifex.com/projects/p/alaveteli/language/ar/)\n" "Language: ar\n" "MIME-Version: 1.0\n" @@ -150,9 +150,18 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>انتهينا! شكراً جزيلاً على المساعدة.</p><p>هنالك <a href=\"{{helpus_url}}\">مزيدٌ من الأشياء التي يمكنكم القيام بها</a> لمساعدة {{site_name}}.</p>" @@ -459,12 +468,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "في انتظار التّصنيف" msgid "Awaiting internal review." msgstr "في انتظار مراجعة داخلية" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "في انتظار الرد" @@ -672,6 +690,9 @@ msgstr "لم يقع التعرف على ملف الصور الذي حملته.و msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -702,6 +723,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "تاخر الاجابة على طلب حرية النفاذ الى المعلومة - " @@ -1005,6 +1029,9 @@ msgstr "قوموا بإعطاء تفاصيل عن شكواكم هنا" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "تسلم بالبريد" @@ -1074,6 +1101,9 @@ msgstr "However, you have the right to request environmental\\n infor msgid "Human health and safety" msgstr "صحة الإنسان و سلامته " +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "ارغب في الحصول على <strong>معلومات جديدة</strong>" @@ -1308,6 +1338,12 @@ msgstr "معلومة غير معتمدة." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "معلومات عن الارسال والتصريف (مثل. ضجيج, طاقة,\\n اشعاعات, بقايا النفايات)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "مطلب المراجعة الداخلية " @@ -1380,6 +1416,9 @@ msgstr "تسجيل الدخول لتحميل ملف مضغوط من {{info_reque msgid "Log into the admin interface" msgstr "سجل دخولك في مجال المشرف" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "تأخير مطول" @@ -1485,6 +1524,9 @@ msgstr "مكان الاسم لا يجب ان بظل فارغا" msgid "Name is already taken" msgstr "تم اخذ الاسم من قبل " +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "مطالب جديدة لحرية النفاذ الى المعلومة" @@ -1554,6 +1596,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "لاحظ أن صاحب الطلب لن يستقبل اشعارا بخصوص ملاحظتك, لأن الطلب تم نشره من قبل {{public_body_name}} نيابة عنهم." @@ -1653,6 +1701,9 @@ msgstr "الرسائل الصادرة|الحالة" msgid "OutgoingMessage|What doing" msgstr "الرسائل الصادرة|ما العمل" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "ناجحة جزئيا." @@ -2112,6 +2163,9 @@ msgstr "اظهار أحدث النتائج أولا" msgid "Refused." msgstr "مرفوض." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2238,9 +2292,6 @@ msgstr "البحث عن مساهمات هذا الشخص" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "البحث عن كلمات في :" - msgid "Search in" msgstr "البحث في " @@ -2409,6 +2460,9 @@ msgstr "موضوع" msgid "Submit" msgstr "اضف" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2424,9 +2478,15 @@ msgstr "الاشتراك في المدونة" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "مطالب حرية النفاذ للمعلومة ناجحة" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "ناجح" @@ -2766,6 +2826,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "هذا طلبك الشخصي, ستبعث لك رسالة الكترونية بصفة الية عندما يصل الرد الجديد." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3036,9 +3099,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "للأسف, لا نملك{{info_request_law_used_full}}\\nعنوانا صالحا ل" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "إلغاء الاشتراك" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "اجابة غير مألوفة" @@ -3252,6 +3321,15 @@ msgstr "ممن يمكنني طلب المعلومة؟" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "وقع سحبها من قبل صاحب الطلب" @@ -3351,6 +3429,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "تستطيع <strong>تقديم شكوى</strong> من خلال" @@ -3483,6 +3564,9 @@ msgstr "بريدك الالكتروني" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/bg/app.po b/locale/bg/app.po index 20798d895..2612edf15 100644 --- a/locale/bg/app.po +++ b/locale/bg/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:13+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Bulgarian (http://www.transifex.com/projects/p/alaveteli/language/bg/)\n" "Language: bg\n" "MIME-Version: 1.0\n" @@ -145,8 +145,13 @@ msgstr "Бъдете <strong>конкретни</strong>, така увелич msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Влезте</a> за да смените паролата, абонаментите или друго (само за {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Ако възнамерявате да ползвате псевдоним,\\n молим <a href=\"{{url}}\">прочетете първо това</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Готово! Много Ви благодарим за помощта!</p><p>Има още <a href=\"{{helpus_url}}\">неща, които можете да направите,</a> за да подпомогнете {{site_name}}.</p>" @@ -454,12 +459,21 @@ msgstr "Имейл на органа:" msgid "Authority:" msgstr "Орган:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Чака класифициране." msgid "Awaiting internal review." msgstr "Чака вътрешно разглеждане." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Чака отговор." @@ -667,6 +681,9 @@ msgstr "Не мога да определя файла с изображение msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Създадено от {{info_request_user}} на {{date}}." @@ -697,6 +714,9 @@ msgstr "Уважаеми {{user_name}}," msgid "Defunct." msgstr "Неработещ." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Закъснява отговорът на Вашето заявление за ДдИ - " @@ -996,6 +1016,9 @@ msgstr "ТУК НАПИШЕТЕ ПОДРОБНОСТИ ЗА ВАШЕТО ОПЛ msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Доставено по пощата." @@ -1065,6 +1088,9 @@ msgstr "Впрочем, Вие имате правото да поискате msgid "Human health and safety" msgstr "Здравеопазване и сигурност" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Аз търся <strong>нова информация</strong>" @@ -1299,6 +1325,12 @@ msgstr "Органът не разполага с такава информац msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Информация за емисии и изтичания (напр. шум, енергии,\\n радиация, замърсяващи продукти)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Заявление за вътрешно разглеждане" @@ -1371,6 +1403,9 @@ msgstr "Влезте за да свалите zip файл на {{info_request_t msgid "Log into the admin interface" msgstr "Влезте в административния панел" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Значително пресрочено." @@ -1476,6 +1511,9 @@ msgstr "Името не може да е празно" msgid "Name is already taken" msgstr "Името вече е заето" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Нови заявления за Достъп до информация" @@ -1545,6 +1583,12 @@ msgstr "Не е валидно Заявление за ДдИ" msgid "Not a valid request" msgstr "Невалидно заявление" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Имайте предвид, че заявителят няма да бъде уведомен за коментара Ви, понеже заявлението бе публикувано от {{public_body_name}} от тяхно име." @@ -1644,6 +1688,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Частично успешно." @@ -2099,6 +2146,9 @@ msgstr "Първо последно описаните резултати" msgid "Refused." msgstr "Отказано." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2225,9 +2275,6 @@ msgstr "Търсене в допринесеното от този потреб msgid "Search for the authorities you'd like information from:" msgstr "Търсене на органите, от които ще искате информация:" -msgid "Search for words in:" -msgstr "Търси думите в:" - msgid "Search in" msgstr "Търсене в" @@ -2392,6 +2439,9 @@ msgstr "Тема:" msgid "Submit" msgstr "Изпрати" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Подаване на заявлението" @@ -2407,9 +2457,15 @@ msgstr "Абониране за блога" msgid "Success" msgstr "Успех" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Успешни Заявления за Достъп до информация" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Успешно." @@ -2745,6 +2801,9 @@ msgstr "Това е първата версия." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Това е Ваше собствено заявление, така че автоматично ще Ви уведомяваме с имейл при пристигане на нови отговори." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Това съобщение беше скрито." @@ -3007,9 +3066,15 @@ msgstr "За съжаление, ние не разполагаме с рабо msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "За съжаление, ние не разполагаме с работещ {{info_request_law_used_full}}\\nадрес за" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Отписване" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Необичаен отговор." @@ -3215,6 +3280,15 @@ msgstr "От кого мога да поискам информация?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Защо конкретно смятате това заявление за неподходящо?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Оттеглено от заявителя." @@ -3314,6 +3388,9 @@ msgstr "Вие вече <a href=\"{{wall_url_user}}\">следите</a> нов msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Вие вече <a href=\"{{wall_url_user}}\">следите</a> новостите за <a href=\"{{successful_requests_url}}\">успешни заявления</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Можете да се <strong>оплачете</strong> като" @@ -3446,6 +3523,9 @@ msgstr "Вашият имейл:" msgid "Your email doesn't look like a valid address" msgstr "Вашият имейл не изглежда да е валиден адрес" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Вашето пояснително съобщение не беше изпратено понеже това заявление беше спряно с цел предотвратяване на спам. Моля <a href=\"{{url}}\">свържете се с нас</a> ако действително искате да изпратите пояснително съобщение." diff --git a/locale/bs/app.po b/locale/bs/app.po index d300b86dc..bd2ad88ba 100644 --- a/locale/bs/app.po +++ b/locale/bs/app.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Bosnian (http://www.transifex.com/projects/p/alaveteli/language/bs/)\n" "Language: bs\n" "MIME-Version: 1.0\n" @@ -167,10 +167,14 @@ msgstr "Držite se <strong>suštine</strong>, lakše ćete dobiti ono što traž msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Prijavite se</a> da biste promijenili password, pretplatu ili drugo ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Ako razmišljate o korištenju pseudonima,\n" -" molimo da<a href=\"{{url}}\">pročitajte prvo ovo</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Završeno! Hvala Vam na pomoći.</p><p>Postoji <a href=\"{{helpus_url}}\">više stvari koje možete uradite</a> da biste pomogli {{site_name}}.</p>" @@ -503,12 +507,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Čeka klasifikaciju." msgid "Awaiting internal review." msgstr "Čeka urgenciju" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Čeka odgovor." @@ -718,6 +731,9 @@ msgstr "Pogrešan format datoteke. Molimo Vas uploadirajte: PNG, JPEG, GIF, ili msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -748,6 +764,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Odgođen odgovor na Vaš Zahtjev o slobodnom pristupu informacijama - " @@ -1056,6 +1075,9 @@ msgstr "OVDJE IZNESITE DETALJE VAŠE ŽALBE" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Riješen poštom." @@ -1131,6 +1153,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Molim za <strong>nove informacije</strong>" @@ -1388,6 +1413,12 @@ msgstr "" "Informacije o emisijama i otpadima (npr. buka, energija,\n" " radijacija, otpadni materijali)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Zahtjev za urgenciju" @@ -1465,6 +1496,9 @@ msgstr "Prijavite se da preuzmete zipovano {{info_request_title}}" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1574,6 +1608,9 @@ msgstr "Ime ne može ostati prazno" msgid "Name is already taken" msgstr "Ime se već koristi" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Novi Zahtjevi za slobodan pristup informacijama" @@ -1643,6 +1680,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1742,6 +1785,9 @@ msgstr "Odlazeća poruka|Status" msgid "OutgoingMessage|What doing" msgstr "Odlazeća poruka|Šta radi" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Djelimično uspješan." @@ -2209,6 +2255,9 @@ msgstr "Nedavno opisani rezultati " msgid "Refused." msgstr "Odbijen." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2335,9 +2384,6 @@ msgstr "Pretraži doprinose od strane ove osobe" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "Pretraži u" @@ -2509,6 +2555,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Predaj" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2524,9 +2573,15 @@ msgstr "Pretplatiti se na blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Uspješni Zahtjevi za slobodan pristup informacijama" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Uspješan." @@ -2886,6 +2941,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ovo je Vaš zahtjev, biti ćete automatski obaviješteni e-mailom kada novi odgovori budu stizali." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3163,9 +3221,15 @@ msgstr "" "Nažalost, ne posjedujemo ispravnu {{info_request_law_used_full}}\n" "adresu za" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Neobičan odgovor." @@ -3389,6 +3453,15 @@ msgstr "Od koga mogu tražiti informacije?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Povučeno od strane podnosioca zahtjeva." @@ -3488,6 +3561,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Možete se <strong>žaliti</strong> tako što ćete" @@ -3631,6 +3707,9 @@ msgstr "Vaš e-mail:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/ca/app.po b/locale/ca/app.po index 8655c600b..752656d96 100644 --- a/locale/ca/app.po +++ b/locale/ca/app.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Catalan (http://www.transifex.com/projects/p/alaveteli/language/ca/)\n" "Language: ca\n" "MIME-Version: 1.0\n" @@ -163,10 +163,13 @@ msgstr "Sigues <strong>específic</strong>, tindràs més probabilitats d'aconse msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Obre una sessió</a> per canviar la teva contrasenya, suscripcions... (només {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Si estàs pensant en utilitzar un pseudònim,\n" -" sisplau <a href=\"{{url}}\">llegeix això abans</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p> Ja està! Moltes gràcies per la teva ajuda.</p><p>Hi ha <a href=\"{{helpus_url}}\">més coses que pots fer</a> per ajudar a {{site_name}}.</p>" @@ -513,12 +516,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Esperant classificació." msgid "Awaiting internal review." msgstr "Esperando revisión interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Esperant resposta." @@ -728,6 +740,9 @@ msgstr "No se pudo procesar la imagen subida. Puedes utilizar PNG, JPEG, GIF u o msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -760,6 +775,9 @@ msgstr "Benvolgut {{user_name}}," msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respuesta retrasada a tu solicitud de acceso a información - " @@ -1070,6 +1088,9 @@ msgstr "DETALLA TU QUEJA AQUÍ" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Resuelta por correo ordinario" @@ -1148,6 +1169,9 @@ msgstr "" msgid "Human health and safety" msgstr "Salud y seguridad" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estoy pidiendo <strong>nueva información</strong>" @@ -1403,6 +1427,12 @@ msgstr "" "Información sobre emisiones (por ejemplo ruido, energía,\n" " radiación, materiales de desecho...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Solicitud de revisión interna" @@ -1481,6 +1511,9 @@ msgstr "Abra una sesión para descargar el fichero ZIP de {{info_request_title}} msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Molt endarrerida." @@ -1589,6 +1622,9 @@ msgstr "El nombre no puede estar vacío" msgid "Name is already taken" msgstr "El nombre ya está siendo utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuevas solicitudes de acceso a información" @@ -1658,6 +1694,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1757,6 +1799,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Èxit parcial." @@ -2223,6 +2268,9 @@ msgstr "Resultados descritos recientemente primero" msgid "Refused." msgstr "Rechazada." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2349,9 +2397,6 @@ msgstr "Cerca aportacions d'aquesta persona" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Buscar palabras en:" - msgid "Search in" msgstr "Buscar en" @@ -2525,6 +2570,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2540,9 +2588,15 @@ msgstr "Subscribirse al blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitudes de acceso a la información con éxito" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Exitosa." @@ -2905,6 +2959,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esta es tu solicitud, por lo que recibirás correos automáticamente cuando lleguen nuevas respuestas." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3186,9 +3243,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Desgraciadamente, no tenemos una dirección de correo válida para" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respuesta no habitual." @@ -3408,6 +3471,15 @@ msgstr "¿A quién puedo solicitar información?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirada por el autor." @@ -3507,6 +3579,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puede <strong>apelar</strong>" @@ -3662,6 +3737,9 @@ msgstr "Correu:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Tu respuesta no ha sido enviada porque esta solicitud ha sido bloqueada para evitar spam. Por favor <a href=\"{{url}}\">contáctanos</a> si realmente quieres enviar una respuesta." diff --git a/locale/cs/app.po b/locale/cs/app.po index fa3d7923d..625601540 100644 --- a/locale/cs/app.po +++ b/locale/cs/app.po @@ -20,9 +20,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-05-07 06:40+0000\n" -"Last-Translator: Jiří Vírava <appukonrad@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Czech (http://www.transifex.com/projects/p/alaveteli/language/cs/)\n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -166,10 +166,14 @@ msgstr "Snažte se svůj dotaz vyjádřit <strong>jasně a jednoduše</strong>, msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Přihlašte se/a> pro změnu hesla, pro odběr zpráv atd., pouze ({{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Pokud chcete používat přezdívku\n" -"please <a href=\"{{url}}\">nejdříve si přečtěte toto</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Hotovo! Děkujeme za vaši pomoc.</p><p>Můžete nám <a href=\"{{helpus_url}}\"> také pomoci se stránkami</a> {{site_name}}</p>" @@ -511,12 +515,21 @@ msgstr "E-mailová adresa instituce" msgid "Authority:" msgstr "Instituce:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Čeká se zařazení." msgid "Awaiting internal review." msgstr "Čeká se na doplnění dotazu." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Čeká se na odpověď." @@ -724,6 +737,9 @@ msgstr "Nahraný soubor nebyl rozeznán. Jsou podporovány soubory s koncovkou P msgid "Create a new account" msgstr "Vytvořit nový účet" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Vytvořeno {{info_request_user}} dne {{date}}." @@ -764,6 +780,9 @@ msgstr "Milý {{user_name}}," msgid "Defunct." msgstr "Nefunkční." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Zpožděná odpověď na váš dotaz –" @@ -1073,6 +1092,9 @@ msgstr "ZDE UPŘESNĚTE DETAILY VAŠÍ STÍŽNOSTI" msgid "Got an account?" msgstr "Máte účet?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Vyřizováno poštou." @@ -1145,6 +1167,9 @@ msgstr "Máte ale právo požádat o informace o životním prostředí podle ji msgid "Human health and safety" msgstr "Lidské zdraví a bezpečnost" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Žádám <strong>novou informaci</strong>" @@ -1390,6 +1415,12 @@ msgstr "Informace není k dispozici." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informace o vypouštění imisí a emisí (např. energie, hluk, radiace, odpady)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Doplnění dotazu" @@ -1467,6 +1498,9 @@ msgstr "Přihlaste se ke stažení komprimovaného souboru {{info_request_title} msgid "Log into the admin interface" msgstr "Přihlásit jako admin" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Velké zpoždění." @@ -1576,6 +1610,9 @@ msgstr "Jméno nemůže zůstat prázdné" msgid "Name is already taken" msgstr "Jméno je již obsazeno" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nové dotazy " @@ -1645,6 +1682,12 @@ msgstr "Neplatné vznesení dotazu" msgid "Not a valid request" msgstr "Toto není možné" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Rádi bychom vás upozornili, že tazatel nebude o vašem komentáři informován, jelikož tento dotaz byl zveřejněn na žádost instituce {{public_body_name}}." @@ -1744,6 +1787,9 @@ msgstr "Odchozí zpráva | Status" msgid "OutgoingMessage|What doing" msgstr "Odchozí zpráva | Co dělá" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Částečně úspěšné." @@ -2207,6 +2253,9 @@ msgstr "Jako první naposled aktualizované výsledky" msgid "Refused." msgstr "Odmítnuto." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2333,9 +2382,6 @@ msgstr "Prohledávejte příspěvky od tohoto uživatele" msgid "Search for the authorities you'd like information from:" msgstr "Vyhledejte instituce, od kterých potřebujete informace:" -msgid "Search for words in:" -msgstr "Vyhledat slova v " - msgid "Search in" msgstr "Vyhledat v" @@ -2509,6 +2555,9 @@ msgstr "Předmět:" msgid "Submit" msgstr "Odeslat" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Vzneste dotaz" @@ -2524,9 +2573,15 @@ msgstr "Sledujte náš blog" msgid "Success" msgstr "Úspěch" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Kompletně zodpovězený dotaz" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Úspěch." @@ -2886,6 +2941,9 @@ msgstr "Toto je první verze." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Toto je váš vlastní dotaz, proto budete odpovědi dostávat e-mailem automaticky." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Tato zpráva byla skryta." @@ -3161,9 +3219,15 @@ msgstr "Bohužel nemáme správnou e-mailovou adresu pro {{public_body_names}}." msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Bohužel nemáme funkční adresu pro zaslání {{info_request_law_used_full}}" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Odhlásit odběr" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Neobvyklá odpověď." @@ -3386,6 +3450,15 @@ msgstr "Od koho mohu tyto informace získat?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Z jakých konkrétních důvodů považujete tuto žádost za nevhodnou?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Dotaz stažen tazatelem." @@ -3488,6 +3561,9 @@ msgstr "Nyní <a href=\"{{wall_url_user}}\">odebíráte</a> aktuality týkajíc msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Nyní <a href=\"{{wall_url_user}}\">odebíráte</a> aktuality o úspěšných žádostech <a href=\"{{successful_requests_url}}\"></a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Můžete si <strong>stěžovat</strong> " @@ -3641,6 +3717,9 @@ msgstr "Váš e-mail:" msgid "Your email doesn't look like a valid address" msgstr "Vaše e-malová adresa asi není platná" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Vaše odpověď nebyla odeslána, protože tento dotaz byl identifikován jako nevyžádaná zpráva. Prosíme <a href=\"{{url}}\">kontaktujte nás</a> pokud svou zprávu chcete odeslat. " diff --git a/locale/cy/app.po b/locale/cy/app.po index b7df8de27..5190528f8 100644 --- a/locale/cy/app.po +++ b/locale/cy/app.po @@ -22,9 +22,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-27 14:31+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Welsh (http://www.transifex.com/projects/p/alaveteli/language/cy/)\n" "Language: cy\n" "MIME-Version: 1.0\n" @@ -155,8 +155,15 @@ msgstr "Cadwch at <strong>y prif bwynt</strong>. Byddwch yn fwy tebygol o gael b msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Mewngofnodi</a> i newid cyfrinair, tanysgrifiadau a mwy ({{user_name}} yn unig)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Os ydych yn ystyried defnyddio ffugenw, <a href=\"{{url}}\">darllenwch hwn yn gyntaf</a> os gwelwch yn dda." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Wedi gorffen! Diolch yn fawr am eich help.</p><p>Mae <a href=\"{{helpus_url}}\">rhagor o bethau i'w wneud</a> er mwyn helpu {{site_name}}.</p>" @@ -464,12 +471,21 @@ msgstr "Ebost awdurdod:" msgid "Authority:" msgstr "Awdurdod:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Yn aros am gael ei ddosbarthu." msgid "Awaiting internal review." msgstr "Yn aros am adolygiad mewnol." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Yn aros am ymateb." @@ -677,6 +693,9 @@ msgstr "Methwyd â deall y ffeil ddelwedd yr ydych yn llwytho i fyny. Cefnogir P msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Crëwyd gan {{info_request_user}} ar {{date}}." @@ -707,6 +726,9 @@ msgstr "Annwyl {{user_name}}," msgid "Defunct." msgstr "Wedi darfod." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Ymateb hwyr i'ch cais Rh.G. -" @@ -1008,6 +1030,9 @@ msgstr "RHOWCH FANYLION AM EICH CWYN YMA" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Wedi ei drin gan bost." @@ -1077,6 +1102,9 @@ msgstr "Fodd bynnag, mae gennych yr hawl i ofyn am wybodaeth amgylcheddol dan gy msgid "Human health and safety" msgstr "Iechyd dynol a diogelwch" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Rwyf yn gofyn am <strong>wybodaeth newydd</strong>" @@ -1311,6 +1339,12 @@ msgstr "Gwybodaeth heb ei gadw." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Gwybodaeth am allyriadau a gollyngiadau (ee sŵn, ynni, ymbelydredd, deunyddiau gwastraff)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Cais am adolygiad mewnol" @@ -1383,6 +1417,9 @@ msgstr "Mewngofnodi i lawrlwytho ffeil zip o {{info_request_title}} " msgid "Log into the admin interface" msgstr "Logio i mewn i'r rhyngwyneb gweinyddu" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Yn hwyr iawn" @@ -1488,6 +1525,9 @@ msgstr "Ni all yr enw fod yn wag" msgid "Name is already taken" msgstr "Mae'r enw wedi'i ddefnyddio'n barod" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Ceisiadau Rhyddid Gwybodaeth newydd" @@ -1557,6 +1597,12 @@ msgstr "Ddim yn gais Rhyddid Gwybodaeth dilys" msgid "Not a valid request" msgstr "Dim yn gais dilys" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Noder na fydd y ceisydd yn cael gwybod am eich anodi, oherwydd i'r cais gael ei gyhoeddi gan {{public_body_name}} ar eu rhan." @@ -1656,6 +1702,9 @@ msgstr "OutgoingMessage|Statws" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|Beth sy'n digwydd" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Rhannol lwyddiannus." @@ -2113,6 +2162,9 @@ msgstr "Canlyniadau a ddisgrifiwyd yn ddiweddar yn gyntaf" msgid "Refused." msgstr "Gwrthodwyd." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2239,9 +2291,6 @@ msgstr "Chwilio cyfraniadau gan y person hwn" msgid "Search for the authorities you'd like information from:" msgstr "Chwiliwch am yr awdurdodau hoffech gael wybodaeth ganddynt:" -msgid "Search for words in:" -msgstr "Chwilio am eiriau yn:" - msgid "Search in" msgstr "Chwilio mewn" @@ -2408,6 +2457,9 @@ msgstr "Pwnc:" msgid "Submit" msgstr "Cyflwyno" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Cyflwyno'r cais" @@ -2423,9 +2475,15 @@ msgstr "Tanysgrifio i flog" msgid "Success" msgstr "Llwyddiant" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Ceisiadau Rhyddid Gwybodaeth llwyddiannus" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Llwyddiannus." @@ -2763,6 +2821,9 @@ msgstr "Dyma'r fersiwn gyntaf." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Dyma'ch eich cais eich hun, felly byddwch yn cael e-bost yn awtomatig pan fydd ymatebion newydd yn cyrraedd." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Mae'r neges hon wedi cael ei chuddio." @@ -3029,9 +3090,15 @@ msgstr "Yn anffodus, nid oes gennym cyfeiriad cywir ar gyfer {{public_body_names msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Yn anffodus, nid oes gennym cyfeiriad {{info_request_law_used_full}} sy'n gweithio ar gyfer" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Dad-danysgrifio" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Ymateb anarferol." @@ -3241,6 +3308,15 @@ msgstr "Gan bwy y gallaf ofyn cael y wybodaeth?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Am ba reswm penodol ydych yn ystyried y cais yn anaddas?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Fe'i tynnwyd yn ôl gan y ceisydd." @@ -3340,6 +3416,9 @@ msgstr "Rydych yn awr <a href=\"{{wall_url_user}}\">yn dilyn</a> diweddariadau a msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Rydych yn awr <a href=\"{{wall_url_user}}\">yn dilyn</a> diweddariadau am <a href=\"{{successful_requests_url}}\"> geisiadau llwyddiannus</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Gallwch <strong>gwyno</strong> drwy" @@ -3472,6 +3551,9 @@ msgstr "Eich cyfeiriad e-bost:" msgid "Your email doesn't look like a valid address" msgstr "Dyw'ch ebost ddim yn edrych fel cyfeiriad cywir." +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Nid yw eich neges ddilynol wedi cael ei hanfon gan fod y cais hwn wedi cael ei stopio i atal spam. <a href=\"{{url}}\"> Cysylltwch â ni </a> os ydych wir eisiau anfon neges ddilynol." diff --git a/locale/de/app.po b/locale/de/app.po index a576a2231..698a111aa 100644 --- a/locale/de/app.po +++ b/locale/de/app.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:13+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: German (http://www.transifex.com/projects/p/alaveteli/language/de/)\n" "Language: de\n" "MIME-Version: 1.0\n" @@ -156,10 +156,13 @@ msgstr "Machen Sie es <strong>kurz und bündig</strong>, die Wahrscheinlichkeit msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Melden Sie sich an,</a> um Ihr Passwort und weitere Einstellungen zu ändern (auschließlich {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Wenn Sie ein Pseudonym als Benutzername verwenden möchten,\n" -" bitte <a href=\"{{url}}\">lesen Sie hier</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Fertig! Ganz herzlichen Dank für Ihre Hilfe.</p><p>Es gibt <a href=\"{{helpus_url}}\">noch mehr womit Sie uns helfen können</a>{{site_name}}.</p>" @@ -490,12 +493,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Zuordnung wird erwartet. " msgid "Awaiting internal review." msgstr "Interne Prüfung ausstehend." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Antwort ausstehend. " @@ -703,6 +715,9 @@ msgstr "Konnte die hochgeladene Bilddatei nicht verarbeiten. PNG, JPEG, GIF und msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -733,6 +748,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -1040,6 +1058,9 @@ msgstr "HINTELASSEN SIE HIER DETAILS ZU IHRER BESCHWERDE" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Postalisch bearbeitet." @@ -1109,6 +1130,9 @@ msgstr "Nichtsdestrotrotz sind Sie berechtigt Umweltanfragen auf Basis eines and msgid "Human health and safety" msgstr "Gesundheit und Sicherheit" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Ich beantrage <strong>neue Informationen</strong>" @@ -1351,6 +1375,12 @@ msgstr "" "Informationen bzg. Emissionen und Ablagerungen (e.g. Lärm, Energie,\n" " Strahlung, Abfallmaterialien)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Anfrage zur internen Prüfung" @@ -1423,6 +1453,9 @@ msgstr "Melden Sie sich an, um eine Zip-Datei von {{info_request_title}} herunte msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Stark verspätet." @@ -1530,6 +1563,9 @@ msgstr "Name muss eingegeben werden " msgid "Name is already taken" msgstr "Benutzername vergeben" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Neue IFG-Anfragen" @@ -1599,6 +1635,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1698,6 +1740,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Teilweise erfolgreich. " @@ -2156,6 +2201,9 @@ msgstr "Kürzlich widergegebene Ergebnisse zuerst" msgid "Refused." msgstr "Abgelehnt." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2282,9 +2330,6 @@ msgstr "Suchen Sie Beiträge dieser Person" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Suchen Sie nach Begriffen in:" - msgid "Search in" msgstr "Suchen Sie in" @@ -2454,6 +2499,9 @@ msgstr "Betreff:" msgid "Submit" msgstr "Senden" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2469,9 +2517,15 @@ msgstr "Blog folgen" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Erfolgreiche Informationsfreiheitsanfrage" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Erfolgreich." @@ -2814,6 +2868,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Dies ist Ihre eigene Anfrage. Sie erhalten eine automatische Emailbenachrichtigung, sobald Ihre Anfrage beantwortet wird. " +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3082,9 +3139,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Wir haben leider keine funktionierende Email-Adresse für {{info_request_law_used_full}}" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Ungewöhnliche Antwort." @@ -3293,6 +3356,15 @@ msgstr "Von wem kann ich Informationen anfragen?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Vom Antragsteller zurückgezogen" @@ -3392,6 +3464,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Sie können sich <strong>beschweren</strong>, indem sie" @@ -3530,6 +3605,9 @@ msgstr "Ihre Email:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Ihre Nachfrage wurde nicht gesendet, da Sie durch unseren Spamfilter gestoppt wurde. Bitte <a href=\"{{url}}\">kontaktieren Sie uns</a> wenn Sie wirklich eine Nachfrage senden möchten. " diff --git a/locale/en/app.po b/locale/en/app.po index 1f43a78f6..b9fec2c0f 100644 --- a/locale/en/app.po +++ b/locale/en/app.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" "PO-Revision-Date: 2011-02-24 07:11-0000\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -140,9 +140,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +454,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +676,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +709,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -991,6 +1011,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1060,6 +1083,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1294,6 +1320,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1366,6 +1398,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1471,6 +1506,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1540,6 +1578,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1639,6 +1683,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2094,6 +2141,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2220,9 +2270,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2387,6 +2434,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2402,9 +2452,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2740,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3002,9 +3061,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3210,6 +3275,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3309,6 +3383,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3441,6 +3518,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/en_IE/app.po b/locale/en_IE/app.po index 2cc3c6fd1..9df346f8a 100644 --- a/locale/en_IE/app.po +++ b/locale/en_IE/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: English (Ireland) (http://www.transifex.com/projects/p/alaveteli/language/en_IE/)\n" "Language: en_IE\n" "MIME-Version: 1.0\n" @@ -145,9 +145,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -454,12 +459,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -667,6 +681,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -697,6 +714,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -996,6 +1016,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1065,6 +1088,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1299,6 +1325,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1371,6 +1403,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1476,6 +1511,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1545,6 +1583,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1644,6 +1688,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2099,6 +2146,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2225,9 +2275,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2392,6 +2439,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2407,9 +2457,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2745,6 +2801,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3007,9 +3066,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3215,6 +3280,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3314,6 +3388,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3446,6 +3523,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/en_RW/app.po b/locale/en_RW/app.po index 7dc9a78f8..25e593c3a 100644 --- a/locale/en_RW/app.po +++ b/locale/en_RW/app.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" "PO-Revision-Date: 2014-11-18 19:29+0200\n" "Last-Translator: Stephen Abbott Pugh <stephendabbott@gmail.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -141,9 +141,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -450,12 +455,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -663,6 +677,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -693,6 +710,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Delayed response to your ATI request - " @@ -992,6 +1012,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1061,6 +1084,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1295,6 +1321,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1367,6 +1399,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1472,6 +1507,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "New access to information requests" @@ -1541,6 +1579,9 @@ msgstr "Not a valid ATI request" msgid "Not a valid request" msgstr "" +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1640,6 +1681,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2095,6 +2139,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2221,9 +2268,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2388,6 +2432,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2403,6 +2450,9 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Successful access to information requests" @@ -3003,6 +3053,9 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" @@ -3211,6 +3264,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" diff --git a/locale/en_UG/app.po b/locale/en_UG/app.po index 7200392a6..ba1a694ba 100644 --- a/locale/en_UG/app.po +++ b/locale/en_UG/app.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" "PO-Revision-Date: 2014-01-31 09:14+0000\n" "Last-Translator: Louise Crow <louise@mysociety.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -140,9 +140,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +454,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +676,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +709,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Delayed response to your ATI request - " @@ -991,6 +1011,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1060,6 +1083,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1294,6 +1320,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1366,6 +1398,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1471,6 +1506,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "New Access to Information requests" @@ -1540,6 +1578,9 @@ msgstr "Not a valid ATI request" msgid "Not a valid request" msgstr "" +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1639,6 +1680,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2094,6 +2138,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2220,9 +2267,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2387,6 +2431,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2402,6 +2449,9 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Successful Access to Information requests" @@ -3002,6 +3052,9 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" @@ -3210,6 +3263,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3309,6 +3371,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3441,6 +3506,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/es/app.po b/locale/es/app.po index b4d8118fc..29b80507c 100644 --- a/locale/es/app.po +++ b/locale/es/app.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-06-08 02:10+0000\n" -"Last-Translator: David Cabo <david.cabo@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/alaveteli/language/es/)\n" "Language: es\n" "MIME-Version: 1.0\n" @@ -156,10 +156,13 @@ msgstr "Sé <strong>específico</strong>, tendrás más probabilidades de conseg msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Inicie sesión</a> para cambiar su contraseña, suscripciones y más (sólo {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Si estás pensando en utilizar un pseudónimo,\n" -" por favor <a href=\"{{url}}\">lee esto primero</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>¡Listo! Muchas gracias por su ayuda.</p><p>Hay <a href=\"{{helpus_url}}\">más cosas que puedes hacer</a> para ayudar a {{site_name}}.</p>" @@ -509,12 +512,21 @@ msgstr "Correo electrónico de la Institución Pública:" msgid "Authority:" msgstr "Institución Pública:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Esperando clasificación." msgid "Awaiting internal review." msgstr "Esperando revisión interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Esperando respuesta." @@ -724,6 +736,9 @@ msgstr "No se pudo procesar la imagen subida. Puedes utilizar PNG, JPEG, GIF u o msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Creado por {{info_request_user}} el {{date}}." @@ -756,6 +771,9 @@ msgstr "Estimado {{user_name}}," msgid "Defunct." msgstr "Difunto." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respuesta retrasada a tu solicitud de acceso a información - " @@ -1066,6 +1084,9 @@ msgstr "DETALLA TU QUEJA AQUÍ" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Resuelta por correo ordinario" @@ -1144,6 +1165,9 @@ msgstr "" msgid "Human health and safety" msgstr "Salud y seguridad" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estoy pidiendo <strong>nueva información</strong>" @@ -1401,6 +1425,12 @@ msgstr "" "Información sobre emisiones (por ejemplo ruido, energía,\n" " radiación, materiales de desecho...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Solicitud de revisión interna" @@ -1479,6 +1509,9 @@ msgstr "Abre una sesión para descargar el fichero ZIP de {{info_request_title}} msgid "Log into the admin interface" msgstr "Loguearse como administrador" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muy retrasada." @@ -1587,6 +1620,9 @@ msgstr "El nombre no puede estar vacío" msgid "Name is already taken" msgstr "El nombre ya está siendo utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuevas solicitudes de acceso a información" @@ -1656,6 +1692,12 @@ msgstr "Solicitud de información inválida" msgid "Not a valid request" msgstr "No es una solicitud válida" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Ten en cuenta que el solicitante no será notificado de tu comentario, porque la solicitud fue publicada por {{public_body_name}} en su nombre." @@ -1755,6 +1797,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Éxito parcial." @@ -2221,6 +2266,9 @@ msgstr "Resultados descritos recientemente primero" msgid "Refused." msgstr "Rechazada." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2347,9 +2395,6 @@ msgstr "Buscar aportaciones de esta persona" msgid "Search for the authorities you'd like information from:" msgstr "Busque las Instituciones Públicas a las cuales desea solicitarle información :" -msgid "Search for words in:" -msgstr "Buscar palabras en:" - msgid "Search in" msgstr "Buscar en" @@ -2523,6 +2568,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Enviar su solicitud" @@ -2538,9 +2586,15 @@ msgstr "Subscribirse al blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitudes de acceso a la información con éxito" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Exitosa." @@ -2904,6 +2958,9 @@ msgstr "Esta es la primera versión." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esta es tu solicitud, por lo que recibirás correos automáticamente cuando lleguen nuevas respuestas." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Este mensaje se ha ocultado." @@ -3185,9 +3242,15 @@ msgstr "Lamentablemente, no tenemos una dirección que funcione para {{public_bo msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Desgraciadamente, no tenemos una dirección de correo válida para" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Cancelar suscripción" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respuesta no habitual." @@ -3411,6 +3474,15 @@ msgstr "¿A quién puedo solicitar información?" msgid "Why specifically do you consider this request unsuitable?" msgstr "¿Específicamente por qué considera qué esta petición es inadecuada?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirada por el autor." @@ -3510,6 +3582,9 @@ msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo</a> actualiza msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo </a> actualizaciones sobre <a href=\"{{successful_requests_url}}\"> solicitudes exitosas </a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puede <strong>apelar</strong>" @@ -3667,6 +3742,9 @@ msgstr "Tu correo:" msgid "Your email doesn't look like a valid address" msgstr "Su correo electrónico no parece una dirección válida" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Tu respuesta no ha sido enviada porque esta solicitud ha sido bloqueada para evitar spam. Por favor <a href=\"{{url}}\">contáctanos</a> si realmente quieres enviar una respuesta." diff --git a/locale/es_NI/app.po b/locale/es_NI/app.po index e4906b1c0..8e40115b8 100644 --- a/locale/es_NI/app.po +++ b/locale/es_NI/app.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-06-05 20:53+0000\n" -"Last-Translator: jbaezni <jbaezni@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Spanish (Nicaragua) (http://www.transifex.com/projects/p/alaveteli/language/es_NI/)\n" "Language: es_NI\n" "MIME-Version: 1.0\n" @@ -153,10 +153,13 @@ msgstr "Sé <strong>específico</strong>, tendrás más probabilidades de conseg msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Inicie sesión</a> para cambiar su contraseña, suscripciones y más (sólo {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Si estás pensando en utilizar un pseudónimo,\n" -" por favor <a href=\"{{url}}\">lee esto primero</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>¡Listo! Muchas gracias por su ayuda.</p><p>Hay <a href=\"{{helpus_url}}\">más cosas que puedes hacer</a> para ayudar a {{site_name}}.</p>" @@ -506,12 +509,21 @@ msgstr "Correo electrónico de la Institución Pública:" msgid "Authority:" msgstr "Institución Pública:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Esperando clasificación." msgid "Awaiting internal review." msgstr "Estoy preguntando por mi solicitud de información." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Esperando respuesta." @@ -719,6 +731,9 @@ msgstr "No se pudo procesar la imagen subida. Puedes utilizar PNG, JPEG, GIF u o msgid "Create a new account" msgstr "Crear una nueva cuenta" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Creado por {{info_request_user}} el {{date}}." @@ -751,6 +766,9 @@ msgstr "Estimado {{user_name}}," msgid "Defunct." msgstr "Difunto." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respuesta retrasada a tu solicitud de acceso a información - " @@ -1058,6 +1076,9 @@ msgstr "DETALLA TU PREGUNTA AQUÍ" msgid "Got an account?" msgstr "¿Tienes una cuenta?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Resuelta por correo ordinario" @@ -1136,6 +1157,9 @@ msgstr "" msgid "Human health and safety" msgstr "Salud y seguridad" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estoy pidiendo <strong>nueva información</strong>" @@ -1395,6 +1419,12 @@ msgstr "" "Información sobre emisiones (por ejemplo ruido, energía,\n" " radiación, materiales de desecho...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Pregunta por tu solicitud de información" @@ -1473,6 +1503,9 @@ msgstr "Abre una sesión para descargar el fichero ZIP de {{info_request_title}} msgid "Log into the admin interface" msgstr "Loguearse como administrador" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muy retrasada." @@ -1581,6 +1614,9 @@ msgstr "El nombre no puede estar vacío" msgid "Name is already taken" msgstr "El nombre ya está siendo utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuevas solicitudes de acceso a información" @@ -1650,6 +1686,12 @@ msgstr "Solicitud de información inválida" msgid "Not a valid request" msgstr "No es una solicitud válida" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Ten en cuenta que el solicitante no será notificado de tu comentario, porque la solicitud fue publicada por {{public_body_name}} en su nombre." @@ -1749,6 +1791,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Éxito parcial." @@ -2215,6 +2260,9 @@ msgstr "Resultados descritos recientemente primero" msgid "Refused." msgstr "Rechazada." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Recuérdeme (mantenga esta sesión abierta, no utilizar en una computadora pública)" @@ -2341,9 +2389,6 @@ msgstr "Buscar aportaciones de esta persona" msgid "Search for the authorities you'd like information from:" msgstr "Busque las Entidades Públicas a las cuales desea solicitarle información :" -msgid "Search for words in:" -msgstr "Buscar palabras en:" - msgid "Search in" msgstr "Buscar en" @@ -2517,6 +2562,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Enviar su solicitud" @@ -2532,9 +2580,15 @@ msgstr "Subscribirse al blog" msgid "Success" msgstr "éxito" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitudes de acceso a la información con éxito" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Exitosa." @@ -2898,6 +2952,9 @@ msgstr "Esta es la primera versión." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esta es tu solicitud, por lo que recibirás correos automáticamente cuando lleguen nuevas respuestas." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Este mensaje se ha ocultado." @@ -3176,9 +3233,15 @@ msgstr "Lamentablemente, no tenemos una dirección que funcione para {{public_bo msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "No disponemos de una dirección de correo válida para" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Cancelar suscripción" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respuesta no habitual." @@ -3402,6 +3465,15 @@ msgstr "¿A quién puedo solicitar información?" msgid "Why specifically do you consider this request unsuitable?" msgstr "¿Específicamente por qué considera qué esta petición es inadecuada?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirada por el autor." @@ -3501,6 +3573,9 @@ msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo</a> actualiza msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo </a> actualizaciones sobre <a href=\"{{successful_requests_url}}\"> solicitudes exitosas </a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puede <strong>apelar</strong>" @@ -3658,6 +3733,9 @@ msgstr "Tu correo:" msgid "Your email doesn't look like a valid address" msgstr "Su correo electrónico no parece una dirección válida" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Tu respuesta no ha sido enviada porque esta solicitud ha sido bloqueada para evitar spam. Por favor <a href=\"{{url}}\">contáctanos</a> si realmente quieres enviar una respuesta." diff --git a/locale/es_PA/app.po b/locale/es_PA/app.po index 24b9bbd3d..80b21b7e6 100644 --- a/locale/es_PA/app.po +++ b/locale/es_PA/app.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Spanish (Panama) (http://www.transifex.com/projects/p/alaveteli/language/es_PA/)\n" "Language: es_PA\n" "MIME-Version: 1.0\n" @@ -148,8 +148,13 @@ msgstr "Sea <strong>específico</strong>, así tendrá más probabilidades de co msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Inicie sesión</a> para cambiar su contraseña, suscripciones y más (sólo {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Si esta pensando en utilizar un pseudónimo, por favor <a href=\"{{url}}\">lea esto primero</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>¡Listo! Muchas gracias por su ayuda.</p><p>Hay <a href=\"{{helpus_url}}\">más cosas que puedes hacer</a> para ayudar a {{site_name}}.</p>" @@ -463,12 +468,21 @@ msgstr "Correo electrónico de la institución pública:" msgid "Authority:" msgstr "Institución pública:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Esperando clasificación." msgid "Awaiting internal review." msgstr "Esperando revisión interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Esperando respuesta." @@ -676,6 +690,9 @@ msgstr "No se pudo procesar la imagen subida. Puedes utilizar PNG, JPEG, GIF u o msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Creado por {{info_request_user}} el {{date}}." @@ -706,6 +723,9 @@ msgstr "Estimado {{user_name}}," msgid "Defunct." msgstr "Difunto." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respuesta retrasada a su solicitud de acceso a información - " @@ -1005,6 +1025,9 @@ msgstr "DETALLE SU QUEJA AQUÍ" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Resuelta por correo ordinario" @@ -1076,6 +1099,9 @@ msgstr "En cambio, tienes derecho a solicitar información\\n medioambiental ba msgid "Human health and safety" msgstr "Salud y seguridad" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estoy solicitando <strong>nueva información</strong>" @@ -1312,6 +1338,12 @@ msgstr "Información no disponible." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Información sobre emisiones (por ejemplo ruido, energía,\\n radiación, materiales de desecho...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Solicitud de revisión interna" @@ -1386,6 +1418,9 @@ msgstr "Inicie sesión para descargar el documento ZIP de {{info_request_title}} msgid "Log into the admin interface" msgstr "Iniciar sesión como administrador" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muy retrasada." @@ -1491,6 +1526,9 @@ msgstr "El nombre no puede estar vacío" msgid "Name is already taken" msgstr "El nombre ya está siendo utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuevas solicitudes de acceso a información" @@ -1560,6 +1598,12 @@ msgstr "Solicitud de acceso a la información inválida" msgid "Not a valid request" msgstr "No es una solicitud válida" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Tenga en cuenta que el solicitante no será notificado de su comentario, porque la solicitud fue publicada por {{public_body_name}} en su nombre." @@ -1659,6 +1703,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Parcialmente exitosa." @@ -2114,6 +2161,9 @@ msgstr "Mostrar primero los resultados descritos recientemente " msgid "Refused." msgstr "Rechazada." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2240,9 +2290,6 @@ msgstr "Buscar aportaciones de esta persona" msgid "Search for the authorities you'd like information from:" msgstr "Busque las instituciones públicas a las cuales desea solicitarle información :" -msgid "Search for words in:" -msgstr "Buscar palabras en:" - msgid "Search in" msgstr "Buscar en" @@ -2407,6 +2454,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Enviar su solicitud" @@ -2422,9 +2472,15 @@ msgstr "Subscribirse al blog" msgid "Success" msgstr "Exitoso" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitudes de acceso a la información exitosas" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Exitosa." @@ -2760,6 +2816,9 @@ msgstr "Esta es la primera versión." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esta es su propia solicitud, recibirá correos automáticamente cuando lleguen nuevas respuestas." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Este mensaje se ha ocultado." @@ -3022,9 +3081,15 @@ msgstr "Lamentablemente, no tenemos una dirección que funcione para {{public_bo msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Lamentablemente, no tenemos una dirección de correo válida {{info_request_law_used_full}}\\n para" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Cancelar suscripción" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respuesta no habitual." @@ -3230,6 +3295,15 @@ msgstr "¿A quién puedo solicitar información?" msgid "Why specifically do you consider this request unsuitable?" msgstr "¿Específicamente por qué considera que esta solicitud es inadecuada?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirada por el autor." @@ -3329,6 +3403,9 @@ msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo</a> actualiza msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Usted ahora está <a href=\"{{wall_url_user}}\"> siguiendo </a> actualizaciones relacionadas con <a href=\"{{successful_requests_url}}\"> solicitudes exitosas </a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puede <strong>presentar reclamo</strong>" @@ -3461,6 +3538,9 @@ msgstr "Su correo electrónico:" msgid "Your email doesn't look like a valid address" msgstr "Su correo electrónico no parece una dirección válida" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Su respuesta no ha sido enviada porque esta solicitud ha sido bloqueada para evitar spam. Por favor <a href=\"{{url}}\">contáctenos</a> si realmente desea enviar una respuesta." diff --git a/locale/eu/app.po b/locale/eu/app.po index 50c4fde61..94d0934ed 100644 --- a/locale/eu/app.po +++ b/locale/eu/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Basque (http://www.transifex.com/projects/p/alaveteli/language/eu/)\n" "Language: eu\n" "MIME-Version: 1.0\n" @@ -156,8 +156,13 @@ msgstr "Izan zaitez <strong>konkretua</strong>, nahi duzuna lortzeko aukera gehi msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Ireki saioa</a> zure pasahitza aldatzeko, inskribatzeko... ({{user_name}} bakarrik)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Goitizena erabili nahi izanez gero, mesedez <a href=\"{{url}}\">lehenago irakur ezazu hau</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Eginda dago! Eskerrik asko zure laguntzagatik.</p> {{site_name}} laguntzeko<p>badaude<a href=\"{{helpus_url}}\">egin ditzakezun gauza gehiago</a>.</p>" @@ -483,12 +488,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Sailkatzeko zain." msgid "Awaiting internal review." msgstr "Barneko berrikusketaren zain." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Erantzunaren zain." @@ -696,6 +710,9 @@ msgstr "Ezin dugu prozesatu igo duzun irudia. PNG, JPEG, GIF edo beste irudi for msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -726,6 +743,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Zure informaziorako sarbidearen eskabidea atzeratuta dabil - " @@ -1028,6 +1048,9 @@ msgstr "ZEHAZTU HEMEN ZURE KEXA" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Posta arruntaren bidez bidalita" @@ -1100,6 +1123,9 @@ msgstr "Aldiz, inguruneari buruzko informazioa eskatzeko eskubidea daukazu, best msgid "Human health and safety" msgstr "Osasuna eta segurtasuna" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "<strong>Informazio berria</strong> eskatzen ari naiz" @@ -1338,6 +1364,12 @@ msgstr "Informazioa ez dago eskuragarri." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Emisioei buruzko informazioa (adibidez zarata, energia, erradiazioa, hondakin materialak...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Barneko berrikusketa egiteko eskabidea" @@ -1410,6 +1442,9 @@ msgstr "Ireki ezazu saio bat {{info_request_title}}-eko ZIP fitxategia deskargat msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Oso atzeratua." @@ -1518,6 +1553,9 @@ msgstr "Izena ezin da hutsik utzi" msgid "Name is already taken" msgstr "Izen hori beste norbait erabiltzen ari da" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Informaziorako Sarbidearen eskabide berriak" @@ -1587,6 +1625,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1686,6 +1730,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Arrakasta partziala." @@ -2143,6 +2190,9 @@ msgstr "Lehenbizi deskribatu berri diren emaitzak" msgid "Refused." msgstr "Ez da onartu." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2269,9 +2319,6 @@ msgstr "Pertsona honen ekarpenak bilatu" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Bilatu hitzak hemen:" - msgid "Search in" msgstr "Bilatu" @@ -2441,6 +2488,9 @@ msgstr "Gaia:" msgid "Submit" msgstr "Bidali" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2456,9 +2506,15 @@ msgstr "Blogaren harpidetza eman" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Arrakasta izan duten informaziorako sarbidearen eskabideak" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Arrakastatsua." @@ -2806,6 +2862,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Hauxe da zure eskabidea, horregatik erantzun berriak heltzen direnean automatikoki emailak jasoko dituzu." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3070,9 +3129,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Zoritxarrez ez dugu posta helbide baliagarria honentzat: {{info_request_law_used_full}}" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Ez-ohiko erantzuna." @@ -3281,6 +3346,15 @@ msgstr "Nori eska diezaioket informazioa?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Eskatzaileak kendu du." @@ -3380,6 +3454,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "<strong>Apelatu</strong> ahal duzu." @@ -3521,6 +3598,9 @@ msgstr "Zure helbide elektronikoa:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Zure erantzuna ez da bidali, eskabide hau blokeatuta dagoelako, spama ekidetzearren. Benetan erantzuna bidali nahi baldin baduzu, mesedez, jar zaitez gurekin <a href=\"{{url}}\">harremanetan</a>." diff --git a/locale/fi/app.po b/locale/fi/app.po index d2f6b7294..efff869d4 100644 --- a/locale/fi/app.po +++ b/locale/fi/app.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Finnish (http://www.transifex.com/projects/p/alaveteli/language/fi/)\n" "Language: fi\n" "MIME-Version: 1.0\n" @@ -144,9 +144,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -453,12 +458,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -666,6 +680,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -696,6 +713,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -995,6 +1015,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1064,6 +1087,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1298,6 +1324,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1370,6 +1402,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1475,6 +1510,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1544,6 +1582,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1643,6 +1687,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2098,6 +2145,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2224,9 +2274,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2391,6 +2438,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2406,9 +2456,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2744,6 +2800,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3006,9 +3065,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3214,6 +3279,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3313,6 +3387,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3445,6 +3522,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/fr/app.po b/locale/fr/app.po index f97019161..c4c444e19 100644 --- a/locale/fr/app.po +++ b/locale/fr/app.po @@ -36,9 +36,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-05-28 17:28+0000\n" -"Last-Translator: Stephen Abbott Pugh <stephendabbott@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: French (http://www.transifex.com/projects/p/alaveteli/language/fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -173,8 +173,13 @@ msgstr "Soyez <strong> précis </strong>, vous aurez plus de chances d'obtenir c msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Connectez-vous</a> pour changer le mot de passe, les abonnements et plus encore ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Si vous envisagez d'utiliser un pseudonyme, \\\\ veuillez <a href=\"{{url}}\">lire ça</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>C'est terminé ! Merci beaucoup pour votre aide.</p><p> Il y a <a href=\"{{helpus_url}}\"> d' autres choses que vous pouvez faire</a> pour nous aider {{site_name}}.</p>" @@ -482,12 +487,21 @@ msgstr "adresse email de l'autorité" msgid "Authority:" msgstr "Autorité" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "En attente de classement." msgid "Awaiting internal review." msgstr "En attente d'examen interne." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Réponse en attente" @@ -695,6 +709,9 @@ msgstr "Nous ne pouvons utiliser le fichier image que vous nous avez soumis. Nou msgid "Create a new account" msgstr "Créer un nouveau compte" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Créée par {{info_request_user}} ce {{date}}." @@ -725,6 +742,9 @@ msgstr "Cher {{user_name}}," msgid "Defunct." msgstr "Inactif." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Retards de réponse à votre demande d'accès" @@ -1024,6 +1044,9 @@ msgstr "DONNEZ DES DÉTAILS SUR VOTRE PLAINTE ICI" msgid "Got an account?" msgstr "Vous avez un compte?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Envoyé par voie postale." @@ -1093,6 +1116,9 @@ msgstr "Cependant, vous avez le droit de demander des \\n informations environn msgid "Human health and safety" msgstr "Santé et sécurité des personnes" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Je demande de <strong>nouvelles informations</strong>." @@ -1327,6 +1353,12 @@ msgstr "Information non détenue." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informations sur les émissions et rejets (par exemple, le bruit, l'énergie, \\ n radiations, déchets)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Demande de révision interne" @@ -1399,6 +1431,9 @@ msgstr "Connectez-vous pour télécharger un fichier zip de {{info_request_title msgid "Log into the admin interface" msgstr "Se connecter a l'interface Admin" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "En retard depuis longtemps" @@ -1504,6 +1539,9 @@ msgstr "Le nom ne peut pas être vide" msgid "Name is already taken" msgstr "Le nom est déjà pris" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nouvelles demandes d'accès a l'information " @@ -1573,6 +1611,12 @@ msgstr "Pas une demande d'accès a l'information valide" msgid "Not a valid request" msgstr "Une demande invalide" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Notez que le demandeur ne sera pas informé de votre annotation, parce que la demande a été publié par {{public_body_name}} en leur nom" @@ -1672,6 +1716,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Partiellement réussi." @@ -2127,6 +2174,9 @@ msgstr "Les résultats récemment décris en premier " msgid "Refused." msgstr "Refusé." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Souvenez-vous de moi (vous permet de rester connecté longtemps; ne pas utiliser sur un ordinateur publique)" @@ -2253,9 +2303,6 @@ msgstr "Rechercher les contributions de cette personne" msgid "Search for the authorities you'd like information from:" msgstr "Recherchez les autorités de qui vous aimeriez recevoir d'information:" -msgid "Search for words in:" -msgstr "Rechercher des mots dans" - msgid "Search in" msgstr "Rechercher dans" @@ -2420,6 +2467,9 @@ msgstr "Sujet:" msgid "Submit" msgstr "Envoyer" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Envoyer la demande" @@ -2435,9 +2485,15 @@ msgstr "S'abonner au blog" msgid "Success" msgstr "Réussite" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Demande d'accès à l'information réussie" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Réussi." @@ -2773,6 +2829,9 @@ msgstr "Ceci est la première version." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ceci est votre propre demande, afin que vous receviez automatiquement un e-mail dès que de nouvelles réponses arrivent." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Ce message a été masqué." @@ -3035,9 +3094,15 @@ msgstr "Malheureusement, nous n'avons pas une adresse active de {{public_body_na msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Malheureusement, nous n'avons pas d'adresse {{info_request_law_used_full}} pour" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "désabonner" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Réponse inattendue." @@ -3243,6 +3308,15 @@ msgstr "A qui puis-je faire une demande d'information ?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Pourquoi vous considèrez cette demande particulièrement inopportun? " +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "retirée par le demandeur " @@ -3342,6 +3416,9 @@ msgstr "Maintenant vous <a href=\"{{wall_url_user}}\">êtes en train de suivre d msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Maintenant vous <a href=\"{{wall_url_user}}\">êtes en train de suivre des</a>mise à jours sur <a href=\"{{successful_requests_url}}\">demandes réussies</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Vous pouvez <strong>vous plaindre</strong> en " @@ -3474,6 +3551,9 @@ msgstr "Votre e-mail:" msgid "Your email doesn't look like a valid address" msgstr "Votre e-mail ne ressemble pas à une adresse valide" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Votre suivi n'a pas été envoyé parce que cette demande a été arrêté afin de prévenir le spam. Veuillez <a href=\"{{url}}\">nous contacter</a>si vous voulez vraiment envoyer un message de suivi." diff --git a/locale/fr_CA/app.po b/locale/fr_CA/app.po index 7b54f7238..a51f9ffdb 100644 --- a/locale/fr_CA/app.po +++ b/locale/fr_CA/app.po @@ -23,9 +23,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:14+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: French (Canada) (http://www.transifex.com/projects/p/alaveteli/language/fr_CA/)\n" "Language: fr_CA\n" "MIME-Version: 1.0\n" @@ -158,8 +158,13 @@ msgstr "Soyez <strong>précis</strong>, vous aurez plus de chance d'obtenir ce q msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Connectez-vous</a> pour modifier votre mot de passe, vos abonnements, etc. ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Si vous envisagez d'utiliser un pseudonyme, \\n veuillez <a href=\"{{url}}\">lire ceci</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>C'est fait! Merci de votre aide.</p><p>Vous pouvez aussi <a href=\"{{helpus_url}}\">aider</a> {{site_name}} autrement.</p>" @@ -467,12 +472,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "En attente de classement." msgid "Awaiting internal review." msgstr "En attente de révision interne." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "En attente d'une réponse." @@ -680,6 +694,9 @@ msgstr "Nous ne pouvons utiliser le fichier image que vous nous avez soumis. Nou msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -710,6 +727,9 @@ msgstr "" msgid "Defunct." msgstr "Disparu" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Réponse différée à votre demande d'accès aux documents - " @@ -1009,6 +1029,9 @@ msgstr "DONNER DES DÉTAILS SUR VOTRE PLAINTE ICI" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Envoyé par voie postale." @@ -1078,6 +1101,9 @@ msgstr "Cependant, vous avez le droit de demander des \\n informations environn msgid "Human health and safety" msgstr "Santé et sécurité des personnes" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Je vous demande de <strong>nouvelles informations</strong>." @@ -1312,6 +1338,12 @@ msgstr "Information non tenue." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informations sur les émissions et les déversements (par exemple, le bruit, l'énergie, \\ n les radiations, les déchets)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Demande de révision interne" @@ -1384,6 +1416,9 @@ msgstr "Connectez-vous pour télécharger un fichier zip de {{info_request_title msgid "Log into the admin interface" msgstr "Se connecter à l'interface d'administrateur" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "En retard depuis longtemps" @@ -1489,6 +1524,9 @@ msgstr "Le nom ne peut pas être vide" msgid "Name is already taken" msgstr "Ce nom est déjà utilisé" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nouvelles demandes d'accès aux documents" @@ -1558,6 +1596,12 @@ msgstr "Pas une demande valide d'accès aux documents" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Notez que le demandeur ne sera pas informé de votre annotation parce que la demande a été publiée par {{public_body_name}} en leur nom." @@ -1657,6 +1701,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Partiellement réussi." @@ -2112,6 +2159,9 @@ msgstr "Les résultats récemment décrits en premier " msgid "Refused." msgstr "Refusé." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2238,9 +2288,6 @@ msgstr "Rechercher les contributions de cette personne" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Rechercher des mots dans:" - msgid "Search in" msgstr "Rechercher dans" @@ -2405,6 +2452,9 @@ msgstr "Sujet:" msgid "Submit" msgstr "Envoyer" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2420,9 +2470,15 @@ msgstr "S'abonner au blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Demandes d'accès aux documents réussies" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Réussi." @@ -2758,6 +2814,9 @@ msgstr "Ceci est la première version." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ceci est votre demande, vous recevrez donc un courriel à la réception de nouvelles communications." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Ce message a été caché." @@ -3020,9 +3079,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Malheureusement, nous n'avons pas d'adresse {{info_request_law_used_full}} pour" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Vous désabonner" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Réponse inhabituelle." @@ -3228,6 +3293,15 @@ msgstr "À qui puis-je faire une demande d'information ?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirée par le demandeur." @@ -3327,6 +3401,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Vous pouvez <strong>vous plaindre</strong> en " @@ -3459,6 +3536,9 @@ msgstr "Votre adresse courriel:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Votre message de suivi n'a pas été envoyé parce que cette demande a été interrompue afin de prévenir le spam. Veuillez <a href=\"{{url}}\">nous contacter</a>si vous voulez vraiment envoyer un message de suivi." diff --git a/locale/ga_IE/app.po b/locale/ga_IE/app.po index aabf03b4a..80f7b0508 100644 --- a/locale/ga_IE/app.po +++ b/locale/ga_IE/app.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Irish (Ireland) (http://www.transifex.com/projects/p/alaveteli/language/ga_IE/)\n" "Language: ga_IE\n" "MIME-Version: 1.0\n" @@ -140,9 +140,17 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +457,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +679,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +712,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -994,6 +1017,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1063,6 +1089,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1297,6 +1326,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1369,6 +1404,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1474,6 +1512,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1543,6 +1584,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1642,6 +1689,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2100,6 +2150,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2226,9 +2279,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2396,6 +2446,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2411,9 +2464,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2752,6 +2811,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3020,9 +3082,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3234,6 +3302,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3333,6 +3410,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3465,6 +3545,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/gl/app.po b/locale/gl/app.po index 55b663ff3..570778ea6 100644 --- a/locale/gl/app.po +++ b/locale/gl/app.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:11+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Galician (http://www.transifex.com/projects/p/alaveteli/language/gl/)\n" "Language: gl\n" "MIME-Version: 1.0\n" @@ -162,10 +162,13 @@ msgstr "Sea <strong>específico</strong>, tendrá más probabilidades de consegu msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Abre una sesión</a> para cambiar tu contraseña, suscripciones... (sólo {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Si está pensando en utilizar un pseudónimo,\n" -" por favor <a href=\"{{url}}\">lea esto primero</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>¡Ya está! Muchas gracias por tu ayuda.</p><p>Hay <a href=\"{{helpus_url}}\">más cosas que puedes hacer</a> para ayudar a {{site_name}}.</p>" @@ -515,12 +518,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Esperando clasificación." msgid "Awaiting internal review." msgstr "Esperando revisión interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Esperando respuesta." @@ -730,6 +742,9 @@ msgstr "No se pudo procesar la imagen subida. Puedes utilizar PNG, JPEG, GIF u o msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -762,6 +777,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respuesta retrasada a tu solicitud de acceso a información - " @@ -1072,6 +1090,9 @@ msgstr "DETALLA TU QUEJA AQUÍ" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Resuelta por correo ordinario" @@ -1150,6 +1171,9 @@ msgstr "" msgid "Human health and safety" msgstr "Salud y seguridad" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estoy pidiendo <strong>nueva información</strong>" @@ -1407,6 +1431,12 @@ msgstr "" "Información sobre emisiones (por ejemplo ruido, energía,\n" " radiación, materiales de desecho...)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Solicitud de revisión interna" @@ -1485,6 +1515,9 @@ msgstr "Abra una sesión para descargar el fichero ZIP de {{info_request_title}} msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muy retrasada." @@ -1593,6 +1626,9 @@ msgstr "El nombre no puede estar vacío" msgid "Name is already taken" msgstr "El nombre ya está siendo utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuevas solicitudes de acceso a información" @@ -1662,6 +1698,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1761,6 +1803,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Éxito parcial." @@ -2227,6 +2272,9 @@ msgstr "Resultados descritos recientemente primero" msgid "Refused." msgstr "Rechazada." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2353,9 +2401,6 @@ msgstr "Buscar aportaciones de esta persona" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Buscar palabras en:" - msgid "Search in" msgstr "Buscar en" @@ -2529,6 +2574,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2544,9 +2592,15 @@ msgstr "Subscribirse al blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitudes de acceso a la información con éxito" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Exitosa." @@ -2910,6 +2964,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esta es tu solicitud, por lo que recibirás correos automáticamente cuando lleguen nuevas respuestas." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3191,9 +3248,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Desgraciadamente, no tenemos una dirección de correo válida para" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respuesta no habitual." @@ -3417,6 +3480,15 @@ msgstr "¿A quién puedo solicitar información?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retirada por el autor." @@ -3516,6 +3588,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puede <strong>apelar</strong>" @@ -3671,6 +3746,9 @@ msgstr "Tu correo:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Tu respuesta no ha sido enviada porque esta solicitud ha sido bloqueada para evitar spam. Por favor <a href=\"{{url}}\">contáctanos</a> si realmente quieres enviar una respuesta." diff --git a/locale/he_IL/app.po b/locale/he_IL/app.po index b9184bc97..f3d3616b3 100644 --- a/locale/he_IL/app.po +++ b/locale/he_IL/app.po @@ -23,9 +23,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-04-13 17:02+0000\n" -"Last-Translator: yehuda <yehudab@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/alaveteli/language/he_IL/)\n" "Language: he_IL\n" "MIME-Version: 1.0\n" @@ -156,8 +156,13 @@ msgstr "הקפידו על בקשה <strong>ממוקדת</strong>, כך תוכל msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">היכנסו</a> כדי לשנות סיסמה, מנויים וכדומה. (רק {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "אם אתם שוקלים שימוש בזהות בדויה, /n אנא <a href=\"{{url}}\">קיראו זאת קודם</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>זה הכל! תודה על עזרתכם.</p><p>ישנם <a href=\"{{helpus_url}}\">כמה דברים נוספים</a> שתוכלו לעשות כדי לעזור ל-{{site_name}}.</p>" @@ -467,12 +472,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "ממתין לסיווג." msgid "Awaiting internal review." msgstr "ממתין לביקורת פנימית." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "ממתין לתשובה." @@ -680,6 +694,9 @@ msgstr "קובץ התמונה שהעלתם לא נתמך. ניתן להעלות msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -713,6 +730,9 @@ msgstr "" msgid "Defunct." msgstr "מבוטל." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "עיכוב בתגובה לבקשה" @@ -1012,6 +1032,9 @@ msgstr "ספקו פרטים על התלונה שלכם כאן" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "טופל בפוסט." @@ -1081,6 +1104,9 @@ msgstr "לעומת זאת, יש לכם את הזכות לבקש מידע סבי msgid "Human health and safety" msgstr "בריאות ובטחון הציבור" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "אני מבקש <strong>מידע חדש</strong>" @@ -1315,6 +1341,12 @@ msgstr "המידע לא נמסר." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "מידע על אתרי והשלכת פסולת (כגון רעש, אנרגיה,\\n קרינה, חומרים מתכלים)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "בקשת בדיקה פנימית" @@ -1387,6 +1419,9 @@ msgstr "יש להיכנס למערכת כדי להוריד קובץ זיפ של msgid "Log into the admin interface" msgstr "התחבר לממשק הניהול" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "הבקשה מתעכבת מאוד." @@ -1492,6 +1527,9 @@ msgstr "חובה למלא שם" msgid "Name is already taken" msgstr "השם כבר תפוס" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "בקשות חדשות למידע" @@ -1561,6 +1599,12 @@ msgstr "בקשת מידע לא תקפה" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "שימו לב כי לא נודיע למבקש על הערתכם, מכיוון שהבקשה פורסמה ע\"י {{public_body_name}} ובשמם." @@ -1660,6 +1704,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What מתבצע" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "הבקשה התקבלה בחלקה." @@ -2115,6 +2162,9 @@ msgstr "תוצאות אחרונות מופיעות ראשונות" msgid "Refused." msgstr "סורב" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2241,9 +2291,6 @@ msgstr "חפש תוספות של אדם זה" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "חיפוש אחר המילים ב:" - msgid "Search in" msgstr "חפש ב- " @@ -2408,6 +2455,9 @@ msgstr "נושא:" msgid "Submit" msgstr "שלח" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2423,9 +2473,15 @@ msgstr "הירשמו לבלוג" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "בקשות מידע שנענו" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "עבר בהצלחה." @@ -2761,6 +2817,9 @@ msgstr "זוהי הגרסה הראשונה" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "זו בקשה שלכם, כך שתקבלו דוא\"ל מייד כשיגיעו תגובות חדשות." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3023,9 +3082,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "לצערנו, אין לנו כתובת פעילה לחוק {{info_request_law_used_full}}\\n עבור" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "בטל הרשמה" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "תגובה מוזרה" @@ -3231,6 +3296,15 @@ msgstr "ממי ניתן לבקש מידע?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "בוטל על-ידי מגיש הבקשה" @@ -3330,6 +3404,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "אתם יכולים <strong>להתלונן</strong> עד" @@ -3464,6 +3541,9 @@ msgstr "הדוא\"ל שלכם:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "הודעת המעקב שלכם לא נשלחה, כי היא זוהתה כדואר זבל. <a href=\"{{url}}\">נא צרו איתנו קשר</a>אם אתם באמת מעוניינים לשלוח אותה." diff --git a/locale/hr/app.po b/locale/hr/app.po index a7072e91b..01f716ceb 100644 --- a/locale/hr/app.po +++ b/locale/hr/app.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-05-04 17:02+0000\n" -"Last-Translator: Miroslav Schlossberg\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Croatian (http://www.transifex.com/projects/p/alaveteli/language/hr/)\n" "Language: hr\n" "MIME-Version: 1.0\n" @@ -160,8 +160,14 @@ msgstr "<a href=\"{{url}}\">Držite se <strong>suštine</strong></a>, lakše će msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Prijavite se</a> da biste promijenili lozinku, pretplatu ili drugo ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "<a href=\"{{url}}\">Razmišljate li o korištenju pseudonima?</a>" +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Završeno! Hvala Vam na pomoći.</p><p>Postoji <a href=\"{{helpus_url}}\">više stvari koje možete učiniti </a> da biste pomogli {{site_name}}.</p>" @@ -484,12 +490,21 @@ msgstr "E-pošta službenika za informiranje:" msgid "Authority:" msgstr "Tijelo javne vlasti:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Čeka klasifikaciju." msgid "Awaiting internal review." msgstr "Čeka odgovor na požurnicu." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Čeka odgovor." @@ -697,6 +712,9 @@ msgstr "Pogrešan format datoteke. Molimo Vas unesite: PNG, JPEG, GIF, ili neke msgid "Create a new account" msgstr "Izradi novi račun" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Izradio/la {{info_request_user}} dana {{date}}." @@ -730,6 +748,9 @@ msgstr "Poštovani {{user_name}}," msgid "Defunct." msgstr "Defunkc." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Odgovor na Vaš PPI zahtjev kasni - " @@ -1034,6 +1055,9 @@ msgstr "OVDJE IZNESITE DETALJE POŽURNICE" msgid "Got an account?" msgstr "Imate li račun?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Riješen poštom." @@ -1103,6 +1127,9 @@ msgstr "Ipak, imate pravo tražiti informacije o okolišu\\n pozivajući se na d msgid "Human health and safety" msgstr "Zdravlje i sigurnost ljudi" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Molim za <strong>nove informacije</strong>" @@ -1355,6 +1382,12 @@ msgstr "Ne posjedujemo informacije." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informacije o emisijama i ispuštanjima u okoliš (npr. buka, energija,\\n zračenje, otpadni materijali)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Zahtjev za požurnicom" @@ -1430,6 +1463,9 @@ msgstr "Prijavite se da preuzmete zip datoteku {{info_request_title}}" msgid "Log into the admin interface" msgstr "Prijavite se u administratorsko sučelje" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Kašnjenja" @@ -1535,6 +1571,9 @@ msgstr "Ime ne može ostati prazno" msgid "Name is already taken" msgstr "Ime se već koristi" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Novi zahtjevi za pristup informacijama" @@ -1604,6 +1643,12 @@ msgstr "Zahtjev za pravo na pristup informacijama nije valjan." msgid "Not a valid request" msgstr "Zahtjev nije valjan" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Uzmite u obzir da podnositelj zahtjeva neće biti obaviješten o Vašoj pribilješci, jer je zahtjev u njegovo ime objavljen od strane {{public_body_name}}." @@ -1703,6 +1748,9 @@ msgstr "Odlazna poruka|Status" msgid "OutgoingMessage|What doing" msgstr "Odlazna poruka|Što radi" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Djelomično uspješno." @@ -2168,6 +2216,9 @@ msgstr "Nedavno opisani rezultati prvi" msgid "Refused." msgstr "Odbijen." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Zapamti me (ostajete dulje prijavljeni; ne koristite na javnim računalima)" @@ -2294,9 +2345,6 @@ msgstr "Pretražite doprinose od strane ove osobe" msgid "Search for the authorities you'd like information from:" msgstr "Pretražite tijela javne vlasti od kojih biste željeli informacije:" -msgid "Search for words in:" -msgstr "Tražite riječi u:" - msgid "Search in" msgstr "Pretražite u" @@ -2467,6 +2515,9 @@ msgstr "Predmet:" msgid "Submit" msgstr "Predajte" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Predajte zahtjev" @@ -2482,9 +2533,15 @@ msgstr "Pretplatiti se na blog" msgid "Success" msgstr "Uspješno" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Uspješni zahtjevi za pristup informacijama" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Uspješan." @@ -2835,6 +2892,9 @@ msgstr "Ovo je prva verzija." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ovo je Vaš zahtjev, bit ćete automatski obaviješteni e-poštom kada stignu novi odgovori." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Ova je poruka skrivena." @@ -3114,9 +3174,15 @@ msgstr "" "Nažalost, ne posjedujemo ispravnu {{info_request_law_used_full}}\n" "adresu za" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Odjavite pretplatu" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Neobičan odgovor." @@ -3330,6 +3396,15 @@ msgstr "Od koga mogu tražiti informacije?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Zašto ovaj zahtjev smatrate neodgovarajućim?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Povučeno od strane podnositelja zahtjeva." @@ -3429,6 +3504,9 @@ msgstr "Sada <a href=\"{{wall_url_user}}\">pratite</a> ažuriranja o <a href=\"{ msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Sada <a href=\"{{wall_url_user}}\">pratite</a> ažuriranja o <a href=\"{{successful_requests_url}}\">uspješnim zahtjevima</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Možete se <strong>žaliti</strong> tako što ćete" @@ -3572,6 +3650,9 @@ msgstr "Vaša e-pošta:" msgid "Your email doesn't look like a valid address" msgstr "Vaša adresa e-pošte ne izgleda valjanom. " +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Vaš odgovor nije poslan jer je ovaj zahtjev zaustavljen kako bi se spriječila neželjena pošta. Molimo <a href=\"{{url}}\">kontaktirajte nas</a> ako stvarno želite poslati odgovor ovom tijelu." diff --git a/locale/hu_HU/app.po b/locale/hu_HU/app.po index 8bbcb39bb..4ce87cf4f 100644 --- a/locale/hu_HU/app.po +++ b/locale/hu_HU/app.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:12+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/alaveteli/language/hu_HU/)\n" "Language: hu_HU\n" "MIME-Version: 1.0\n" @@ -161,10 +161,13 @@ msgstr "Fogalmazzon <strong>lényegre törően</strong>, hogy biztosan azt kapja msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Jelentkezzen be</a> a jelszó módosításához, a feliratkozáshoz stb. (csak {{user_name}}) " -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Amenniyben álnevet kíván használni,\n" -"kérjük olvassa el előbb az ezzel kapcsolatos <a href=\"{{url}}\">tudnivalókat</a>!" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Kész! Köszönjük segítségét.</p><p>Különféle <a href=\"{{helpus_url}}\">módokon tud</a> segítséget nyújtani a {{site_name}} számára.</p> " @@ -505,12 +508,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Besorolásra vár" msgid "Awaiting internal review." msgstr "Belső felülvizsgálatra vár" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Válaszra vár" @@ -720,6 +732,9 @@ msgstr "Nem értelmezhető az ön által feltöltött képfájl. A PNG, JPEG, GI msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -752,6 +767,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Késedelmes válasz a közérdekű adatok igénylésére - " @@ -1064,6 +1082,9 @@ msgstr "ITT ÍRJA LE PANASZÁNAK RÉSZLETEIT " msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Postai úton kézbesítve" @@ -1143,6 +1164,9 @@ msgstr "" msgid "Human health and safety" msgstr "Emberi egészség és biztonság " +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "<strong>Új információt</strong> kérek " @@ -1400,6 +1424,12 @@ msgstr "" "Emisszióra és kibocsátásra (pl. zaj, energia,\n" " sugárzás, hulladékok) vonatkozó információ " +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Belső felülvizsgálatot kért" @@ -1477,6 +1507,9 @@ msgstr "Jelentkezzen be, hogy a {{info_request_title}} tárgyú adatigénylési msgid "Log into the admin interface" msgstr "Bejelentkezés az adminisztrátori interfészre" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Régóta lejárt" @@ -1587,6 +1620,9 @@ msgstr "Név nem lehet üres " msgid "Name is already taken" msgstr "Név már foglalt " +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Új közérdekűadat-igénylések " @@ -1656,6 +1692,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Az adatigénylő nem kap értesítést a hozzászólásról, mert az igénylést maga a(z) {{public_body_name}} hozta nyilvánosságra." @@ -1755,6 +1797,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Részben teljesítette" @@ -2223,6 +2268,9 @@ msgstr "Elöl a legutóbb ismertetett eredmények " msgid "Refused." msgstr "El lett utasítva" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2349,9 +2397,6 @@ msgstr "Keresés a felhasználó igényléseiben, hozzászólásaiban" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Szavak keresése a következőben: " - msgid "Search in" msgstr "Keresés a következőben: " @@ -2525,6 +2570,9 @@ msgstr "Tárgy: " msgid "Submit" msgstr "Mehet" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2540,9 +2588,15 @@ msgstr "Feliratkozás a blogra " msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Sikeres közérdekűadat-igénylések " +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Sikeres" @@ -2906,6 +2960,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ez az ön saját igénylése, így automatikusan e-mail üzenetet kap, ha válasz érkezik. " +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3189,9 +3246,15 @@ msgstr "" "Sajnos nem ismerjük a következő adatgazda működő {{info_request_law_used_full}}\n" "címét: " +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Leiratkozás" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Szokatlan válasz" @@ -3413,6 +3476,15 @@ msgstr "Kitől igényelhetek információt? " msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Az igénylő visszavonta. " @@ -3512,6 +3584,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "<strong>Panaszt nyújthat be</strong> a következő időpontig:" @@ -3665,6 +3740,9 @@ msgstr "Az ön e-mail címe: " msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Nyomon követési üzenete nem lett továbbítva, mert az igénylést a levélszemét megakadályozása érdekében leállították. <a href=\"{{url}}\">Lépjen velünk kapcsolatba</a>, ha tényleg szeretne nyomon követési üzenetet küldeni. " diff --git a/locale/id/app.po b/locale/id/app.po index ebe0185df..60829eb40 100644 --- a/locale/id/app.po +++ b/locale/id/app.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:11+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/alaveteli/language/id/)\n" "Language: id\n" "MIME-Version: 1.0\n" @@ -170,10 +170,12 @@ msgstr "Tetap <strong>fokus</strong>, Anda akan lebih mungkin untuk mendapatkan msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Daftar</a> untuk mengubah kode sandi, langganan dan lain-lain (hanya {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Jika Anda mempertimbangkan untuk menggunakan nama samaran,\n" -" silakan <a href=\"{{url}}\">baca ini terlebih dahulu</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Selesai! Terima kasih banyak untuk bantuan Anda.</p><p>Ada <a href=\"{{helpus_url}}\">lebih banyak hal-hal yang bisa Anda lakukan </a> untuk membantu{{site_name}}.</p>" @@ -532,12 +534,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Menunggu klasifikasi." msgid "Awaiting internal review." msgstr "Menunggu kajian internal." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Menunggu respon." @@ -747,6 +758,9 @@ msgstr "Tidak dapat membaca file gambar yang Anda muat. PNG, JPEG, GIF dan berba msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -779,6 +793,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Respon yang tertunda atas permintaan FOI Anda - " @@ -1090,6 +1107,9 @@ msgstr "BERIKAN RINCIAN TENTANG KEBERATAN ANDA DI SINI" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Ditangani oleh pos." @@ -1168,6 +1188,9 @@ msgstr "" msgid "Human health and safety" msgstr "Kesehatan dan keselamatan manusia" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Saya meminta <strong>informasi baru</strong>" @@ -1425,6 +1448,12 @@ msgstr "" "Informasi tentang emisi dan pembuangan (misalnya suara, energi,\n" " radiasi, bahan limbah)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Permintaan kajian internal" @@ -1502,6 +1531,9 @@ msgstr "Masuk untuk mengunduh file zip dari {{info_request_title}}" msgid "Log into the admin interface" msgstr "Masuk ke tampilan admin" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Lama terlambat." @@ -1611,6 +1643,9 @@ msgstr "Nama tidak bisa kosong" msgid "Name is already taken" msgstr "Nama sudah diambil" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Permintaan Freedom of Information baru" @@ -1680,6 +1715,12 @@ msgstr "Permintaan FOI tidak valid" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Catat bahwa peminta informasi tidak akan mendapat pemberitahuan tentang notasi Anda, karena permintaan ditampilkan oleh {{public_body_name}} atas nama mereka." @@ -1779,6 +1820,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Berhasil sebagian." @@ -2244,6 +2288,9 @@ msgstr "Hasil yang baru dijelaskan dulu" msgid "Refused." msgstr "Ditolak." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2370,9 +2417,6 @@ msgstr "Cari kontribusi oleh orang ini" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Cari kata dalam:" - msgid "Search in" msgstr "Cari di" @@ -2545,6 +2589,9 @@ msgstr "Subyek:" msgid "Submit" msgstr "Masukkan" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2560,9 +2607,15 @@ msgstr "Berlangganan kepada blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Permintaan Freedom of Information yang berhasil" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Berhasil." @@ -2925,6 +2978,9 @@ msgstr "Ini merupakan versi pertama" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ini adalah permintaan Anda sendiri, sehingga Anda akan secara otomatis dikirimi email ketika respon baru diterima." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3206,9 +3262,15 @@ msgstr "" "Sayangnya, kami tidak memiliki alamat {{info_request_law_used_full}}\n" "kerja untuk" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Berhenti langganan" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Respon yang tidak biasa." @@ -3430,6 +3492,15 @@ msgstr "Dari siapa saya dapat meminta informasi?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Ditarik oleh pemohon." @@ -3529,6 +3600,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Anda dapat <strong>mengajukan keberatan</strong> lewat" @@ -3684,6 +3758,9 @@ msgstr "Email Anda:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Tindak lanjut Anda belum dikirimkan karena permintaan ini telah dihentikan untuk mencegah spam. Silakan <a href=\"{{url}}\">hubungi kami</a> jika Anda benar-benar ingin mengirimkan pesan tindak lanjut." diff --git a/locale/is_IS/app.po b/locale/is_IS/app.po index ff12bae1b..95a9e8a5f 100644 --- a/locale/is_IS/app.po +++ b/locale/is_IS/app.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:10+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/alaveteli/language/is_IS/)\n" "Language: is_IS\n" "MIME-Version: 1.0\n" @@ -142,9 +142,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Skráðu þig inn</a> til að breyta lykilorði, áskriftum og fleiru ({{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Þetta er komið!. Takk fyri aðstoðina.</p><p>Það eru <a href=\"{{helpus_url}}\">atriði sem þú getur hjálpað með</a> hjá {{site_name}}.</p>" @@ -451,12 +456,21 @@ msgstr "Netfang stofnunar:" msgid "Authority:" msgstr "Stofnun:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Bíður eftir flokkun." msgid "Awaiting internal review." msgstr "Bíður eftir yfirlestri." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Bíður eftir svari." @@ -664,6 +678,9 @@ msgstr "Kannast ekki við myndsniðið sem þú sendir. Við styðjum PNG, JPEG, msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -694,6 +711,9 @@ msgstr "Kæri/kæra {{user_name}}," msgid "Defunct." msgstr "Úrelt." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -993,6 +1013,9 @@ msgstr "ÚTSKÝRING Á KVÖRTUN ÞINNI HÉR" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1062,6 +1085,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1296,6 +1322,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1368,6 +1400,9 @@ msgstr "Skráðu þig inn til að sækja zip skrá með {{info_request_title}}" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1473,6 +1508,9 @@ msgstr "Nafn má ekki vera tómt" msgid "Name is already taken" msgstr "Nafnið er þegar í notkun" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1542,6 +1580,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1641,6 +1685,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2096,6 +2143,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2222,9 +2272,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "Leita í" @@ -2389,6 +2436,9 @@ msgstr "Innihald:" msgid "Submit" msgstr "Senda" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Senda beiðni" @@ -2404,9 +2454,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Gögn bárust." @@ -2742,6 +2798,9 @@ msgstr "Þetta er fyrsta útgáfa." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Þetta er þín eigin beiðni þannig að þú færð sjálfkrafa tölvupóst þegar svör berast." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3004,9 +3063,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Afskrá" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3212,6 +3277,15 @@ msgstr "Hverjum get ég sent upplýsingabeiðni?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3311,6 +3385,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3443,6 +3520,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/it/app.po b/locale/it/app.po index 29e493b78..b14b3005e 100644 --- a/locale/it/app.po +++ b/locale/it/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-05-05 12:32+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Italian (http://www.transifex.com/projects/p/alaveteli/language/it/)\n" "Language: it\n" "MIME-Version: 1.0\n" @@ -145,8 +145,13 @@ msgstr "Se <strong>circoscrivi</strong> la richiesta a un solo argomento/documen msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Accedi</a> per cambiare password, iscriverti agli aggiornamenti e molto altro (solo per {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr " Se pensi di usare uno pseudonimo, per favore <a href=\"{{url}}\">leggi qui</a>" +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Tutto fatto! Grazie mille per il tuo aiuto.</p><p>Ci sono ancora <a href=\"{{helpus_url}}\">molte cose che puoi fare</a> per aiutare {{site_name}}.</p>" @@ -458,12 +463,21 @@ msgstr "Email dell'amministrazione:" msgid "Authority:" msgstr "Amministrazione:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "In attesa di classificazione." msgid "Awaiting internal review." msgstr "In attesa di approvazione interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "In attesa di risposta." @@ -671,6 +685,9 @@ msgstr "Il formato del file uploadato non è stato riconosciuto. Sono supportati msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Creato da {{info_request_user}} il {{date}}." @@ -701,6 +718,9 @@ msgstr "Caro {{user_name}}," msgid "Defunct." msgstr "Defunct" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Risposta in attesa per la tua richiesta - " @@ -1000,6 +1020,9 @@ msgstr "FORNISCI DETTAGLI SUL TUO RECLAMO QUI" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Gestito via posta." @@ -1072,6 +1095,9 @@ msgstr "Grazie a un'altra legge, comunque, hai il diritto di richiedere informaz msgid "Human health and safety" msgstr "Salute umana e sicurezza" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Sto richiedendo una <strong>nuova informazione</strong>" @@ -1306,6 +1332,12 @@ msgstr "Informazione non disponibile." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informazioni su emissioni e scarichi (es. rumore, energia, radiazioni, rifiuti)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Richiesta di revisione interna" @@ -1378,6 +1410,9 @@ msgstr "Accedi per scaricare un file compresso di {{info_request_title}}" msgid "Log into the admin interface" msgstr "Accedi all'interfaccia per amministratore" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "In ritardo." @@ -1483,6 +1518,9 @@ msgstr "Il campo Nome non può essere lasciato in bianco" msgid "Name is already taken" msgstr "Il nome è già in uso" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nuova richiesta di accesso" @@ -1552,6 +1590,12 @@ msgstr "Richiesta di accesso non valida" msgid "Not a valid request" msgstr "Richiesta non valida" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Tieni presente che il richiedente non riceverà una notifica sulla tua annotazione perché la richiesta è stata pubblicata da {{public_body_name}}." @@ -1651,6 +1695,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Parzialmente soddisfacente." @@ -2106,6 +2153,9 @@ msgstr "Mostra prima risultati più recenti" msgid "Refused." msgstr "Rifiutato." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2232,9 +2282,6 @@ msgstr "Cerca tra i contributi di questa persona" msgid "Search for the authorities you'd like information from:" msgstr "Cerca tra le amministrazioni a cui vorresti richiedere informazioni:" -msgid "Search for words in:" -msgstr "Fai una ricerca per parole chiave:" - msgid "Search in" msgstr "Cerca tra" @@ -2399,6 +2446,9 @@ msgstr "Oggetto:" msgid "Submit" msgstr "Invia" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Invia richiesta" @@ -2414,9 +2464,15 @@ msgstr "Seguici sul blog" msgid "Success" msgstr "Soddisfacente" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Richieste di accesso con risposta soddisfacente" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Pienamente soddisfacente." @@ -2756,6 +2812,9 @@ msgstr "Questa è la prima versione." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Questa è la tua richiesta, riceverai automaticamente un messaggio quando arriverà una nuova risposta." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Il messaggio è stato nascosto." @@ -3018,9 +3077,15 @@ msgstr "Non abbiamo un indirizzo valido per {{public_body_names}}." msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Non abbiamo un indirizzo valido per {{info_request_law_used_full}}" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Disiscriviti" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Unusual response." @@ -3226,6 +3291,15 @@ msgstr "A chi posso chiedere informazioni?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Perché considerate questa richiesta inadatta?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Ritirata dal richiedente." @@ -3325,6 +3399,9 @@ msgstr "Da adesso <a href=\"{{wall_url_user}}\">riceverai</a> email di aggiornam msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Da adesso <a href=\"{{wall_url_user}}\">riceverai</a> aggiornamenti via email sulle richieste che ricevono <a href=\"{{successful_requests_url}}\">risposta soddisfacente</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Puoi <strong>fare reclamo</strong>" @@ -3457,6 +3534,9 @@ msgstr "Email:" msgid "Your email doesn't look like a valid address" msgstr "La tua email non sembra un indirizzo valido" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Il tuo messaggio di follow up non è stato spedito perché questa richiesta è stata fermata dal filtro anti-spam. Per favore <a href=\"{{url}}\">contattaci</a> se vuoi ancora spedire il messaggio." diff --git a/locale/mk_MK/app.po b/locale/mk_MK/app.po index 5a5911d69..128979330 100644 --- a/locale/mk_MK/app.po +++ b/locale/mk_MK/app.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:14+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/alaveteli/language/mk_MK/)\n" "Language: mk_MK\n" "MIME-Version: 1.0\n" @@ -142,8 +142,13 @@ msgstr "Барањето треба да е <strong>фокусирано</strong msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Најавете се</a> за да ја промените лозинка, претплатата и друго (само {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Ако размилувате да употребите псевдоним,\\n Ве молиме<a href=\"{{url}}\">прочитајте го прво ова</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Готово! Благодариме за вашата помош.</p><p>Постојат <a href=\"{{helpus_url}}\">повеќе работи кои може да ги направите</a> за да помогнете {{site_name}}.</p>" @@ -451,12 +456,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Се чека класифицирање." msgid "Awaiting internal review." msgstr "Се чека внатрешна ревизија." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Се чека одговор." @@ -664,6 +678,9 @@ msgstr "Форматот на фотографијата е непознат. П msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -694,6 +711,9 @@ msgstr "" msgid "Defunct." msgstr "Мртов." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Одложен одговор на вашето барање за слободен пристап - " @@ -993,6 +1013,9 @@ msgstr "ДАДЕТЕ ДЕТАЛИ ЗА ВАЖАТА ЖАЛБА ТУКА" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Решено по пошта." @@ -1062,6 +1085,9 @@ msgstr "Секако, вие имате право да побарате инф msgid "Human health and safety" msgstr "Човеково здравје и безбедност" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Барам <strong>нови информации</strong>" @@ -1296,6 +1322,12 @@ msgstr "Информациите не се чуваат." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Информации за емисиите и испуштањата (на пр. шум, енергија,\\n радијација, отпадни материјали)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Барање за внатрешна ревизија" @@ -1368,6 +1400,9 @@ msgstr "Најавете се за да преземете zip датотека msgid "Log into the admin interface" msgstr "Најавете се на администраторскиот интерфејс" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Одамна е поминат рокот." @@ -1473,6 +1508,9 @@ msgstr "Името не може да е празно" msgid "Name is already taken" msgstr "Веќе постои такво име" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Ново барање за слободен пристап до информации" @@ -1542,6 +1580,12 @@ msgstr "Не е валидно барање за слободен пристап msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Имајте на ум дека барателот нема да биде известен за вашата белешка, бидејќи барањето беше објавено од име на {{public_body_name}}." @@ -1641,6 +1685,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Делумно успешно." @@ -2096,6 +2143,9 @@ msgstr "Прво се прикажуваат резултатите кои се msgid "Refused." msgstr "Одбиено." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2222,9 +2272,6 @@ msgstr "Пребарајте придонеси од оваа личност" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Пребарајте зборови во:" - msgid "Search in" msgstr "Пребарајте во" @@ -2389,6 +2436,9 @@ msgstr "Наслов:" msgid "Submit" msgstr "Испратете" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2404,9 +2454,15 @@ msgstr "Претплатете се на блогот" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Успешно барање за слободен пристап до информации" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Успешно." @@ -2742,6 +2798,9 @@ msgstr "Ова е првата верзија." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ова е ваше сопствено барање, затоа автоматски ќе ви биде испратена е-пошта кога ќе пристигне нов одговор." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Оваа порака беше скриена." @@ -3009,9 +3068,15 @@ msgstr "" "За жал, немаме исправна {{info_request_law_used_full}}\n" "адреса за" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Откажи претплата" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Невообичаен одговор." @@ -3221,6 +3286,15 @@ msgstr "Од кого може да побарам информации?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Повлечено од страна на барателот." @@ -3320,6 +3394,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Можете да се <strong>жалите</strong> така што" @@ -3463,6 +3540,9 @@ msgstr "Вашата е-пошта:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Вашето надоврзување не е испратено бидејќи барањето е стопирано за да се спречи spam. Ве молиме <a href=\"{{url}}\">контактирајте не</a> доколку навистина сакате да се надоврзете." diff --git a/locale/model_attributes.rb b/locale/model_attributes.rb index 89a85aac3..0c1f26618 100644 --- a/locale/model_attributes.rb +++ b/locale/model_attributes.rb @@ -149,4 +149,6 @@ _('User|Salt') _('User|Url name') _('User info request sent alert') _('UserInfoRequestSentAlert|Alert type') +_('Widget vote') +_('WidgetVote|Cookie') #DO NOT MODIFY! AUTOMATICALLY GENERATED FILE! diff --git a/locale/nb/app.po b/locale/nb/app.po index aead6a9bd..54e24de68 100644 --- a/locale/nb/app.po +++ b/locale/nb/app.po @@ -8,7 +8,7 @@ # Carl Petter F. Sky <carl.sky@gmail.com>, 2015 # gorm <gormer@gmail.com>, 2015 # gorm eriksen <team@mimesbronn.no>, 2015 -# gorm <gormer@gmail.com>, 2013 +# gorm <gormer@gmail.com>, 2013,2015 # Kjetil Torgrim Homme <kjetilho@ifi.uio.no>, 2015 # Knut Arne Bjørndal <bob+transifex@cakebox.net>, 2015 # louisecrow <louise@mysociety.org>, 2014 @@ -19,9 +19,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-06-06 13:52+0000\n" -"Last-Translator: pere <pere-transifex@hungry.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/alaveteli/language/nb/)\n" "Language: nb\n" "MIME-Version: 1.0\n" @@ -152,10 +152,13 @@ msgstr "Vær <a href=\"{{url}}\"><strong>fokusert</strong></a>, du har større s msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Logg inn</a> for å endre passord, abonnementer og mer (kun {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Hvis du vurderer å bruke et pseudonym,\\n er det fint om du\n" -"<a href=\"{{url}}\">leser dette først</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Alt er ferdig! Tusen takk for hjelpen.</p><p>Det er <a href=\"{{helpus_url}}\">flere ting du kan gjøre</a> for å hjelpe {{site_name}}.</p>" @@ -463,12 +466,21 @@ msgstr "Myndighet e-post:" msgid "Authority:" msgstr "Myndighet:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Venter på kategorisering." msgid "Awaiting internal review." msgstr "Venter på behandling av klage." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Venter på svar." @@ -676,6 +688,9 @@ msgstr "Klarer ikke å lese inn bilde-filen du lastet opp. Vi støtter PNG, JPEG msgid "Create a new account" msgstr "Lag en ny konto" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Opprettet av {{info_request_user}} den {{date}}." @@ -706,6 +721,9 @@ msgstr "Kjære {{user_name}}," msgid "Defunct." msgstr "Nedlagt." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Forsinket svar på din innsynshenvendelse - " @@ -1005,6 +1023,9 @@ msgstr "SKRIV GRUNNENE FOR HVORFOR DU KLAGER HER" msgid "Got an account?" msgstr "Har du en konto?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Håndtert av post." @@ -1074,6 +1095,9 @@ msgstr "Dog har du rett til å spørre om miljøinformasjon i følge en annen lo msgid "Human health and safety" msgstr "Menneskers helse og sikkerhet" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Jeg spør om <strong>ny informasjon</strong>" @@ -1308,6 +1332,12 @@ msgstr "Har ikke informasjonen." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informasjon om utslipp (for eksempel støy, energi,\\n stråling, avfall)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Klage" @@ -1380,6 +1410,9 @@ msgstr "Logg inn for å laste ned en zip-fil med {{info_request_title}}" msgid "Log into the admin interface" msgstr "Logg inn i administratorgrensesnittet" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Svært forsinket" @@ -1485,6 +1518,9 @@ msgstr "Navn kan ikke være tomt" msgid "Name is already taken" msgstr "Navn er allerede tatt" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nye innsynshenvendelser" @@ -1554,6 +1590,12 @@ msgstr "Ikke en gyldig innsynshenvendelse" msgid "Not a valid request" msgstr "Ikke en gyldig henvendelse" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Merk at personen som står bak henvendelsen ikke vil få beskjed om din merknad, fordi henvendelsen ble publisert av {{public_body_name}} på deres vegne." @@ -1653,6 +1695,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Delvis vellykket." @@ -2108,6 +2153,9 @@ msgstr "Nylige beskrevne resultater først" msgid "Refused." msgstr "Avslått" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Husk meg (lar deg være logget inn lengre, ikke bruk dette på en offentlig datamaskin)" @@ -2234,9 +2282,6 @@ msgstr "Søk bidrag fra denne personen" msgid "Search for the authorities you'd like information from:" msgstr "Søk etter myndighetene du kunne tenke deg informasjon fra:" -msgid "Search for words in:" -msgstr "Søk for ord i:" - msgid "Search in" msgstr "Søk i" @@ -2401,6 +2446,9 @@ msgstr "Tema:" msgid "Submit" msgstr "Send inn" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Send henvendelse" @@ -2416,9 +2464,15 @@ msgstr "Abboner på blogg" msgid "Success" msgstr "Suksess" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Vellykket innsynshenvendelse" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Vellykket." @@ -2756,6 +2810,9 @@ msgstr "Dette er den første versjonen." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Dette er din egen henvendelse, så du vil automatisk få e-post når nye svar kommer inn." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Denne meldingen har blitt skjult." @@ -3018,9 +3075,15 @@ msgstr "Desverre har vi ikke en fungerende adresse for " msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Beklageligvis har vi ikke en fungerende {{info_request_law_used_full}}-adresse for" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Meld deg av" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Uvanlig svar." @@ -3229,6 +3292,15 @@ msgstr "Hvem kan jeg be om informasjon fra?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Hvorfor mener du denne henvendelsen er upassende?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Trukket tilbake av henvenderen" @@ -3328,6 +3400,9 @@ msgstr "Du <a href=\"{{wall_url_user}}\">følger nå med på</a> oppdateringer o msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Nå <a href=\"{{wall_url_user}}\">følger du</a> oppdateringer om <a href=\"{{successful_requests_url}}\">vellykkede henvendelser</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Du kan <strong>klage</strong> ved å" @@ -3460,6 +3535,9 @@ msgstr "Din e-post:" msgid "Your email doesn't look like a valid address" msgstr "Din e-postadresse ser ikke gyldig ut" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Din oppfølging er ikke blitt sendt på grunn av at denne henvendelsen ble stoppet for å hindre søppelpost. <a href=\"{{url}}\">Ta kontakt</a> hvis du virkelig ønsker å sende en oppfølgingsmelding." diff --git a/locale/nl/app.po b/locale/nl/app.po index b564f5ca7..bf4a2c1c5 100644 --- a/locale/nl/app.po +++ b/locale/nl/app.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:11+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Dutch (http://www.transifex.com/projects/p/alaveteli/language/nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" @@ -143,9 +143,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -452,12 +457,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "In afwachting van classificatie." msgid "Awaiting internal review." msgstr "In afwachting van interne beoordeling." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "In afwachting van antwoord,\\." @@ -665,6 +679,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -695,6 +712,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Vertraagde reactie op uw WOB verzoek -" @@ -994,6 +1014,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1063,6 +1086,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1297,6 +1323,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1369,6 +1401,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1474,6 +1509,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nieuwe Wet Openbaarheid Bestuur verzoeken" @@ -1543,6 +1581,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1642,6 +1686,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Gedeeltelijk succesvol." @@ -2097,6 +2144,9 @@ msgstr "" msgid "Refused." msgstr "Geweigerd." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2223,9 +2273,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2390,6 +2437,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2405,9 +2455,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Succesvolle Wet Openbaarheid Bestuur verzoeken" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2743,6 +2799,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3005,9 +3064,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3213,6 +3278,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3312,6 +3386,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3444,6 +3521,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/nn/app.po b/locale/nn/app.po index 4a8c33dcc..4cd71b1bf 100644 --- a/locale/nn/app.po +++ b/locale/nn/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-06-10 20:28+0000\n" -"Last-Translator: pere <pere-transifex@hungry.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Norwegian Nynorsk (http://www.transifex.com/projects/p/alaveteli/language/nn/)\n" "Language: nn\n" "MIME-Version: 1.0\n" @@ -147,10 +147,13 @@ msgstr "Ver <a href=\"{{url}}\"><strong>fokusert</strong></a> – då har du st msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Logg inn</a> for å endre passord, abonnement og anna (kun {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Viss du vurderer å bruka eit pseudonym,\\n er det fint om du\n" -"<a href=\"{{url}}\">les dette først</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Alt er klart! Tusen takk for hjelpa.</p> <p>Det er <a href=\"{{helpus_url}}\">fleire ting du kan gjere</a> for å hjelpe {{site_name}}.</p>" @@ -464,12 +467,21 @@ msgstr "Styresmakt e-post:" msgid "Authority:" msgstr "Styresmakt:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Ventar på kategorisering." msgid "Awaiting internal review." msgstr "Ventar på handsaming av klage." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Ventar på svar." @@ -677,6 +689,9 @@ msgstr "Klarer ikkje å lesa inn bilete-fila du lasta opp. Vi støttar PNG, JPEG msgid "Create a new account" msgstr "Lag ein ny konto" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Oppretta av {{info_request_user}} den {{date}}." @@ -707,6 +722,9 @@ msgstr "Kjære {{user_name}}," msgid "Defunct." msgstr "Nedlagt." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Forsinka svar på din krav om innsyn - " @@ -1006,6 +1024,9 @@ msgstr "SKRIV GRUNNENE FOR KVIFOR DU KLAGAR HER" msgid "Got an account?" msgstr "Har du ein konto?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Handtert av post." @@ -1075,6 +1096,9 @@ msgstr "Endå har du rett til å spørja om miljøinformasjon i følgje ein anna msgid "Human health and safety" msgstr "Helsa til menneske og tryggleik" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Eg spør om <strong>ny informasjon</strong>" @@ -1309,6 +1333,12 @@ msgstr "Har ikkje informasjonen." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informasjon om utslipp (til dømes støy, energi,\\n stråling, avfall)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Klage" @@ -1381,6 +1411,9 @@ msgstr "Logg inn for å lasta ned ein zip-fil med {{info_request_title}}" msgid "Log into the admin interface" msgstr "Logg inn i administratorgrensesnittet" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Svært forsinka" @@ -1486,6 +1519,9 @@ msgstr "Namn kan ikkje vera tomt" msgid "Name is already taken" msgstr "Namn er allereie teke" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nye krav om innsyn" @@ -1555,6 +1591,12 @@ msgstr "Ikkje eit gyldig krav om innsyn" msgid "Not a valid request" msgstr "Ikkje ein gyldig førespurnad" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Merk at personen som står bak førespurnaden ikkje vil få melding om din bemerkning, fordi førespurnaden vart publisert av {{public_body_name}} på deira vegne." @@ -1654,6 +1696,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Delevis vellukka" @@ -2109,6 +2154,9 @@ msgstr "Nylige skildra resultat først" msgid "Refused." msgstr "Avslegen" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Hugs meg (lèt deg loggast inn lengre, ikkje bruk dette på ei offentleg datamaskin)" @@ -2235,9 +2283,6 @@ msgstr "Søk bidrag frå denne personen" msgid "Search for the authorities you'd like information from:" msgstr "Søk etter styresmaktene du kunne tenkja deg informasjon frå:" -msgid "Search for words in:" -msgstr "Søk for ord i:" - msgid "Search in" msgstr "Søk i" @@ -2402,6 +2447,9 @@ msgstr "Tittel:" msgid "Submit" msgstr "Send inn" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Send førespurnad" @@ -2417,9 +2465,15 @@ msgstr "Abboner på blogg" msgid "Success" msgstr "Suksess" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Vellukka krav om innsyn" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Vellukka." @@ -2757,6 +2811,9 @@ msgstr "Dette er den første versjonen." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Dette er din eigen førespurnad, så du vil automatisk få e-post når nye svar kjem inn." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Denne meldinga har vorte skjult." @@ -3019,9 +3076,15 @@ msgstr "Desverre har vi ikkje ei fungerande adresse for " msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Beklagelegvis har vi ikkje ein fungerande {{info_request_law_used_full}}-adresse for" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Meld deg av" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Uvanleg svar." @@ -3230,6 +3293,15 @@ msgstr "Kven kan eg be om informasjon frå?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Kvifor meiner du denne førespurnaden er upassande?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Trekt tilbake av spørjaren." @@ -3329,6 +3401,9 @@ msgstr "Du <a href=\"{{wall_url_user}}\">følgjer no med på</a> oppdateringar o msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "No <a href=\"{{wall_url_user}}\">følgjer du</a> oppdateringar om <a href=\"{{successful_requests_url}}\">vellukka førespurnader</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Du kan <strong>klaga</strong> ved å" @@ -3461,6 +3536,9 @@ msgstr "E-posten din:" msgid "Your email doesn't look like a valid address" msgstr "E-postadressa di ser ikkje gyldig ut" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Din oppfølging er ikkje vorte sendt på grunn av at denne førespurnaden vart stoppa for å hinder søppelpost. <a href=\"{{url}}\">Ta kontakt</a> viss du verkeleg ynskjer å senda ein oppfølgingsmelding." diff --git a/locale/pl/app.po b/locale/pl/app.po index 5e0bd029c..49c85009d 100644 --- a/locale/pl/app.po +++ b/locale/pl/app.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/alaveteli/language/pl/)\n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -142,9 +142,15 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -451,12 +457,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -664,6 +679,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -694,6 +712,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -994,6 +1015,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1063,6 +1087,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1297,6 +1324,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1369,6 +1402,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1474,6 +1510,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1543,6 +1582,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1642,6 +1687,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2098,6 +2146,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2224,9 +2275,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2392,6 +2440,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2407,9 +2458,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2746,6 +2803,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3010,9 +3070,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3220,6 +3286,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3319,6 +3394,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3451,6 +3529,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/pt_BR/app.po b/locale/pt_BR/app.po index 1e1114509..70814bab1 100644 --- a/locale/pt_BR/app.po +++ b/locale/pt_BR/app.po @@ -45,9 +45,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:13+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/alaveteli/language/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -185,8 +185,13 @@ msgstr "Mantenha seu pedido <strong>focado,</strong> você terá mais chances de msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Acesse aqui</a> para alterar sua senha, acompanhamento de pedidos e mais (apenas para {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Se você está pensando em usar um pseudônimo, por favor, <a href=\"{{url}}\">leia isso primeiro</a> ." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Tudo certo! Muito obrigado por sua ajuda.</p><p>Existem <a href=\"{{helpus_url}}\">mais coisas que você pode fazer</a> para ajudar o {{site_name}}.</p>" @@ -505,12 +510,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Aguardando classificação." msgid "Awaiting internal review." msgstr "Aguardando revisão." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Aguardando resposta." @@ -718,6 +732,9 @@ msgstr "Não podemos entender o arquivo da imagem que você enviou. PNG, JPEG, G msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -748,6 +765,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "A resposta ao seu pedido de informação está atrasada." @@ -1047,6 +1067,9 @@ msgstr "DÊ DETALHES SOBRE SUA QUEIXA AQUI" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Encaminhado por correio." @@ -1122,6 +1145,9 @@ msgstr "Entretanto, você tem o direito de requisitar informação ambiental por msgid "Human health and safety" msgstr "Saúde e segurança" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estou pedindo <strong>novas informações</strong>" @@ -1356,6 +1382,12 @@ msgstr "Não possui as informações." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informações sobre emissões e descargas (ex. ruído, energia, radiação, rejeitos)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Pedido de revisão" @@ -1428,6 +1460,9 @@ msgstr "Faça o login para baixar o arquivo compactado de {{info_request_title}} msgid "Log into the admin interface" msgstr "Entre na interface administrativa" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muito atrasado." @@ -1536,6 +1571,9 @@ msgstr "Nome não pode estar em branco" msgid "Name is already taken" msgstr "Nome já foi utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Novos pedidos de informação" @@ -1605,6 +1643,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Repare que o requerente não sera notificado sobre suas anotações porque a requisição foi publicada por {{public_body_name}} em outro nome." @@ -1704,6 +1748,9 @@ msgstr "OutgoingMessage | Situação" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage | O que fazer" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Concluída parcialmente." @@ -2159,6 +2206,9 @@ msgstr "Resultados descritos recentemente primeiro" msgid "Refused." msgstr "Recusado." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2285,9 +2335,6 @@ msgstr "Busque contribuições feitas por esta pessoa" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Busca por palavras em:" - msgid "Search in" msgstr "Procurar em" @@ -2452,6 +2499,9 @@ msgstr "Assunto:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2467,9 +2517,15 @@ msgstr "Assine o blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitações de acesso a informação concluídas" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Concluída." @@ -2811,6 +2867,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esse é o seu próprio pedido, então você vai receber um email automaticamente quando uma nova resposta chegar." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3077,9 +3136,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Infelizmente, nós não temos um email válido de " +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Desinscrever-se" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Outra resposta." @@ -3285,6 +3350,15 @@ msgstr "De que órgãos públicos posso solicitar informações?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Removida pelo solicitante." @@ -3384,6 +3458,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Você pode <strong>reclamar</strong> por" @@ -3524,6 +3601,9 @@ msgstr "Seu e-mail:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Sua mensagem não foi enviada por que esse pedido foi interrompido para impedir spam. Por favor <a href=\"{{url}}\">entre em contato</a> se você realmente quer enviar essa mensagem." diff --git a/locale/pt_PT/app.po b/locale/pt_PT/app.po index 018278d4c..3a9ec366a 100644 --- a/locale/pt_PT/app.po +++ b/locale/pt_PT/app.po @@ -30,9 +30,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-05-16 14:10+0000\n" -"Last-Translator: Luís Bernardo <luispaisbernardo@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/alaveteli/language/pt_PT/)\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" @@ -170,8 +170,13 @@ msgstr "Mantenha seu pedido <strong>focado,</strong> você terá mais chances de msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Entre</a> para alterar a sua palavra-passe, acompanhamento de pedidos e mais (apenas para {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Se você está pensando em usar um pseudônimo, por favor, <a href=\"{{url}}\">leia isso primeiro</a> ." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Já está! Muito obrigado pela sua ajuda.</p><p>Existem <a href=\"{{helpus_url}}\">mais coisas que você pode fazer</a> para ajudar o {{site_name}}.</p>" @@ -490,12 +495,21 @@ msgstr "Email da entidade pública:" msgid "Authority:" msgstr "Entidade pública:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Aguardando classificação." msgid "Awaiting internal review." msgstr "Aguardando revisão." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Aguardando resposta." @@ -703,6 +717,9 @@ msgstr "Não podemos entender o arquivo da imagem que você enviou. PNG, JPEG, G msgid "Create a new account" msgstr "Criar uma conta nova" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Criado por {{info_request_user}} a {{date}}." @@ -735,6 +752,9 @@ msgstr "Caro/a {{user_name}}," msgid "Defunct." msgstr "Defunto." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "A resposta ao seu pedido de informação está atrasada." @@ -1034,6 +1054,9 @@ msgstr "DÊ DETALHES SOBRE SUA QUEIXA AQUI" msgid "Got an account?" msgstr "Tem uma conta?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Encaminhado por correio." @@ -1109,6 +1132,9 @@ msgstr "Entretanto, você tem o direito de requisitar informação ambiental por msgid "Human health and safety" msgstr "Saúde e segurança" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Estou pedindo <strong>novas informações</strong>" @@ -1343,6 +1369,12 @@ msgstr "Não possui as informações." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informações sobre emissões e descargas (ex. ruído, energia, radiação, rejeitos)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Pedido de revisão" @@ -1415,6 +1447,9 @@ msgstr "Faça o login para baixar o arquivo compactado de {{info_request_title}} msgid "Log into the admin interface" msgstr "Entre na interface administrativa" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Muito atrasado." @@ -1523,6 +1558,9 @@ msgstr "Nome não pode estar em branco" msgid "Name is already taken" msgstr "Nome já foi utilizado" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Novos pedidos de informação" @@ -1592,6 +1630,12 @@ msgstr "Pedido de acesso à informação inválido" msgid "Not a valid request" msgstr "Pedido inválido" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Repare que o requerente não sera notificado sobre suas anotações porque a requisição foi publicada por {{public_body_name}} em outro nome." @@ -1691,6 +1735,9 @@ msgstr "OutgoingMessage | Situação" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage | O que fazer" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Concluída parcialmente." @@ -2146,6 +2193,9 @@ msgstr "Resultados descritos recentemente primeiro" msgid "Refused." msgstr "Recusado." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Lembre-se de mim (mantém-te autenticado por mais tempo; não utilizar num computador público)" @@ -2272,9 +2322,6 @@ msgstr "Busque contribuições feitas por esta pessoa" msgid "Search for the authorities you'd like information from:" msgstr "Procure as entidades públicas a que quer pedir informação:" -msgid "Search for words in:" -msgstr "Busca por palavras em:" - msgid "Search in" msgstr "Procurar em" @@ -2439,6 +2486,9 @@ msgstr "Assunto:" msgid "Submit" msgstr "Enviar" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Enviar pedido" @@ -2454,9 +2504,15 @@ msgstr "Assine o blog" msgid "Success" msgstr "Concluído" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitações de acesso a informação concluídas" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Concluída." @@ -2798,6 +2854,9 @@ msgstr "Esta é a primeira versão." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Esse é o seu próprio pedido, então você vai receber um email automaticamente quando uma nova resposta chegar." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Esta mensagem foi escondida." @@ -3062,9 +3121,15 @@ msgstr "Infelizmente, não temos um email funcional para a entidade {{public_bod msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Infelizmente, nós não temos um email válido de " +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Desinscrever-se" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Outra resposta." @@ -3270,6 +3335,15 @@ msgstr "De que órgãos públicos posso solicitar informações?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Por que razão considera este pedido desadequado?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Removida pelo solicitante." @@ -3369,6 +3443,9 @@ msgstr "Está a <a href=\"{{wall_url_user}}\">seguir</a> actualizações sobre < msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Está a <a href=\"{{wall_url_user}}\">seguir</a> actualizações sobre <a href=\"{{successful_requests_url}}\">pedidos respondidos</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Você pode <strong>reclamar</strong> por" @@ -3509,6 +3586,9 @@ msgstr "Seu e-mail:" msgid "Your email doesn't look like a valid address" msgstr "O seu email não parecer ser válido" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Sua mensagem não foi enviada por que esse pedido foi interrompido para impedir spam. Por favor <a href=\"{{url}}\">entre em contato</a> se você realmente quer enviar essa mensagem." diff --git a/locale/ro_RO/app.po b/locale/ro_RO/app.po index 8c7cd1eec..f72c5ea5b 100644 --- a/locale/ro_RO/app.po +++ b/locale/ro_RO/app.po @@ -25,9 +25,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:11+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/alaveteli/language/ro_RO/)\n" "Language: ro_RO\n" "MIME-Version: 1.0\n" @@ -158,8 +158,14 @@ msgstr "Fă o solicitare <strong> la obiect</strong>, va fi mai probabil să ob msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Autentifică-te</a> pentru a-ţi schimba parola şi alte setări, inclusiv cele legate de abonare ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Dacă dorești să folosești un pseudonim,\\n te rugăm <a href=\"{{url}}\">să citești întâi asta</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Gata! Mulţumim de ajutor.</p><p>Apropo, sunt <a href=\"{{helpus_url}}\">o sumedenie de alte lucruri pe care le poţi face</a> pentru a ajuta {{site_name}}.</p>" @@ -467,12 +473,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Aşteaptă clasificarea." msgid "Awaiting internal review." msgstr "Aşteaptă revizuirea interna." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Aşteaptă răspunsul." @@ -680,6 +695,9 @@ msgstr "Nu se poate prelua imaginea pe care aţi încarcat-o. PNG, JPEG, GIF și msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -710,6 +728,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Amânare răspuns la cererea ta de acces la informații - " @@ -1010,6 +1031,9 @@ msgstr "DĂ DETALII DESPRE PLÂNGEREA TA AICI" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Înmânat prin poştă" @@ -1081,6 +1105,9 @@ msgstr "Cu toate acestea, ai dreptul de a solicita informaţii \\nprivind mediul msgid "Human health and safety" msgstr "Sănătate şi asigurări" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Solicit <strong>noi informaţii</strong>" @@ -1315,6 +1342,12 @@ msgstr "Informaţie nedeţinută" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informații legate de emisii și deversări (ex. zgomot, energie, \\n radiații, deșeuri)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Solicitare revizie intrenă" @@ -1387,6 +1420,9 @@ msgstr "Logaţi-vă pentru a descărca un fişier .zip al {{info_request_title} msgid "Log into the admin interface" msgstr "Conectare la interfaţa de administrare" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Aşteptat de mult timp" @@ -1492,6 +1528,9 @@ msgstr "Campul Nume nu poate fi necompletat" msgid "Name is already taken" msgstr "Numele este deja folosit" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "O nouă solicitare de acces la informații" @@ -1561,6 +1600,12 @@ msgstr "Nu este o solicitare de informații validă" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Reţine că solicitantul nu va fi notificat cu privire la adnotarea ta deoarece solicitare a fost publicată de către {{public_body_name}} în numele lor." @@ -1660,6 +1705,9 @@ msgstr "MesajTrimis|Status" msgid "OutgoingMessage|What doing" msgstr "MesajTrimis|Ce se întamplă" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Parţial succes." @@ -2116,6 +2164,9 @@ msgstr "Prima dată rezultatele recent descrise" msgid "Refused." msgstr "Refuzat" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2242,9 +2293,6 @@ msgstr "Caută contribuţii de la această persoană" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Caută cuvinte în:" - msgid "Search in" msgstr "Caută în" @@ -2410,6 +2458,9 @@ msgstr "Subiect:" msgid "Submit" msgstr "Trimite" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2425,9 +2476,15 @@ msgstr "Înscriere pentru blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Solicitări de acces la informații care au fost făcute cu succes" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Succes" @@ -2764,6 +2821,9 @@ msgstr "Aceasta este prima versiune." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Aceasta este solicitarea proprie, aşa că ți se va comunica automat prin email când va sosi un răspuns." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3028,9 +3088,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Din păcate, nu avem o adresă funcţională {{info_request_law_used_full}}\\npentru" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Dezabonare" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Răspuns neobişnuit." @@ -3238,6 +3304,15 @@ msgstr "De la cine aş puea cere informaţiile ?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Retras de către solicitant." @@ -3337,6 +3412,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Vă puteţi <strong> plânge </strong> către" @@ -3469,6 +3547,9 @@ msgstr "Emailul tău:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Follow up-ul tău nu a fost trimis deoarece acest mesaj a fost stopat de protecţia anti-spam. Te rugăm <a href=\"{{url}}\">să ne contactezi</a> dacă dorești cu adevărat să trimiţi un mesaj de follow up." diff --git a/locale/rw/app.po b/locale/rw/app.po index bb414bd59..455ba8701 100644 --- a/locale/rw/app.po +++ b/locale/rw/app.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-04-21 17:54+0000\n" -"Last-Translator: Stephen Abbott Pugh <stephendabbott@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Kinyarwanda (http://www.transifex.com/projects/p/alaveteli/language/rw/)\n" "Language: rw\n" "MIME-Version: 1.0\n" @@ -143,8 +143,13 @@ msgstr "Gerageza kurasa <strong>ku ntego</strong>, birakorohera kubona icyo usha msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Injiramo</a> kugirango uhindure ijambobanga, ibyo wiyandikishijemo n'ibindi ({{user_name}} gusa)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Niba ushaka gukoresha irindi zina,\\n turagusaba <a href=\"{{url}}\">kubanza gusoma ibi</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Mwarangije! Murakoze cyane ku bufasha bwanyu.</p><p>Hari <a href=\"{{helpus_url}}\">ibindi mushobora gukora</a> byadufasha {{site_name}}.</p>" @@ -452,12 +457,21 @@ msgstr "Imeli y'umuyobozi:" msgid "Authority:" msgstr "Umuyobozi" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Gitegereje gushyingurwa." msgid "Awaiting internal review." msgstr "Gitegereje isuzuma." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Gitegereje igisubizo" @@ -665,6 +679,9 @@ msgstr "Ntitwabashije kumenya ubwoko bw'ifoto washyizeho. PNG, JPEG, GIF n'izind msgid "Create a new account" msgstr "Fungura indi konti" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Yashizweho na {{info_request_user}} kuwa {{date}}." @@ -695,6 +712,9 @@ msgstr "Nyakubahwa {{user_name}}," msgid "Defunct." msgstr "Ntikora." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Ikibazo cyawe cy'ubwisanzure bwo kumenya amakuru cyatinze gusubizwa -" @@ -994,6 +1014,9 @@ msgstr "TANGA IBISOBANURO KU KIREGO CYAWE HANO" msgid "Got an account?" msgstr "Ufite konti?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Byoherejwe n'iposita." @@ -1063,6 +1086,9 @@ msgstr "Nyamara, ufite uburenganzira bwo gusaba amakuru \\n ku biduki msgid "Human health and safety" msgstr "Ubuzima n'umutekano w'abantu" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Ndi gusaba <strong>amakuru mashya</strong>" @@ -1297,6 +1323,12 @@ msgstr "Ntabwo dufite ayo makuru" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Amakuru ku bihumanya (urugero: urusaku, ibikomoka ku ngufu,\\n ibyuka bihumanya, imyanda)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Gusaba igenzura" @@ -1369,6 +1401,9 @@ msgstr "Injiramo kugirango ubone dosiye yegeranyije ya {{info_request_title}}" msgid "Log into the admin interface" msgstr "Injira mu rubuga rw'abayobozi" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Cyararengeranye cyane." @@ -1474,6 +1509,9 @@ msgstr "Ugomba gushyiraho izina" msgid "Name is already taken" msgstr "Izina ryamaze gufatwa" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Ibindi bibazo bishya ku bwisanzure bwo kumenya amakuru" @@ -1543,6 +1581,12 @@ msgstr "Si ikibazo cyemewe cy'ubwisanzure bwo kumenya amakuru" msgid "Not a valid request" msgstr "Si ikibazo cyemewe" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Icyitonderwa: uwatanze ikibazo ntabwo azamenyeshwa insobanuro yawe, kuberako ikibazo cyashyizwe ahagaragara na {{public_body_name}} mu mwanya w'uwabajije." @@ -1642,6 +1686,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Hasubijwe igice kimwe." @@ -2097,6 +2144,9 @@ msgstr "Banza ibisubizo biherutse gusobanurwa" msgid "Refused." msgstr "Bagihakanye." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "Munyibuke (ituma ukomeza kuba ku murongo igihe kirekire; ntuyikoreshe kuri mudasobwa rusange)" @@ -2223,9 +2273,6 @@ msgstr "Shaka inyunganizi zatanzwe n'uyu muntu" msgid "Search for the authorities you'd like information from:" msgstr "Shaka umuyobozi wifuza kubaza amakuru:" -msgid "Search for words in:" -msgstr "Shaka amagambo ari muri:" - msgid "Search in" msgstr "Shaka muri" @@ -2390,6 +2437,9 @@ msgstr "Intego:" msgid "Submit" msgstr "Ohereza" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Ohereza ikibazo" @@ -2405,9 +2455,15 @@ msgstr "Iyandikishe ku rubuga rw'amakuru bwite" msgid "Success" msgstr "Byasubijwe" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Ibibazo by'ubwisanzure bwo kumenya amakuru byasubijwe" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Cyarasubijwe." @@ -2743,6 +2799,9 @@ msgstr "Iyi ni verisiyo ya mbere" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Iki kibazo ni wowe wagitanze, rero uzohererezwa imeli nihagira igisubizo gishya uhabwa." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Ubu butumwa bwarahishwe." @@ -3005,9 +3064,15 @@ msgstr "Ku bw'amahirwe make, ntabwo dufite imeli ikora ya {{public_body_names}}. msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Ku bw'amahirwe make, ntabwo dufite {{info_request_law_used_full}}\\naderesi ikora ya" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Kwiyandukuza" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Igisubizo kidasanzwe." @@ -3213,6 +3278,15 @@ msgstr "Ni inde nasaba amakuru?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Ni iyihe mpamvu ituma uvuga ko iki kibazo kidakwiye?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Byakuweho n'uwabajije" @@ -3312,6 +3386,9 @@ msgstr "Ubu uri <a href=\"{{wall_url_user}}\">gukurikira</a> amavugurura kuri <a msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Ubu uri <a href=\"{{wall_url_user}}\">gukurikira</a> amavugurura ku <a href=\"{{successful_requests_url}}\">bibazo byasubijwe</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Ushobora <strong>gutanga ikirego</strong> kuri" @@ -3444,6 +3521,9 @@ msgstr "Imeli yawe:" msgid "Your email doesn't look like a valid address" msgstr "Imeli yawe isa nk'itabaho" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Ubutumwa bwawe bwo gukurikirana iki kibazo bwahagaritswe mu rwego rwo kwirinda sipamu. Turagusaba <a href=\"{{url}}\">kutwandikita</a> niba koko wifuza kwohereza ubutumw bwo gukurikirana." diff --git a/locale/se/app.po b/locale/se/app.po index 34e8ef97d..1340027fa 100644 --- a/locale/se/app.po +++ b/locale/se/app.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Northern Sami (http://www.transifex.com/projects/p/alaveteli/language/se/)\n" "Language: se\n" "MIME-Version: 1.0\n" @@ -140,9 +140,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +454,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +676,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +709,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -991,6 +1011,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1060,6 +1083,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1294,6 +1320,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1366,6 +1398,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1471,6 +1506,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1540,6 +1578,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1639,6 +1683,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2094,6 +2141,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2220,9 +2270,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2387,6 +2434,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2402,9 +2452,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2740,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3002,9 +3061,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3210,6 +3275,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3309,6 +3383,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3441,6 +3518,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/sl/app.po b/locale/sl/app.po index 828ccc41c..d9662f7c6 100644 --- a/locale/sl/app.po +++ b/locale/sl/app.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:14+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/alaveteli/language/sl/)\n" "Language: sl\n" "MIME-Version: 1.0\n" @@ -144,8 +144,15 @@ msgstr "Zahtevo spišite <strong>konkretno</strong>, tako je bolj verjetno, da p msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Prijavite se</a> da spremenite geslo, spremljanja in drugo (zgolj {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Če razmišljate o rabi psevdonima, si najprej preberite <a href=\"{{url}}\">to pojasnilo</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Končano! Hvala za vašo pomoč.</p><p>Če želite pomagati {{site_name}}, lahko to storite na <a href=\"{{helpus_url}}\">več načinov</a>.</p>" @@ -453,12 +460,21 @@ msgstr "E-poštni naslov organa:" msgid "Authority:" msgstr "Organ:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Čaka na klasifikacijo." msgid "Awaiting internal review." msgstr "Čaka na interno revizijo." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Čaka odgovor." @@ -666,6 +682,9 @@ msgstr "Slika, ki ste jo naložili, ni prepoznana. Podprti so zapisi PNG, JPEG, msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "Ustvaril {{info_request_user}} v {{date}}." @@ -696,6 +715,9 @@ msgstr "S spoštovanjem, {{user_name}}," msgid "Defunct." msgstr "Nedelujoče." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Pozen odgovor na vaš zahtevek - " @@ -997,6 +1019,9 @@ msgstr "PODROBNOSTI O VAŠI PRITOŽBI VPIŠITE TU" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Poslano s pošto." @@ -1066,6 +1091,9 @@ msgstr "Imate pa pravico zahtevati okoljske informacije po drugem zakonu" msgid "Human health and safety" msgstr "Zdravje in varnost" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Sprašujem za <strong>nove informacije</strong>" @@ -1300,6 +1328,12 @@ msgstr "Teh informacij ni" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informacije o emisijah in izpustih (npr. zvok, energija, \\nsevanje, odpadni materiali)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Zahtevek za interno revizijo" @@ -1372,6 +1406,9 @@ msgstr "Prijavite se, da prenesete arhiv ZIP zahtevka {{info_request_title}}" msgid "Log into the admin interface" msgstr "Prijava v administracijski vmesnik" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Rok za odziv pretečen." @@ -1477,6 +1514,9 @@ msgstr "Ime ne more biti prazno" msgid "Name is already taken" msgstr "Ime je že zasedeno" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Nov zahtevek po informacijah javnega značaja" @@ -1546,6 +1586,12 @@ msgstr "Ni veljaven zahtevek za IJZ" msgid "Not a valid request" msgstr "Zahtevek ni veljaven" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Vedite, da prosilec ne bo obveščen o vašem zaznamku, ker je bil zahtevek objavljen na lastno željo {{public_body_name}}." @@ -1645,6 +1691,9 @@ msgstr "IzhodnoSporočilo|Status" msgid "OutgoingMessage|What doing" msgstr "IzhodnoSporočilo|Cilj" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Delno ugodeno." @@ -2102,6 +2151,9 @@ msgstr "Nedavno opisani rezultati najprej" msgid "Refused." msgstr "Zavrnjeno." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2228,9 +2280,6 @@ msgstr "Iščite prispevke te osebe" msgid "Search for the authorities you'd like information from:" msgstr "Iščite za organi, od katerih bi želeli informacije:" -msgid "Search for words in:" -msgstr "Iščite za besedami v:" - msgid "Search in" msgstr "Iščite v" @@ -2397,6 +2446,9 @@ msgstr "Zadeva:" msgid "Submit" msgstr "Pošlji" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "Pošlji zahtevek" @@ -2412,9 +2464,15 @@ msgstr "Naroči se na blog" msgid "Success" msgstr "Uspešno" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Ugodeni zahtevki za informacije javnega značaja" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Ugodeno." @@ -2752,6 +2810,9 @@ msgstr "To je prva različica." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "To je vaš zahtevek, zato boste ob spremembah obveščeni po e-pošti" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "To sporočilo je bilo skrito." @@ -3018,9 +3079,15 @@ msgstr "Žal nimamo delujočega e-naslova za {{public_body_names}}." msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Žal v bazi nimamo veljavnega naslova za zahtevke {{info_request_law_used_full}} za " +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Ne spremljaj več" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Neobičajen odgovor." @@ -3230,6 +3297,15 @@ msgstr "Od koga lahko zahtevam informacije?" msgid "Why specifically do you consider this request unsuitable?" msgstr "Zakaj se vam zdi ta zahtevek neprimeren?" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Prosilec je umaknil zahtevo." @@ -3329,6 +3405,9 @@ msgstr "Sedaj <a href=\"{{wall_url_user}}\">sledite</a> posodobitvam o <a href=\ msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "Sedaj <a href=\"{{wall_url_user}}\">sledite</a> posodobitvam o <a href=\"{{new_requests_url}}\">vseh ugodenih zahtevkih</a>." +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "<strong>Pritožite</strong> se lahko pri" @@ -3461,6 +3540,9 @@ msgstr "Vaš e-poštni naslov:" msgid "Your email doesn't look like a valid address" msgstr "Vaš e-poštni naslov ne izgleda veljaven" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Vaš odziv ni bil poslan, ker je bil ta zahtevek ustavljen, da se prepreči nezaželena pošta. Prosimo, <a href=\"{{url}}\">stopite v stik</a>, če res želite poslati sporočilo." diff --git a/locale/sq/app.po b/locale/sq/app.po index 22f3c6460..b698f31e3 100644 --- a/locale/sq/app.po +++ b/locale/sq/app.po @@ -19,9 +19,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:14+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Albanian (http://www.transifex.com/projects/p/alaveteli/language/sq/)\n" "Language: sq\n" "MIME-Version: 1.0\n" @@ -171,8 +171,13 @@ msgstr "Mbaje <strong>të fokusuar</strong>, gjasat janë më të mëdha që të msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Kyçu</a> për të ndryshuar fjalëkalimin, abonimet dhe të tjera (vetëm për {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "Nëse je duke mendu me përdor pseudonim, të lutem <a href=\"{{url}}\">lexo këtë së pari</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Të gjitha u bënë! Shumë faleminderit për ndihmën tënde. </p><p>Ka <a href=\"{{helpus_url}}\">shumë gjëra që ti mund të bësh</a> për të ndihmuar {{site_name}}. </p>" @@ -509,12 +514,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Në pritje të klasifikimit." msgid "Awaiting internal review." msgstr "Në pritje për rishqyrtim intern." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Në pritje të përgjigjes" @@ -722,6 +736,9 @@ msgstr "Fajlli i imazhit të cilin e ngarkove nuk u kuptua. Llojet që përkrahe msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -752,6 +769,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Përgjigje e vonuar në kërkesën tënde - " @@ -1064,6 +1084,9 @@ msgstr "JEPI DETAJET PËR ANKESËN TËNDE KËTU" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Do të trajtohet me postë." @@ -1141,6 +1164,9 @@ msgstr "" msgid "Human health and safety" msgstr "Shëndeti dhe siguria e njeriut" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Unë jam duke kërkuar <strong>informacion të ri</strong>" @@ -1387,6 +1413,12 @@ msgstr "Informata nuk mbahet këtu." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Kërkesë për rishqyrtim intern" @@ -1459,6 +1491,9 @@ msgstr "Kyçu për të shkarkuar zip fajllin e {{info_request_title}}" msgid "Log into the admin interface" msgstr "Kyçu në ndërfaqen administrative" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Tepër e vonuar." @@ -1568,6 +1603,9 @@ msgstr "Emri nuk mund të jetë i zbrazët" msgid "Name is already taken" msgstr "Emri është i zënë" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Kërkesat e reja për informata zyrtare " @@ -1637,6 +1675,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1736,6 +1780,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|What doing" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Pjesërisht e suksesshme." @@ -2200,6 +2247,9 @@ msgstr "Rezultatet e përshkruara së fundi radhiti të parat" msgid "Refused." msgstr "Refuzuar." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2326,9 +2376,6 @@ msgstr "Kërko për kontribute të bëra nga ky person" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Kërko fjalë në:" - msgid "Search in" msgstr "Kërko në" @@ -2498,6 +2545,9 @@ msgstr "Lënda:" msgid "Submit" msgstr "Dërgo" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2513,9 +2563,15 @@ msgstr "Abonohu në blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Kërkesat e suksesshme për Informata Zyrtare" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Suksesshme." @@ -2861,6 +2917,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Kjo është kërkesa yte, kështu që ti do të merr email automatikisht kur përgjigjet e reja arrijnë." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3133,9 +3192,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "Për fat të keq, ne nuk kemi një adresë funksionale {{info_request_law_used_full}} për" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Çregjistrohu" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "përgjigje e pazakonshme." @@ -3349,6 +3414,15 @@ msgstr "Nga kush mund të kërkoj informata?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "E tërhequr nga kërkuesi." @@ -3448,6 +3522,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Ti mund të <strong>ankohesh</strong> duke" @@ -3599,6 +3676,9 @@ msgstr "Emaili yt:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Mesazhi yt vazhdues nuk është dërguar përshkak se kërkesa ështe stopuar për të parandaluar spam emailat. Të lutem <a href=\"{{url}}\">na kontakto</a> nëse vërtet dëshiron të dërgosh mesazh vazhdues." diff --git a/locale/sr@latin/app.po b/locale/sr@latin/app.po index 56a5bd9d8..e769d6a9d 100644 --- a/locale/sr@latin/app.po +++ b/locale/sr@latin/app.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:13+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/alaveteli/language/sr@latin/)\n" "Language: sr@latin\n" "MIME-Version: 1.0\n" @@ -157,10 +157,14 @@ msgstr "Držite se <strong>suštine</strong>, lakše ćete dobiti ono što traž msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Prijavite se</a> da biste promijenili lozinku, praćenje ili druge stvari (samo {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Ako razmišljate o korištenju pseudonima,\n" -" molimo da<a href=\"{{url}}\">pročitajte prvo ovo</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Završeno! Hvala Vam na pomoći.</p><p>Postoje <a href=\"{{helpus_url}}\">i druge stvari koje možete da uradite</a> da biste doprineli sajtu {{site_name}}.</p>" @@ -472,12 +476,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Čeka na klasifikaciju." msgid "Awaiting internal review." msgstr "Čeka urgenciju." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Čeka odgovor." @@ -685,6 +698,9 @@ msgstr "Format datoteke sa slikom nije prepoznat. Podržani su PNG, JPEG, GIF i msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -715,6 +731,9 @@ msgstr "" msgid "Defunct." msgstr "Neupotrebljivo." +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Odloženi odgovor na Vaš ZOSPIOJ zahtev - " @@ -1021,6 +1040,9 @@ msgstr "OVDE IZNESITE DETALJE VAŠE ŽALBE" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Obrađeno poštom." @@ -1090,6 +1112,9 @@ msgstr "Imate, ipak, pravo da tražite informacije o prirodnoj sredini\\n po dru msgid "Human health and safety" msgstr "Zdravlje i bezbednost ljudi" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Molim za <strong>nove informacije</strong>" @@ -1327,6 +1352,12 @@ msgstr "Informacija nije u posedu." msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "Informacije o emisijama i otpadima (npr. šum\\n radijacija, otpadni materijali)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Zahtev za urgenciju" @@ -1399,6 +1430,9 @@ msgstr "Prijavite se da preuzmete {{info_request_title}} u obliku zip arhive" msgid "Log into the admin interface" msgstr "Prijavite se na administrativnu aplikaciju" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Davno prošao rok." @@ -1504,6 +1538,9 @@ msgstr "Ime ne može ostati prazno" msgid "Name is already taken" msgstr "Ime je zauzeto" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Novi Zahtevi za slobodan pristup informacijama od javnog značaja" @@ -1573,6 +1610,12 @@ msgstr "Neispravan zahtev" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "Imajte u vidu da podnosilac zahteva neće biti obavešten o Vašem komentaru, zato što je zahtev objavljen od strane ustanove {{public_body_name}} u njegovo/njeno ime." @@ -1672,6 +1715,9 @@ msgstr "OutgoingMessage|Status" msgid "OutgoingMessage|What doing" msgstr "OutgoingMessage|Šta radi" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Delimično uspešno." @@ -2139,6 +2185,9 @@ msgstr "Rezultati koji su skoro komentarisani na vrhu" msgid "Refused." msgstr "Odbijen." +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2265,9 +2314,6 @@ msgstr "Pretraži doprinose od strane ove osobe" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "Traži reči u:" - msgid "Search in" msgstr "Traži u" @@ -2439,6 +2485,9 @@ msgstr "Predmet:" msgid "Submit" msgstr "Pošalji" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2454,9 +2503,15 @@ msgstr "Pretplatiti se na blog" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Uspešni Zahtevi za slobodan pristup informacijama od javnog značaja" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Uspešan." @@ -2817,6 +2872,9 @@ msgstr "Ovo je prva verzija." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Ovo je Vaš zahtev, bićete automatski obaveštavani e-mailom kada novi odgovori budu stizali." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "Ova poruka je sakrivena." @@ -3092,9 +3150,15 @@ msgstr "" "Nažalost, ne posedujemo ispravnu \n" "adresu za upite u vezi {{info_request_law_used_full}} za" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Otkaži praćenje" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Neobičan odgovor." @@ -3312,6 +3376,15 @@ msgstr "Od koga mogu tražiti informacije?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Povučeno od strane podnosioca zahteva." @@ -3411,6 +3484,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Možete se <strong>žaliti</strong> tako što" @@ -3554,6 +3630,9 @@ msgstr "Vaš e-mail:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Vaša reakcija nije poslata zato što je ovaj zahtev blokiran da se spreči spam. Molimo <a href=\"{{url}}\">kontaktirajte nas</a> ako stvarno želite da pošaljete ovu reakciju." diff --git a/locale/sv/app.po b/locale/sv/app.po index ccfd82af2..7425ee8dc 100644 --- a/locale/sv/app.po +++ b/locale/sv/app.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Swedish (http://www.transifex.com/projects/p/alaveteli/language/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -140,9 +140,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +454,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +676,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +709,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -991,6 +1011,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1060,6 +1083,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1294,6 +1320,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1366,6 +1398,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1471,6 +1506,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1540,6 +1578,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1639,6 +1683,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2094,6 +2141,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2220,9 +2270,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2387,6 +2434,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2402,9 +2452,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2740,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3002,9 +3061,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3210,6 +3275,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3309,6 +3383,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3441,6 +3518,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/sw_KE/app.po b/locale/sw_KE/app.po index 4cb7d2722..b8ea4c30e 100644 --- a/locale/sw_KE/app.po +++ b/locale/sw_KE/app.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Swahili (Kenya) (http://www.transifex.com/projects/p/alaveteli/language/sw_KE/)\n" "Language: sw_KE\n" "MIME-Version: 1.0\n" @@ -140,9 +140,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -449,12 +454,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -662,6 +676,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -692,6 +709,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -991,6 +1011,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1060,6 +1083,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1294,6 +1320,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1366,6 +1398,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1471,6 +1506,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1540,6 +1578,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1639,6 +1683,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2094,6 +2141,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2220,9 +2270,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2387,6 +2434,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2402,9 +2452,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2740,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3002,9 +3061,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3210,6 +3275,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3309,6 +3383,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3441,6 +3518,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/tr/app.po b/locale/tr/app.po index cf25309d3..0892c5021 100644 --- a/locale/tr/app.po +++ b/locale/tr/app.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Turkish (http://www.transifex.com/projects/p/alaveteli/language/tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -144,9 +144,14 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -453,12 +458,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -666,6 +680,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -696,6 +713,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -995,6 +1015,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1064,6 +1087,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1298,6 +1324,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1370,6 +1402,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1475,6 +1510,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1544,6 +1582,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1643,6 +1687,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2098,6 +2145,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2224,9 +2274,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2391,6 +2438,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2406,9 +2456,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2744,6 +2800,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3006,9 +3065,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3214,6 +3279,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3313,6 +3387,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3445,6 +3522,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/uk/app.po b/locale/uk/app.po index d6302c37e..526aa53ab 100644 --- a/locale/uk/app.po +++ b/locale/uk/app.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 11:14+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/alaveteli/language/uk/)\n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -160,10 +160,14 @@ msgstr "Конкретизуйте ваш запит, так ви маєте б msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">Увійдіть</a>, щоб змінити пароль, підписку тощо (це стосується тільки користувача {{user_name}})" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" -"Якщо ви збираєтесь використати псевдонім,\n" -" <a href=\"{{url}}\">прочитайте спершу це</a>." + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>Готово! Дякуємо за вашу допомогу.</p><p>За бажання ви можете <a href=\"{{helpus_url}}\">зробити більше</a>, щоб допомогти сайту.</p>" @@ -500,12 +504,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "Статус не визначено." msgid "Awaiting internal review." msgstr "Очікує на внутрішню перевірку." +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "Очікує на відповідь" @@ -715,6 +728,9 @@ msgstr "Неможливо завантажити файл. Підтримють msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -747,6 +763,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "Відстрочена відповідь на ваш запит - " @@ -1059,6 +1078,9 @@ msgstr "НАДАЙТЕ ДЕТАЛІ ЩОДО ВАШОЇ СКАРГИ ТУТ" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "Надіслано звичайною поштою" @@ -1134,6 +1156,9 @@ msgstr "" msgid "Human health and safety" msgstr "Здоров’я та безпека людей" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "Я прошу <strong>нову інформацію</strong>" @@ -1386,6 +1411,12 @@ msgstr "" "Information on emissions and discharges (e.g. noise, energy,\n" " radiation, waste materials)" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "Запит на внутрішню перевірку" @@ -1463,6 +1494,9 @@ msgstr "Увійдіть в систему, щоб завантажити заа msgid "Log into the admin interface" msgstr "Увійти як адміністратор" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "Прострочений." @@ -1570,6 +1604,9 @@ msgstr "Ім’я/назва не може бути пустим" msgid "Name is already taken" msgstr "Це ім’я/назва вже використано" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "Нові запити" @@ -1639,6 +1676,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1738,6 +1781,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "Частково успішний." @@ -2197,6 +2243,9 @@ msgstr "" msgid "Refused." msgstr "Відмовлено" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2323,9 +2372,6 @@ msgstr "Пошук серед написаного цим користуваче msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "Пошук в" @@ -2491,6 +2537,9 @@ msgstr "Тема:" msgid "Submit" msgstr "Відправити" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2506,9 +2555,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "Успішні запити" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "Успішний." @@ -2849,6 +2904,9 @@ msgstr "Це перша версія." msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "Це ваш власний запит, тому вас буде автоматично повідомлено, коли прибуде відповідь." +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3117,9 +3175,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "На жаль, ми не маємо адреси " +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "Відписатися" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "Незвичайна відповідь." @@ -3335,6 +3399,15 @@ msgstr "Кому я можу надіслати інформаційний за msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "Автор запиту відмовився від нього." @@ -3434,6 +3507,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "Ви можете поскаржитися таким чином: " @@ -3586,6 +3662,9 @@ msgstr "Електронна адреса:" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "Ваше повідомлення не було надіслано, тому що цей запит не пройшов спам-фільтр." diff --git a/locale/vi/app.po b/locale/vi/app.po index 2a99d41fd..8dbefbdc0 100644 --- a/locale/vi/app.po +++ b/locale/vi/app.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-03-24 10:53+0000\n" -"Last-Translator: louisecrow <louise@mysociety.org>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/alaveteli/language/vi/)\n" "Language: vi\n" "MIME-Version: 1.0\n" @@ -145,9 +145,13 @@ msgstr "" msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" msgstr "" +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" + msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "" @@ -454,12 +458,21 @@ msgstr "" msgid "Authority:" msgstr "" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "" msgid "Awaiting internal review." msgstr "" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "" @@ -667,6 +680,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -697,6 +713,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -995,6 +1014,9 @@ msgstr "" msgid "Got an account?" msgstr "" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1064,6 +1086,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "" @@ -1298,6 +1323,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1370,6 +1401,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1475,6 +1509,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1544,6 +1581,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1643,6 +1686,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2097,6 +2143,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2223,9 +2272,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2389,6 +2435,9 @@ msgstr "" msgid "Submit" msgstr "" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2404,9 +2453,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "" @@ -2741,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "" @@ -3001,9 +3059,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3207,6 +3271,15 @@ msgstr "" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3306,6 +3379,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3438,6 +3514,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/locale/zh_HK/app.po b/locale/zh_HK/app.po index 31f0b49c8..cd2b1a70d 100644 --- a/locale/zh_HK/app.po +++ b/locale/zh_HK/app.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# beckymak <makpowan@gmail.com>, 2015 # caxekis <caxekis@gmail.com>, 2013 # caxekis <caxekis@gmail.com>, 2013 # beckymak <makpowan@gmail.com>, 2015 @@ -11,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: alaveteli\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-24 10:21+0000\n" -"PO-Revision-Date: 2015-06-11 18:15+0000\n" -"Last-Translator: spions kwong <kwong.mpi@gmail.com>\n" +"POT-Creation-Date: 2015-06-15 16:29+0000\n" +"PO-Revision-Date: 2015-06-15 16:30+0000\n" +"Last-Translator: Gareth Rees <gareth@mysociety.org>\n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/alaveteli/language/zh_HK/)\n" "Language: zh_HK\n" "MIME-Version: 1.0\n" @@ -144,8 +145,12 @@ msgstr "<a href=\"{{url}}\">請說明 <strong>重點</strong></a>, 你會更易 msgid "<a href=\"{{url}}\">Sign in</a> to change password, subscriptions and more ({{user_name}} only)" msgstr "<a href=\"{{url}}\">登入</a> 以更改密碼,訂閱選項及更多 ({{user_name}} only)" -msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>." -msgstr "<a href=\"{{url}}\">考慮是否使用化名?</a>." +msgid "<a href=\"{{url}}\">Thinking of using a pseudonym?</a>" +msgstr "" + +msgid "<div class=\"alaveteli-widget__count\">{{count}}</div> person wants to know" +msgid_plural "<div class=\"alaveteli-widget__count\">{{count}}</div> people want to know" +msgstr[0] "" msgid "<p>All done! Thank you very much for your help.</p><p>There are <a href=\"{{helpus_url}}\">more things you can do</a> to help {{site_name}}.</p>" msgstr "<p>已經完成!感謝你的協助。</p><p>{{site_name}} <a href=\"{{helpus_url}}\">這裡有更多事情</a>需要你的幫忙。</p>" @@ -453,12 +458,21 @@ msgstr "部門或機構的電郵:" msgid "Authority:" msgstr "政府部門或公營機構:" +msgid "Awaiting clarification" +msgstr "" + +msgid "Awaiting classification" +msgstr "" + msgid "Awaiting classification." msgstr "等待分類中。" msgid "Awaiting internal review." msgstr "正等待內部審核。" +msgid "Awaiting response" +msgstr "" + msgid "Awaiting response." msgstr "正等待回應。" @@ -666,6 +680,9 @@ msgstr "" msgid "Create a new account" msgstr "" +msgid "Create a widget for this request" +msgstr "" + msgid "Created by {{info_request_user}} on {{date}}." msgstr "" @@ -696,6 +713,9 @@ msgstr "" msgid "Defunct." msgstr "" +msgid "Delayed" +msgstr "" + msgid "Delayed response to your FOI request - " msgstr "" @@ -994,6 +1014,9 @@ msgstr "" msgid "Got an account?" msgstr "是否已持有帳戶?" +msgid "Handled by post" +msgstr "" + msgid "Handled by post." msgstr "" @@ -1063,6 +1086,9 @@ msgstr "" msgid "Human health and safety" msgstr "" +msgid "I also want to know!" +msgstr "" + msgid "I am asking for <strong>new information</strong>" msgstr "我正在要求<strong>新的資料</strong>" @@ -1297,6 +1323,12 @@ msgstr "" msgid "Information on emissions and discharges (e.g. noise, energy,\\n radiation, waste materials)" msgstr "" +msgid "Internal review" +msgstr "" + +msgid "Internal review of {{email_subject}}" +msgstr "" + msgid "Internal review request" msgstr "" @@ -1369,6 +1401,9 @@ msgstr "" msgid "Log into the admin interface" msgstr "" +msgid "Long overdue" +msgstr "" + msgid "Long overdue." msgstr "" @@ -1474,6 +1509,9 @@ msgstr "" msgid "Name is already taken" msgstr "" +msgid "Needs admin attention" +msgstr "" + msgid "New Freedom of Information requests" msgstr "" @@ -1543,6 +1581,12 @@ msgstr "" msgid "Not a valid request" msgstr "" +msgid "Not an FOI request" +msgstr "" + +msgid "Not held" +msgstr "" + msgid "Note that the requester will not be notified about your annotation, because the request was published by {{public_body_name}} on their behalf." msgstr "" @@ -1642,6 +1686,9 @@ msgstr "" msgid "OutgoingMessage|What doing" msgstr "" +msgid "Partial success" +msgstr "" + msgid "Partially successful." msgstr "" @@ -2096,6 +2143,9 @@ msgstr "" msgid "Refused." msgstr "" +msgid "Rejected" +msgstr "" + msgid "Remember me (keeps you signed in longer; do not use on a public computer)" msgstr "" @@ -2222,9 +2272,6 @@ msgstr "" msgid "Search for the authorities you'd like information from:" msgstr "" -msgid "Search for words in:" -msgstr "" - msgid "Search in" msgstr "" @@ -2388,6 +2435,9 @@ msgstr "" msgid "Submit" msgstr "提交" +msgid "Submit Search" +msgstr "" + msgid "Submit request" msgstr "" @@ -2403,9 +2453,15 @@ msgstr "" msgid "Success" msgstr "" +msgid "Successful" +msgstr "" + msgid "Successful Freedom of Information requests" msgstr "更多成功案例" +msgid "Successful requests" +msgstr "" + msgid "Successful." msgstr "成功。" @@ -2740,6 +2796,9 @@ msgstr "" msgid "This is your own request, so you will be automatically emailed when new responses arrive." msgstr "" +msgid "This is your request" +msgstr "" + msgid "This message has been hidden." msgstr "此訊息已被隱藏。" @@ -3000,9 +3059,15 @@ msgstr "" msgid "Unfortunately, we do not have a working {{info_request_law_used_full}}\\naddress for" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unsubscribe" msgstr "取消訂閱" +msgid "Unusual response" +msgstr "" + msgid "Unusual response." msgstr "" @@ -3206,6 +3271,15 @@ msgstr "我可以向哪些部門及機構查閱資料?" msgid "Why specifically do you consider this request unsuitable?" msgstr "" +msgid "Widget vote" +msgstr "" + +msgid "WidgetVote|Cookie" +msgstr "" + +msgid "Withdrawn" +msgstr "" + msgid "Withdrawn by the requester." msgstr "" @@ -3305,6 +3379,9 @@ msgstr "" msgid "You are now <a href=\"{{wall_url_user}}\">following</a> updates about <a href=\"{{successful_requests_url}}\">successful requests</a>." msgstr "" +msgid "You are tracking this request" +msgstr "" + msgid "You can <strong>complain</strong> by" msgstr "" @@ -3437,6 +3514,9 @@ msgstr "" msgid "Your email doesn't look like a valid address" msgstr "" +msgid "Your email:" +msgstr "" + msgid "Your follow up has not been sent because this request has been stopped to prevent spam. Please <a href=\"{{url}}\">contact us</a> if you really want to send a follow up message." msgstr "" diff --git a/public/.cvsignore b/public/.cvsignore deleted file mode 100644 index 9fc54a4a6..000000000 --- a/public/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -down.html -down.current.html -foi-live-creation.png -foi-user-use.png -google*.html diff --git a/script/handle-mail-replies.rb b/script/handle-mail-replies.rb index 29f618154..89c24809d 100755 --- a/script/handle-mail-replies.rb +++ b/script/handle-mail-replies.rb @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- # Handle email responses sent to us. # diff --git a/script/mailin b/script/mailin index f6b7d1194..48e236cfe 100755 --- a/script/mailin +++ b/script/mailin @@ -23,7 +23,7 @@ then SUBJ="Mail import error for $OPTION_DOMAIN" BODY="There was an error code $ERROR_CODE returned by the RequestMailer.receive command in script/mailin. See attached for details. This might be quite serious, such as the database was down, or might be an email with corrupt headers that Rails is choking on. We returned the email with an exit code 75, which for Exim at least instructs the MTA to try again later. A well configured installation of this code will separately have had Exim make a backup copy of the email in a separate mailbox, just in case." FROM="$OPTION_BLACKHOLE_PREFIX@$OPTION_INCOMING_EMAIL_DOMAIN" - /usr/bin/mutt -e "set use_envelope_from" -e "set envelope_from_address=$FROM" -s "$SUBJ" -a "$OUTPUT" "$INPUT" -- "$OPTION_FORWARD_NONBOUNCE_RESPONSES_TO" <<<"$BODY" + /usr/bin/mutt -e "set use_envelope_from" -e "set envelope_from_address=$FROM" -s "$SUBJ" -a "$OUTPUT" "$INPUT" -- "$OPTION_EXCEPTION_NOTIFICATIONS_TO" <<<"$BODY" # tell exim error was temporary, so try again later (no point bouncing message to authority) rm -f "$INPUT" "$OUTPUT" diff --git a/script/request-creation-graph b/script/request-creation-graph index 7d347a7d2..9b91e44b9 100755 --- a/script/request-creation-graph +++ b/script/request-creation-graph @@ -17,11 +17,7 @@ cd `dirname $0` cd ../ source commonlib/shlib/deployfns -# TODO: this is nasty :) -OPTION_FOI_DB_HOST=`grep "host:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_PORT=`grep "port:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_NAME=`grep "database:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_USER=`grep "username:" config/database.yml | head --lines=1 | cut -d ":" -f 2` +read OPTION_FOI_DB_HOST OPTION_FOI_DB_PORT OPTION_FOI_DB_NAME OPTION_FOI_DB_USER <<<$(ruby -r yaml -e 'db = YAML::load(STDIN.read); pr = db["production"]; puts pr["host"], pr["port"], pr["database"], pr["username"]' < config/database.yml) SOURCEA=/tmp/foi-creation-rate-graph-data-$RANDOM$RANDOM SOURCEB=/tmp/foi-creation-rate-graph-data-$RANDOM$RANDOM @@ -51,6 +47,12 @@ function grab_data { # rather nastily, work out the cumulative heights in reverse, so can plot impulses on top of each other grab_data "where (1 = 1)" $SOURCEA +if [ ! -s $SOURCEA ] ; then + # No data yet, skip graphing + echo "warning: no data to graph, skipping task" + exit +fi + grab_data "where described_state not in ('waiting_response')" $SOURCEB grab_data "where described_state not in ('waiting_response', 'waiting_clarification')" $SOURCEC grab_data "where described_state not in ('waiting_response', 'waiting_clarification', 'not_held')" $SOURCED diff --git a/script/site-specific-install.sh b/script/site-specific-install.sh index fba164213..9358103b2 100755 --- a/script/site-specific-install.sh +++ b/script/site-specific-install.sh @@ -180,6 +180,9 @@ postfix reload install_website_packages +# Give the unix user membership of the adm group so that they can read the mail log files +usermod -a -G adm "$UNIX_USER" + # Make the PostgreSQL user a superuser to avoid the irritating error: # PG::Error: ERROR: permission denied: "RI_ConstraintTrigger_16564" is a system trigger # This is only needed for loading the sample data, so the superuser @@ -208,14 +211,14 @@ echo $DONE_MSG if [ ! "$DEVELOPMENT_INSTALL" = true ]; then echo -n "Creating /etc/init.d/$SITE... " - (su -l -c "cd '$REPOSITORY' && bundle exec rake config_files:convert_init_script DEPLOY_USER='$UNIX_USER' VHOST_DIR='$DIRECTORY' VCSPATH='$SITE' SITE='$SITE' SCRIPT_FILE=config/sysvinit-thin.ugly" "$UNIX_USER") > /etc/init.d/"$SITE" + (su -l -c "cd '$REPOSITORY' && bundle exec rake config_files:convert_init_script DEPLOY_USER='$UNIX_USER' VHOST_DIR='$DIRECTORY' VCSPATH='$SITE' SITE='$SITE' SCRIPT_FILE=config/sysvinit-thin.example" "$UNIX_USER") > /etc/init.d/"$SITE" chgrp "$UNIX_USER" /etc/init.d/"$SITE" chmod 754 /etc/init.d/"$SITE" echo $DONE_MSG fi echo -n "Creating /etc/init.d/$SITE-alert-tracks... " -(su -l -c "cd '$REPOSITORY' && bundle exec rake config_files:convert_init_script DEPLOY_USER='$UNIX_USER' VHOST_DIR='$DIRECTORY' SCRIPT_FILE=config/alert-tracks-debian.ugly" "$UNIX_USER") > /etc/init.d/"$SITE-alert-tracks" +(su -l -c "cd '$REPOSITORY' && bundle exec rake config_files:convert_init_script DEPLOY_USER='$UNIX_USER' VHOST_DIR='$DIRECTORY' SCRIPT_FILE=config/alert-tracks-debian.example" "$UNIX_USER") > /etc/init.d/"$SITE-alert-tracks" chgrp "$UNIX_USER" /etc/init.d/"$SITE-alert-tracks" chmod 754 /etc/init.d/"$SITE-alert-tracks" echo $DONE_MSG diff --git a/script/switch-theme.rb b/script/switch-theme.rb index 980853687..47b3991c1 100755 --- a/script/switch-theme.rb +++ b/script/switch-theme.rb @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- # A simple script to swap around your Alaveteli themes when you're # hacking on Alaveteli. By default this assumes that you have an @@ -129,5 +129,5 @@ STDERR.puts """Switched to #{requested_theme}! You will need to: 1. restart any development server you have running. 2. run: bundle exec rake assets:clean - 3. run: bundle exec rake assets:precompile + 3. run: bundle exec rake assets:precompile (if running in production mode) """ diff --git a/script/user-use-graph b/script/user-use-graph index 00eeb36f8..aad471a4b 100755 --- a/script/user-use-graph +++ b/script/user-use-graph @@ -16,11 +16,7 @@ cd `dirname $0` cd ../ source commonlib/shlib/deployfns -# TODO: this is nasty :) -OPTION_FOI_DB_HOST=`grep "host:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_PORT=`grep "port:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_NAME=`grep "database:" config/database.yml | head --lines=1 | cut -d ":" -f 2` -OPTION_FOI_DB_USER=`grep "username:" config/database.yml | head --lines=1 | cut -d ":" -f 2` +read OPTION_FOI_DB_HOST OPTION_FOI_DB_PORT OPTION_FOI_DB_NAME OPTION_FOI_DB_USER <<<$(ruby -r yaml -e 'db = YAML::load(STDIN.read); pr = db["production"]; puts pr["host"], pr["port"], pr["database"], pr["username"]' < config/database.yml) SOURCEA=/tmp/foi-creation-rate-graph-data-$RANDOM$RANDOM SOURCEB=/tmp/foi-creation-rate-graph-data-$RANDOM$RANDOM diff --git a/spec/controllers/admin_censor_rule_controller_spec.rb b/spec/controllers/admin_censor_rule_controller_spec.rb index 68eaecd6a..b9f936836 100644 --- a/spec/controllers/admin_censor_rule_controller_spec.rb +++ b/spec/controllers/admin_censor_rule_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminCensorRuleController do @@ -584,7 +585,7 @@ describe AdminCensorRuleController, "when making censor rules from the admin int :replacement => "tofu", :last_edit_comment => "none" } - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end end diff --git a/spec/controllers/admin_comment_controller_spec.rb b/spec/controllers/admin_comment_controller_spec.rb index f87231e3b..00b6e6cc9 100644 --- a/spec/controllers/admin_comment_controller_spec.rb +++ b/spec/controllers/admin_comment_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminCommentController do diff --git a/spec/controllers/admin_general_controller_spec.rb b/spec/controllers/admin_general_controller_spec.rb index cc2ec41b4..b2e8b233f 100644 --- a/spec/controllers/admin_general_controller_spec.rb +++ b/spec/controllers/admin_general_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminGeneralController do diff --git a/spec/controllers/admin_holiday_imports_controller_spec.rb b/spec/controllers/admin_holiday_imports_controller_spec.rb index dd23a022f..42dfadd47 100644 --- a/spec/controllers/admin_holiday_imports_controller_spec.rb +++ b/spec/controllers/admin_holiday_imports_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe AdminHolidayImportsController do diff --git a/spec/controllers/admin_holidays_controller_spec.rb b/spec/controllers/admin_holidays_controller_spec.rb index 21cb51d29..93f51707b 100644 --- a/spec/controllers/admin_holidays_controller_spec.rb +++ b/spec/controllers/admin_holidays_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe AdminHolidaysController do diff --git a/spec/controllers/admin_incoming_message_controller_spec.rb b/spec/controllers/admin_incoming_message_controller_spec.rb index 24a526ca4..39355c054 100644 --- a/spec/controllers/admin_incoming_message_controller_spec.rb +++ b/spec/controllers/admin_incoming_message_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminIncomingMessageController, "when administering incoming messages" do diff --git a/spec/controllers/admin_info_request_event_controller_spec.rb b/spec/controllers/admin_info_request_event_controller_spec.rb index 23300a0b8..dfa425374 100644 --- a/spec/controllers/admin_info_request_event_controller_spec.rb +++ b/spec/controllers/admin_info_request_event_controller_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminInfoRequestEventController do diff --git a/spec/controllers/admin_outgoing_message_controller_spec.rb b/spec/controllers/admin_outgoing_message_controller_spec.rb index a46a077da..f231311ae 100644 --- a/spec/controllers/admin_outgoing_message_controller_spec.rb +++ b/spec/controllers/admin_outgoing_message_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminOutgoingMessageController do diff --git a/spec/controllers/admin_public_body_categories_controller_spec.rb b/spec/controllers/admin_public_body_categories_controller_spec.rb index 1131b3c0b..1aa8a145e 100644 --- a/spec/controllers/admin_public_body_categories_controller_spec.rb +++ b/spec/controllers/admin_public_body_categories_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe AdminPublicBodyCategoriesController do @@ -310,7 +311,7 @@ describe AdminPublicBodyCategoriesController do post :update, :id => category.id, :public_body_category => category.serializable_hash.except(:title, :description) - expect(assigns(:tagged_public_bodies)).to eq(expected_bodies) + expect(assigns(:tagged_public_bodies)).to match_array(expected_bodies) end it "saves edits to a public body category's heading associations" do diff --git a/spec/controllers/admin_public_body_change_requests_controller_spec.rb b/spec/controllers/admin_public_body_change_requests_controller_spec.rb index 003510e60..b0a9ebd79 100644 --- a/spec/controllers/admin_public_body_change_requests_controller_spec.rb +++ b/spec/controllers/admin_public_body_change_requests_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminPublicBodyChangeRequestsController, "editing a change request" do diff --git a/spec/controllers/admin_public_body_controller_spec.rb b/spec/controllers/admin_public_body_controller_spec.rb index 50a373d9d..f7336a6c7 100644 --- a/spec/controllers/admin_public_body_controller_spec.rb +++ b/spec/controllers/admin_public_body_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminPublicBodyController, "when showing the index of public bodies" do @@ -128,7 +129,8 @@ describe AdminPublicBodyController, "when creating a public body" do :last_edit_comment => 'From test code', :translations_attributes => { 'es' => { :locale => 'es', - :name => 'Los Quango' } + :name => 'Los Quango', + :short_name => 'lq' } } } } end @@ -159,6 +161,8 @@ describe AdminPublicBodyController, "when creating a public body" do I18n.with_locale(:es) do expect(body.name).to eq('Los Quango') + expect(body.url_name).to eq('lq') + expect(body.first_letter).to eq('L') end end @@ -650,17 +654,17 @@ describe AdminPublicBodyController, "when administering public bodies and paying render_views before do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['SKIP_ADMIN_AUTH'] = false basic_auth_login @request end after do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['SKIP_ADMIN_AUTH'] = true end def setup_emergency_credentials(username, password) - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['SKIP_ADMIN_AUTH'] = false config['ADMIN_USERNAME'] = username config['ADMIN_PASSWORD'] = password @@ -677,7 +681,7 @@ describe AdminPublicBodyController, "when administering public bodies and paying end it "skips admin authorisation when SKIP_ADMIN_AUTH set" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['SKIP_ADMIN_AUTH'] = true @request.env["HTTP_AUTHORIZATION"] = "" n = PublicBody.count @@ -757,7 +761,7 @@ describe AdminPublicBodyController, "when administering public bodies and paying end it 'returns the REMOTE_USER value from the request environment when skipping admin auth' do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['SKIP_ADMIN_AUTH'] = true @request.env["HTTP_AUTHORIZATION"] = "" @request.env["REMOTE_USER"] = "i_am_admin" diff --git a/spec/controllers/admin_public_body_headings_controller_spec.rb b/spec/controllers/admin_public_body_headings_controller_spec.rb index ccdfdecfb..0e0337e3e 100644 --- a/spec/controllers/admin_public_body_headings_controller_spec.rb +++ b/spec/controllers/admin_public_body_headings_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe AdminPublicBodyHeadingsController do diff --git a/spec/controllers/admin_raw_email_controller_spec.rb b/spec/controllers/admin_raw_email_controller_spec.rb index 77c57c38b..9039286bc 100644 --- a/spec/controllers/admin_raw_email_controller_spec.rb +++ b/spec/controllers/admin_raw_email_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminRawEmailController do diff --git a/spec/controllers/admin_request_controller_spec.rb b/spec/controllers/admin_request_controller_spec.rb index 4eb463963..61827bfd1 100644 --- a/spec/controllers/admin_request_controller_spec.rb +++ b/spec/controllers/admin_request_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminRequestController, "when administering requests" do diff --git a/spec/controllers/admin_spam_addresses_controller_spec.rb b/spec/controllers/admin_spam_addresses_controller_spec.rb index a1e434159..8f6d57b01 100644 --- a/spec/controllers/admin_spam_addresses_controller_spec.rb +++ b/spec/controllers/admin_spam_addresses_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe AdminSpamAddressesController do diff --git a/spec/controllers/admin_track_controller_spec.rb b/spec/controllers/admin_track_controller_spec.rb index d29db4966..b77570a27 100644 --- a/spec/controllers/admin_track_controller_spec.rb +++ b/spec/controllers/admin_track_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminTrackController, "when administering tracks" do diff --git a/spec/controllers/admin_user_controller_spec.rb b/spec/controllers/admin_user_controller_spec.rb index e979355cf..9341feec6 100644 --- a/spec/controllers/admin_user_controller_spec.rb +++ b/spec/controllers/admin_user_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminUserController, "when administering users" do diff --git a/spec/controllers/api_controller_spec.rb b/spec/controllers/api_controller_spec.rb index 323ef4cd4..d8af59ad8 100644 --- a/spec/controllers/api_controller_spec.rb +++ b/spec/controllers/api_controller_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe ApiController, "when using the API" do diff --git a/spec/controllers/comment_controller_spec.rb b/spec/controllers/comment_controller_spec.rb index 480c85ad7..cfd7166f4 100644 --- a/spec/controllers/comment_controller_spec.rb +++ b/spec/controllers/comment_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe CommentController, "when commenting on a request" do diff --git a/spec/controllers/general_controller_spec.rb b/spec/controllers/general_controller_spec.rb index 844fcd4e6..495624403 100644 --- a/spec/controllers/general_controller_spec.rb +++ b/spec/controllers/general_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'fakeweb' @@ -111,7 +112,7 @@ describe GeneralController, "when showing the frontpage" do it "should render the front page with default language and ignore the browser setting" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['USE_DEFAULT_BROWSER_LANGUAGE'] = false accept_language = "en-GB,en-US;q=0.8,en;q=0.6" request.env['HTTP_ACCEPT_LANGUAGE'] = accept_language @@ -122,7 +123,7 @@ describe GeneralController, "when showing the frontpage" do end it "should render the front page with browser-selected language when there's no default set" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['USE_DEFAULT_BROWSER_LANGUAGE'] = true accept_language = "es-ES,en-GB,en-US;q=0.8,en;q=0.6" request.env['HTTP_ACCEPT_LANGUAGE'] = accept_language diff --git a/spec/controllers/health_checks_controller_spec.rb b/spec/controllers/health_checks_controller_spec.rb index f7ad6d6a4..2403fb3c8 100644 --- a/spec/controllers/health_checks_controller_spec.rb +++ b/spec/controllers/health_checks_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HealthChecksController do diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb index 9453c9461..338a86380 100644 --- a/spec/controllers/help_controller_spec.rb +++ b/spec/controllers/help_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HelpController do diff --git a/spec/controllers/info_request_batch_controller_spec.rb b/spec/controllers/info_request_batch_controller_spec.rb index d08f02e10..866a1d0dc 100644 --- a/spec/controllers/info_request_batch_controller_spec.rb +++ b/spec/controllers/info_request_batch_controller_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe InfoRequestBatchController, "when showing a request" do diff --git a/spec/controllers/public_body_change_requests_controller_spec.rb b/spec/controllers/public_body_change_requests_controller_spec.rb index 4053b2f40..a8f149cc6 100644 --- a/spec/controllers/public_body_change_requests_controller_spec.rb +++ b/spec/controllers/public_body_change_requests_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBodyChangeRequestsController, "making a new change request" do diff --git a/spec/controllers/public_body_controller_spec.rb b/spec/controllers/public_body_controller_spec.rb index ff0a70a6f..c5c94a45c 100644 --- a/spec/controllers/public_body_controller_spec.rb +++ b/spec/controllers/public_body_controller_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'nokogiri' @@ -336,7 +336,7 @@ end describe PublicBodyController, "when showing public body statistics" do it "should render the right template with the right data" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['MINIMUM_REQUESTS_FOR_STATISTICS'] = 1 config['PUBLIC_BODY_STATISTICS_PAGE'] = true get :statistics diff --git a/spec/controllers/reports_controller_spec.rb b/spec/controllers/reports_controller_spec.rb index fa8c72eaa..91be67fd8 100644 --- a/spec/controllers/reports_controller_spec.rb +++ b/spec/controllers/reports_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'spec_helper' describe ReportsController, "when reporting a request when not logged in" do diff --git a/spec/controllers/request_controller_spec.rb b/spec/controllers/request_controller_spec.rb index 02237b29d..9e2e1bff7 100644 --- a/spec/controllers/request_controller_spec.rb +++ b/spec/controllers/request_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe RequestController, "when listing recent requests" do @@ -40,41 +40,41 @@ describe RequestController, "when changing things that appear on the request pag it "should purge the downstream cache when mail is received" do ir = info_requests(:fancy_dog_request) receive_incoming_mail('incoming-request-plain.email', ir.incoming_email) - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end it "should purge the downstream cache when a comment is added" do ir = info_requests(:fancy_dog_request) new_comment = info_requests(:fancy_dog_request).add_comment('I also love making annotations.', users(:bob_smith_user)) - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end it "should purge the downstream cache when a followup is made" do session[:user_id] = users(:bob_smith_user).id ir = info_requests(:fancy_dog_request) post :show_response, :outgoing_message => { :body => "What a useless response! You suck.", :what_doing => 'normal_sort' }, :id => ir.id, :submitted_followup => 1 - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end it "should purge the downstream cache when the request is categorised" do ir = info_requests(:fancy_dog_request) ir.set_described_state('waiting_clarification') - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end it "should purge the downstream cache when the authority data is changed" do ir = info_requests(:fancy_dog_request) ir.public_body.name = "Something new" ir.public_body.save! - PurgeRequest.all().map{|x| x.model_id}.should =~ ir.public_body.info_requests.map{|x| x.id} + PurgeRequest.all.map{|x| x.model_id}.should =~ ir.public_body.info_requests.map{|x| x.id} end it "should purge the downstream cache when the user name is changed" do ir = info_requests(:fancy_dog_request) ir.user.name = "Something new" ir.user.save! - PurgeRequest.all().map{|x| x.model_id}.should =~ ir.user.info_requests.map{|x| x.id} + PurgeRequest.all.map{|x| x.model_id}.should =~ ir.user.info_requests.map{|x| x.id} end it "should not purge the downstream cache when non-visible user details are changed" do ir = info_requests(:fancy_dog_request) ir.user.hashed_password = "some old hash" ir.user.save! - PurgeRequest.all().count.should == 0 + PurgeRequest.all.count.should == 0 end it "should purge the downstream cache when censor rules have changed" do # TODO: really, CensorRules should execute expiry logic as part @@ -86,17 +86,17 @@ describe RequestController, "when changing things that appear on the request pag ir = info_requests(:fancy_dog_request) ir.prominence = 'hidden' ir.save! - PurgeRequest.all().first.model_id.should == ir.id + PurgeRequest.all.first.model_id.should == ir.id end it "should not create more than one entry for any given resource" do ir = info_requests(:fancy_dog_request) ir.prominence = 'hidden' ir.save! - PurgeRequest.all().count.should == 1 + PurgeRequest.all.count.should == 1 ir = info_requests(:fancy_dog_request) ir.prominence = 'hidden' ir.save! - PurgeRequest.all().count.should == 1 + PurgeRequest.all.count.should == 1 end end @@ -608,10 +608,10 @@ describe RequestController, "when showing one request" do response.body.should match('dull') end - it "should censor attachments downloaded as binary" do + it "should censor attachments downloaded directly" do ir = info_requests(:fancy_dog_request) - censor_rule = CensorRule.new() + censor_rule = CensorRule.new censor_rule.text = "Second" censor_rule.replacement = "Mouse" censor_rule.last_edit_editor = "unknown" @@ -623,7 +623,7 @@ describe RequestController, "when showing one request" do get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => 'hello world.txt', :skip_cache => 1 response.content_type.should == "text/plain" - response.should contain "xxxxxx hello" + response.should contain "Mouse hello" ensure ir.censor_rules.clear end @@ -632,7 +632,7 @@ describe RequestController, "when showing one request" do it "should censor with rules on the user (rather than the request)" do ir = info_requests(:fancy_dog_request) - censor_rule = CensorRule.new() + censor_rule = CensorRule.new censor_rule.text = "Second" censor_rule.replacement = "Mouse" censor_rule.last_edit_editor = "unknown" @@ -645,7 +645,7 @@ describe RequestController, "when showing one request" do get :get_attachment, :incoming_message_id => ir.incoming_messages[1].id, :id => ir.id, :part => 2, :file_name => 'hello world.txt', :skip_cache => 1 response.content_type.should == "text/plain" - response.should contain "xxxxxx hello" + response.should contain "Mouse hello" ensure ir.user.censor_rules.clear end @@ -675,7 +675,7 @@ describe RequestController, "when showing one request" do s.should contain /hello world.txt/m end - censor_rule = CensorRule.new() + censor_rule = CensorRule.new # Note that the censor rule applies to the original filename, # not the display_filename: censor_rule.text = "hello-world.txt" @@ -1471,7 +1471,7 @@ describe RequestController, "when classifying an information request" do it 'should record a classification' do event = mock_model(InfoRequestEvent) - @dog_request.stub!(:log_event).with("status_update", anything()).and_return(event) + @dog_request.stub!(:log_event).with("status_update", anything).and_return(event) RequestClassification.should_receive(:create!).with(:user_id => @admin_user.id, :info_request_event_id => event.id) post_status('rejected') @@ -1915,7 +1915,7 @@ describe RequestController, "sending overdue request alerts" do it "should send an overdue alert mail to creators of overdue requests" do chicken_request = info_requests(:naughty_chicken_request) - chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 30.days + chicken_request.outgoing_messages[0].last_sent_at = Time.now - 30.days chicken_request.outgoing_messages[0].save! RequestMailer.alert_overdue_requests @@ -1941,7 +1941,7 @@ describe RequestController, "sending overdue request alerts" do it "should include clause for schools when sending an overdue alert mail to creators of overdue requests" do chicken_request = info_requests(:naughty_chicken_request) - chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 30.days + chicken_request.outgoing_messages[0].last_sent_at = Time.now - 30.days chicken_request.outgoing_messages[0].save! chicken_request.public_body.tag_string = "school" @@ -1972,7 +1972,7 @@ describe RequestController, "sending overdue request alerts" do it "should send a very overdue alert mail to creators of very overdue requests" do chicken_request = info_requests(:naughty_chicken_request) - chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 60.days + chicken_request.outgoing_messages[0].last_sent_at = Time.now - 60.days chicken_request.outgoing_messages[0].save! RequestMailer.alert_overdue_requests @@ -1998,7 +1998,7 @@ describe RequestController, "sending overdue request alerts" do it "should not resend alerts to people who've already received them" do chicken_request = info_requests(:naughty_chicken_request) - chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 60.days + chicken_request.outgoing_messages[0].last_sent_at = Time.now - 60.days chicken_request.outgoing_messages[0].save! RequestMailer.alert_overdue_requests chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} @@ -2011,7 +2011,7 @@ describe RequestController, "sending overdue request alerts" do it 'should send alerts for requests where the last event forming the initial request is a followup being sent following a request for clarification' do chicken_request = info_requests(:naughty_chicken_request) - chicken_request.outgoing_messages[0].last_sent_at = Time.now() - 60.days + chicken_request.outgoing_messages[0].last_sent_at = Time.now - 60.days chicken_request.outgoing_messages[0].save! RequestMailer.alert_overdue_requests chicken_mails = ActionMailer::Base.deliveries.select{|x| x.body =~ /chickens/} @@ -2048,7 +2048,7 @@ describe RequestController, "sending overdue request alerts" do chicken_mails.size.should == 1 # Make the followup older - outgoing_message.last_sent_at = Time.now() - 60.days + outgoing_message.last_sent_at = Time.now - 60.days outgoing_message.save! # Now it should be alerted on @@ -2764,4 +2764,3 @@ describe RequestController, "#select_authorities" do end end - diff --git a/spec/controllers/request_game_controller_spec.rb b/spec/controllers/request_game_controller_spec.rb index 7247cd388..c3f00d58d 100644 --- a/spec/controllers/request_game_controller_spec.rb +++ b/spec/controllers/request_game_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe RequestGameController, "when playing the game" do diff --git a/spec/controllers/services_controller_spec.rb b/spec/controllers/services_controller_spec.rb index 621dbaaac..6ab527bc9 100644 --- a/spec/controllers/services_controller_spec.rb +++ b/spec/controllers/services_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'fakeweb' @@ -9,7 +9,7 @@ describe ServicesController, "when returning a message for people in other count # store and restore the locale in the context of the test suite to isolate # changes made in these tests before do - @old_locale = FastGettext.locale() + @old_locale = FastGettext.locale end it 'keeps the flash' do @@ -21,7 +21,7 @@ describe ServicesController, "when returning a message for people in other count end it "should show no alaveteli message when in the deployed country" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['ISO_COUNTRY_CODE'] = "DE" controller.stub!(:country_from_ip).and_return('DE') get :other_country_message @@ -29,7 +29,7 @@ describe ServicesController, "when returning a message for people in other count end it "should show an alaveteli message when not in the deployed country and in a country with no FOI website" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['ISO_COUNTRY_CODE'] = "DE" controller.stub!(:country_from_ip).and_return('ZZ') get :other_country_message @@ -37,7 +37,7 @@ describe ServicesController, "when returning a message for people in other count end it "should show link to other FOI website when not in the deployed country" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['ISO_COUNTRY_CODE'] = "ZZ" controller.stub!(:country_from_ip).and_return('ES') request.env['HTTP_ACCEPT_LANGUAGE'] = "es" @@ -60,7 +60,7 @@ describe ServicesController, "when returning a message for people in other count end it "should return the 'another country' message if the service responds OK" do - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['ISO_COUNTRY_CODE'] = "DE" AlaveteliConfiguration.stub!(:gaze_url).and_return('http://denmark.com') FakeWeb.register_uri(:get, %r|denmark.com|, :body => "DK") diff --git a/spec/controllers/track_controller_spec.rb b/spec/controllers/track_controller_spec.rb index 29f5c7fe1..b453fde8c 100644 --- a/spec/controllers/track_controller_spec.rb +++ b/spec/controllers/track_controller_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe TrackController, "when making a new track on a request" do diff --git a/spec/controllers/user_controller_spec.rb b/spec/controllers/user_controller_spec.rb index 443856cf3..fb03615f8 100644 --- a/spec/controllers/user_controller_spec.rb +++ b/spec/controllers/user_controller_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe UserController do @@ -76,11 +76,11 @@ describe UserController, "when redirecting a show request to a canonical url" do end it 'should not redirect a long canonical name that has a numerical suffix' do - User.stub!(:find).with(:first, anything()).and_return(mock_model(User, + User.stub!(:find).with(:first, anything).and_return(mock_model(User, :url_name => 'bob_smithbob_smithbob_smithbob_s_2', :name => 'Bob Smith Bob Smith Bob Smith Bob Smith', :info_requests => [])) - User.stub!(:find).with(:all, anything()).and_return([]) + User.stub!(:find).with(:all, anything).and_return([]) get :show, :url_name => 'bob_smithbob_smithbob_smithbob_s_2' response.should be_success end diff --git a/spec/controllers/widgets_controller_spec.rb b/spec/controllers/widgets_controller_spec.rb new file mode 100644 index 000000000..95396671b --- /dev/null +++ b/spec/controllers/widgets_controller_spec.rb @@ -0,0 +1,181 @@ +# -*- encoding : utf-8 -*- +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe WidgetsController do + + include LinkToHelper + + describe "#show" do + + before do + @info_request = FactoryGirl.create(:info_request) + AlaveteliConfiguration.stub!(:enable_widgets).and_return(true) + end + + it 'should render the widget template' do + get :show, :request_id => @info_request.id + expect(response).to render_template('show') + end + + it 'should find the info request' do + get :show, :request_id => @info_request.id + assigns[:info_request].should == @info_request + end + + it 'should create a track thing for the request' do + get :show, :request_id => @info_request.id + assigns[:track_thing].info_request.should == @info_request + end + + it 'should assign the request status' do + get :show, :request_id => @info_request.id + assigns[:status].should == @info_request.calculate_status + end + + it 'should not send an x-frame-options header' do + get :show, :request_id => @info_request.id + response.headers["X-Frame-Options"].should be_nil + end + + context 'for a non-logged-in user' do + + context 'if no widget-vote cookie is set' do + + it 'should set a widget-vote cookie' do + cookies[:widget_vote].should be_nil + get :show, :request_id => @info_request.id + cookies[:widget_vote].should_not be_nil + end + + end + + end + + context 'when widgets are not enabled' do + + it 'should return a 404' do + AlaveteliConfiguration.stub!(:enable_widgets).and_return(false) + lambda{ get :show, :request_id => @info_request.id }.should + raise_error(ActiveRecord::RecordNotFound) + end + + end + + context "when the request's prominence is not 'normal'" do + + it 'should return a 403' do + @info_request.prominence = 'hidden' + @info_request.save! + get :show, :request_id => @info_request.id + response.code.should == "403" + end + + end + + end + + describe "#new" do + + before do + @info_request = FactoryGirl.create(:info_request) + AlaveteliConfiguration.stub!(:enable_widgets).and_return(true) + end + + it 'should render the create widget template' do + get :new, :request_id => @info_request.id + expect(response).to render_template('new') + end + + it 'should find the info request' do + get :new, :request_id => @info_request.id + assigns[:info_request].should == @info_request + end + + context 'when widgets are not enabled' do + + it 'should return a 404' do + AlaveteliConfiguration.stub!(:enable_widgets).and_return(false) + lambda{ get :new, :request_id => @info_request.id }.should + raise_error(ActiveRecord::RecordNotFound) + end + + end + + context "when the request's prominence is not 'normal'" do + + it 'should return a 403' do + @info_request.prominence = 'hidden' + @info_request.save! + get :show, :request_id => @info_request.id + response.code.should == "403" + end + + end + + end + + describe :update do + + before do + @info_request = FactoryGirl.create(:info_request) + AlaveteliConfiguration.stub!(:enable_widgets).and_return(true) + end + + it 'should find the info request' do + get :update, :request_id => @info_request.id + assigns[:info_request].should == @info_request + end + + it 'should redirect to the track path for the info request' do + get :update, :request_id => @info_request.id + track_thing = TrackThing.create_track_for_request(@info_request) + expect(response).to redirect_to(do_track_path(track_thing)) + end + + context 'when there is no logged-in user and a widget vote cookie' do + + before do + @cookie_value = 'x' * 20 + end + + it 'should create a widget vote if none exists for the info request and cookie' do + @info_request.widget_votes.where(:cookie => @cookie_value).size.should == 0 + request.cookies['widget_vote'] = @cookie_value + get :update, :request_id => @info_request.id + @info_request.widget_votes.where(:cookie => @cookie_value).size.should == 1 + end + + it 'should not create a widget vote if one exists for the info request and cookie' do + @info_request.widget_votes.create(:cookie => @cookie_value) + request.cookies['widget_vote'] = @cookie_value + get :update, :request_id => @info_request.id + @info_request.widget_votes.where(:cookie => @cookie_value).size.should == 1 + end + + end + + context 'when widgets are not enabled' do + + it 'should raise ActiveRecord::RecordNotFound' do + AlaveteliConfiguration.stub!(:enable_widgets).and_return(false) + lambda{ get :update, :request_id => @info_request.id }.should + raise_error(ActiveRecord::RecordNotFound) + end + + end + + context "when the request's prominence is not 'normal'" do + + it 'should return a 403' do + @info_request.prominence = 'hidden' + @info_request.save! + get :show, :request_id => @info_request.id + response.code.should == "403" + end + + end + + end + +end + diff --git a/spec/factories/censor_rules.rb b/spec/factories/censor_rules.rb index 2c0b2c822..5ae60b1f1 100644 --- a/spec/factories/censor_rules.rb +++ b/spec/factories/censor_rules.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :censor_rule do diff --git a/spec/factories/comments.rb b/spec/factories/comments.rb index 1e0861dad..905d7580f 100644 --- a/spec/factories/comments.rb +++ b/spec/factories/comments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :comment do diff --git a/spec/factories/foi_attchments.rb b/spec/factories/foi_attchments.rb index a1d04ccf0..64486dcda 100644 --- a/spec/factories/foi_attchments.rb +++ b/spec/factories/foi_attchments.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :foi_attachment do diff --git a/spec/factories/holidays.rb b/spec/factories/holidays.rb index 531130c8a..28bbe6c52 100644 --- a/spec/factories/holidays.rb +++ b/spec/factories/holidays.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :holiday do diff --git a/spec/factories/incoming_messages.rb b/spec/factories/incoming_messages.rb index b29fe8ce9..127e0f94e 100644 --- a/spec/factories/incoming_messages.rb +++ b/spec/factories/incoming_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :incoming_message do diff --git a/spec/factories/info_request_batches.rb b/spec/factories/info_request_batches.rb index 960db6ec5..c92aa76cc 100644 --- a/spec/factories/info_request_batches.rb +++ b/spec/factories/info_request_batches.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :info_request_batch do diff --git a/spec/factories/info_request_events.rb b/spec/factories/info_request_events.rb index cdd303ad6..d585049e7 100644 --- a/spec/factories/info_request_events.rb +++ b/spec/factories/info_request_events.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :info_request_event do diff --git a/spec/factories/info_requests.rb b/spec/factories/info_requests.rb index 8052625cd..084712243 100644 --- a/spec/factories/info_requests.rb +++ b/spec/factories/info_requests.rb @@ -1,7 +1,8 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :info_request do - title "Example Title" + sequence(:title) { |n| "Example Title #{n}" } public_body user diff --git a/spec/factories/outgoing_messages.rb b/spec/factories/outgoing_messages.rb index e11cbdfb9..6e88085b4 100644 --- a/spec/factories/outgoing_messages.rb +++ b/spec/factories/outgoing_messages.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :outgoing_message do diff --git a/spec/factories/public_bodies.rb b/spec/factories/public_bodies.rb index 44769f7c2..a823d536a 100644 --- a/spec/factories/public_bodies.rb +++ b/spec/factories/public_bodies.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :public_body do diff --git a/spec/factories/public_body_categories.rb b/spec/factories/public_body_categories.rb index baa474c6b..da7dec65c 100644 --- a/spec/factories/public_body_categories.rb +++ b/spec/factories/public_body_categories.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :public_body_category do diff --git a/spec/factories/public_body_category_links.rb b/spec/factories/public_body_category_links.rb index 7663b1f52..7e796a08d 100644 --- a/spec/factories/public_body_category_links.rb +++ b/spec/factories/public_body_category_links.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :public_body_category_link do association :public_body_category diff --git a/spec/factories/public_body_change_requests.rb b/spec/factories/public_body_change_requests.rb index 2bacb9b9b..a074c6feb 100644 --- a/spec/factories/public_body_change_requests.rb +++ b/spec/factories/public_body_change_requests.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :public_body_change_request do diff --git a/spec/factories/public_body_headings.rb b/spec/factories/public_body_headings.rb index ed54ddada..b7f83ffda 100644 --- a/spec/factories/public_body_headings.rb +++ b/spec/factories/public_body_headings.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :public_body_heading do sequence(:name) { |n| "Example Public Body Heading #{n}" } diff --git a/spec/factories/raw_emails.rb b/spec/factories/raw_emails.rb index b271515d2..a6e3c21ac 100644 --- a/spec/factories/raw_emails.rb +++ b/spec/factories/raw_emails.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :raw_email end diff --git a/spec/factories/spam_addresses.rb b/spec/factories/spam_addresses.rb index bafb7cd50..6853c7f2e 100644 --- a/spec/factories/spam_addresses.rb +++ b/spec/factories/spam_addresses.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :spam_address do sequence(:email) { |n| "spam-#{ n }@example.org" } diff --git a/spec/factories/track_things.rb b/spec/factories/track_things.rb index cf76b00b3..f8e4dce69 100644 --- a/spec/factories/track_things.rb +++ b/spec/factories/track_things.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :track_thing do diff --git a/spec/factories/users.rb b/spec/factories/users.rb index ab782fbf7..1f7eba530 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- FactoryGirl.define do factory :user do diff --git a/spec/factories/widget_votes.rb b/spec/factories/widget_votes.rb new file mode 100644 index 000000000..7ceb4f7e9 --- /dev/null +++ b/spec/factories/widget_votes.rb @@ -0,0 +1,8 @@ +# -*- encoding : utf-8 -*- +require 'securerandom' +FactoryGirl.define do + factory :widget_vote do + info_request + cookie { SecureRandom.hex(10) } + end +end diff --git a/spec/fixtures/files/non-utf8-filename.email b/spec/fixtures/files/non-utf8-filename.email new file mode 100644 index 000000000..ed1f1a9f5 --- /dev/null +++ b/spec/fixtures/files/non-utf8-filename.email @@ -0,0 +1,52 @@ +From authority@example.org Tue Dec 3 11:13:02 2013 +Return-path: <authority@example.org> +Envelope-to: requester@example.org +Delivery-date: Tue, 03 Dec 2013 11:13:00 +0000 +From: Test Authority <authority@example.org> +To: requester@example.org +Subject: testing a PDF attachment with the wrong content-type +Date: Tue, 03 Dec 2013 11:12:45 +0000 +Message-ID: <87li09xuasdfasdfpoija@blahblah> +Content-Type: multipart/mixed; + boundary="_006_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_" +MIME-Version: 1.0 +X-GlobalCerts-Milter: WDC-SECUREMAIL02.wokingham.gov.uk 13Feb2014-16:41:39.109 +X-Scanned-By: MailControl 26514.0 (www.mailcontrol.com) on 10.70.0.132 + +--_006_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_ +Content-Type: multipart/alternative; + boundary="_000_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_" + +--_000_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_ +Content-Type: text/plain; charset="iso-8859-1" +Content-Transfer-Encoding: quoted-printable + +Some text + +--_000_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_ +Content-Type: text/html; charset="iso-8859-1" +Content-Transfer-Encoding: quoted-printable + +Some html + +--_000_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_-- + + +--_006_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_ +Content-Type: application/vnd.ms-excel; + name="RV %A312000 or more.xls" +Content-Description: RV %A312000 or more.xls +Content-Disposition: attachment; creation-date="Thu, 13 Feb 2014 16:36:59 GMT"; filename="RV %A312000 or more.xls"; modification-date="Thu, 13 Feb 2014 16:41:36 GMT"; size="332288" +Content-Transfer-Encoding: base64 + +some base 64as;dm mklasd + +--_006_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_ +Content-Type: application/vnd.ms-excel; name="other.xls" +Content-Description: other.xls +Content-Disposition: attachment; creation-date="Thu, 13 Feb 2014 16:37:02 GMT"; filename="other.xls"; modification-date="Thu, 13 Feb 2014 16:41:36 GMT"; size="33280" +Content-Transfer-Encoding: base64 + +some base 64 + +--_006_939C1F941DBEE94A9BEF493DF88519F71F13B5FCWDCEXMAIL02woki_--
\ No newline at end of file diff --git a/spec/helpers/admin_helper_spec.rb b/spec/helpers/admin_helper_spec.rb index 804fcc7fd..1f0155c98 100644 --- a/spec/helpers/admin_helper_spec.rb +++ b/spec/helpers/admin_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AdminHelper do diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 6407eaf3a..2035c343a 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe ApplicationHelper do diff --git a/spec/helpers/date_time_helper_spec.rb b/spec/helpers/date_time_helper_spec.rb index c4fdee1d1..f69a0ef80 100644 --- a/spec/helpers/date_time_helper_spec.rb +++ b/spec/helpers/date_time_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe DateTimeHelper do diff --git a/spec/helpers/health_checks_helper_spec.rb b/spec/helpers/health_checks_helper_spec.rb index 7d4083da5..9418864b5 100644 --- a/spec/helpers/health_checks_helper_spec.rb +++ b/spec/helpers/health_checks_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HealthChecksHelper do @@ -10,6 +11,11 @@ describe HealthChecksHelper do expect(check_status(check)).to include('red') end + it 'sets style to a blank string if ok' do + check = double(:message => '', :ok? => true) + expect(check_status(check)).to include('style=""') + end + end end diff --git a/spec/helpers/highlight_helper_spec.rb b/spec/helpers/highlight_helper_spec.rb index e1be7e153..2641a4400 100644 --- a/spec/helpers/highlight_helper_spec.rb +++ b/spec/helpers/highlight_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HighlightHelper do diff --git a/spec/helpers/link_to_helper_spec.rb b/spec/helpers/link_to_helper_spec.rb index 261e1ef3e..fbb0c2313 100644 --- a/spec/helpers/link_to_helper_spec.rb +++ b/spec/helpers/link_to_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe LinkToHelper do diff --git a/spec/helpers/public_body_helper_spec.rb b/spec/helpers/public_body_helper_spec.rb index d4f3acf78..8db07b979 100644 --- a/spec/helpers/public_body_helper_spec.rb +++ b/spec/helpers/public_body_helper_spec.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBodyHelper do diff --git a/spec/helpers/track_helper_spec.rb b/spec/helpers/track_helper_spec.rb index b6252ab39..bc1266338 100644 --- a/spec/helpers/track_helper_spec.rb +++ b/spec/helpers/track_helper_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe TrackHelper do diff --git a/spec/helpers/widget_helper_spec.rb b/spec/helpers/widget_helper_spec.rb new file mode 100644 index 000000000..614ed92ad --- /dev/null +++ b/spec/helpers/widget_helper_spec.rb @@ -0,0 +1,29 @@ +# -*- encoding : utf-8 -*- +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe WidgetHelper do + + include WidgetHelper + + describe :status_description do + + before do + @info_request = FactoryGirl.build(:info_request) + end + + it 'should return "Awaiting classification" for "waiting_classification' do + expect(status_description(@info_request, 'waiting_classification')).to eq('Awaiting classification') + end + + it 'should call theme_display_status for a theme status' do + @info_request.stub!(:theme_display_status).and_return("Special status") + expect(status_description(@info_request, 'special_status')).to eq('Special status') + end + + it 'should return unknown for an unknown status' do + expect(status_description(@info_request, 'special_status')).to eq('Unknown') + end + + end + +end diff --git a/spec/integration/admin_public_body_category_edit_spec.rb b/spec/integration/admin_public_body_category_edit_spec.rb index 043524189..4e210de82 100644 --- a/spec/integration/admin_public_body_category_edit_spec.rb +++ b/spec/integration/admin_public_body_category_edit_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/admin_public_body_edit_spec.rb b/spec/integration/admin_public_body_edit_spec.rb index aeec3e65a..ed51f414b 100644 --- a/spec/integration/admin_public_body_edit_spec.rb +++ b/spec/integration/admin_public_body_edit_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') @@ -39,7 +40,7 @@ describe 'Editing a Public Body' do end end - it 'can add a translation for multiple locales', :focus => true do + it 'can add a translation for multiple locales' do @admin.visit edit_admin_body_path(@body) @admin.fill_in 'public_body_name__en', :with => 'New Quango EN' @admin.click_button 'Save' diff --git a/spec/integration/admin_public_body_heading_edit_spec.rb b/spec/integration/admin_public_body_heading_edit_spec.rb index 6c7a5a74b..f37d033f3 100644 --- a/spec/integration/admin_public_body_heading_edit_spec.rb +++ b/spec/integration/admin_public_body_heading_edit_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/admin_spec.rb b/spec/integration/admin_spec.rb index bdd6e9d8c..552b465bd 100644 --- a/spec/integration/admin_spec.rb +++ b/spec/integration/admin_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/alaveteli_dsl.rb b/spec/integration/alaveteli_dsl.rb index d7485a094..1ff60664c 100644 --- a/spec/integration/alaveteli_dsl.rb +++ b/spec/integration/alaveteli_dsl.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module AlaveteliDsl def browses_request(url_title) diff --git a/spec/integration/cookie_stripping_spec.rb b/spec/integration/cookie_stripping_spec.rb index 897899fd5..e28e7b8e4 100644 --- a/spec/integration/cookie_stripping_spec.rb +++ b/spec/integration/cookie_stripping_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/create_request_spec.rb b/spec/integration/create_request_spec.rb index 84fad12f9..9b579c448 100644 --- a/spec/integration/create_request_spec.rb +++ b/spec/integration/create_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/download_request_spec.rb b/spec/integration/download_request_spec.rb index 48b42b11d..1050e6792 100644 --- a/spec/integration/download_request_spec.rb +++ b/spec/integration/download_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') @@ -143,7 +144,8 @@ describe 'when making a zipfile available' do it "should update the contents of the zipfile when the request changes" do - info_request = FactoryGirl.create(:info_request_with_incoming) + info_request = FactoryGirl.create(:info_request_with_incoming, + :title => 'Example Title') request_owner = login(info_request.user) inspect_zip_download(request_owner, info_request) do |zip| zip.count.should == 1 # just the message diff --git a/spec/integration/errors_spec.rb b/spec/integration/errors_spec.rb index 39f1279ce..64145cce0 100644 --- a/spec/integration/errors_spec.rb +++ b/spec/integration/errors_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe "When errors occur" do diff --git a/spec/integration/ip_spoofing_spec.rb b/spec/integration/ip_spoofing_spec.rb index 073f71ad6..ce11bcf0b 100644 --- a/spec/integration/ip_spoofing_spec.rb +++ b/spec/integration/ip_spoofing_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe 'when getting a country message' do diff --git a/spec/integration/localisation_spec.rb b/spec/integration/localisation_spec.rb index 037603ad5..f96cd4c3a 100644 --- a/spec/integration/localisation_spec.rb +++ b/spec/integration/localisation_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe "when generating urls" do diff --git a/spec/integration/parameter_stripping_spec.rb b/spec/integration/parameter_stripping_spec.rb new file mode 100644 index 000000000..7e3c0adc2 --- /dev/null +++ b/spec/integration/parameter_stripping_spec.rb @@ -0,0 +1,24 @@ +# -*- encoding : utf-8 -*- +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe "When handling bad requests" do + + if RUBY_VERSION == '1.9.3' + + it 'should return a 404 for GET requests to a malformed request URL' do + get 'request/228%85' + response.status.should == 404 + end + + it 'should redirect a bad UTF-8 POST to a malformed attachment URL' do + info_request = FactoryGirl.create(:info_request_with_incoming_attachments) + incoming_message = info_request.incoming_messages.first + data = { :excerpt => "something\xA3\xA1" } + post "/en/request/#{info_request.id}/response/#{incoming_message.id}/attach/2/interesting.pdf/trackback", data + response.status.should == 303 + response.should redirect_to "/en/request/#{info_request.url_title}#incoming-#{incoming_message.id}" + end + + end + +end diff --git a/spec/integration/request_controller_spec.rb b/spec/integration/request_controller_spec.rb index f5de692b8..1ef6814f9 100644 --- a/spec/integration/request_controller_spec.rb +++ b/spec/integration/request_controller_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/search_request_spec.rb b/spec/integration/search_request_spec.rb index 699eb2c6c..7a09c78fb 100644 --- a/spec/integration/search_request_spec.rb +++ b/spec/integration/search_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/view_request_spec.rb b/spec/integration/view_request_spec.rb index 4d04c97d7..ed84ec2e2 100644 --- a/spec/integration/view_request_spec.rb +++ b/spec/integration/view_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require File.expand_path(File.dirname(__FILE__) + '/alaveteli_dsl') diff --git a/spec/integration/xapian_search_highlighting_spec.rb b/spec/integration/xapian_search_highlighting_spec.rb index c0834a2c1..eea9893a8 100644 --- a/spec/integration/xapian_search_highlighting_spec.rb +++ b/spec/integration/xapian_search_highlighting_spec.rb @@ -1,10 +1,14 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe 'highlighting search results' do include HighlightHelper + before do + get_fixtures_xapian_index + end + it 'ignores stopwords' do phrase = 'department of humpadinking' search = ActsAsXapian::Search.new([PublicBody], phrase, :limit => 1) diff --git a/spec/lib/ability_spec.rb b/spec/lib/ability_spec.rb index f075d0f32..4c5d50990 100644 --- a/spec/lib/ability_spec.rb +++ b/spec/lib/ability_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe Ability do diff --git a/spec/lib/alaveteli_external_command_spec.rb b/spec/lib/alaveteli_external_command_spec.rb index 18afeda33..f76e26152 100644 --- a/spec/lib/alaveteli_external_command_spec.rb +++ b/spec/lib/alaveteli_external_command_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'alaveteli_external_command' diff --git a/spec/lib/alaveteli_text_masker_spec.rb b/spec/lib/alaveteli_text_masker_spec.rb index 1a4782a83..f8c22a849 100644 --- a/spec/lib/alaveteli_text_masker_spec.rb +++ b/spec/lib/alaveteli_text_masker_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AlaveteliTextMasker do @@ -31,10 +31,13 @@ describe AlaveteliTextMasker do data.should == "There was a xxxxx called xxxxxxx, he wished that he was xxxx." end - it 'should handle multibyte characters correctly' do + it 'should handle multibyte characters in binary file types as binary data' do data = 'á mouse' + if String.method_defined?(:encode) + data = data.force_encoding("ASCII-8BIT") + end @regex_censor_rule.text = 'á' - apply_masks!(data, "application/octet-stream", :censor_rules => @censor_rules).should == 'x mouse' + apply_masks!(data, "application/octet-stream", :censor_rules => @censor_rules).should == 'xx mouse' end it "should apply censor rules to HTML files" do @@ -60,7 +63,7 @@ describe AlaveteliTextMasker do end def pdf_replacement_test(use_ghostscript_compression) - config = MySociety::Config.load_default() + config = MySociety::Config.load_default previous = config['USE_GHOSTSCRIPT_COMPRESSION'] config['USE_GHOSTSCRIPT_COMPRESSION'] = use_ghostscript_compression orig_pdf = load_file_fixture('tfl.pdf') @@ -92,6 +95,23 @@ describe AlaveteliTextMasker do pdf.should_not == "" end + it 'should keep the uncensored original if uncompression of a PDF fails' do + orig_pdf = load_file_fixture('tfl.pdf') + pdf = orig_pdf.dup + stub!(:uncompress_pdf).and_return nil + apply_masks!(pdf, "application/pdf") + pdf.should == orig_pdf + end + + it 'should use the uncompressed PDF text if re-compression of a compressed PDF fails' do + orig_pdf = load_file_fixture('tfl.pdf') + pdf = orig_pdf.dup + stub!(:uncompress_pdf).and_return "something about foi@tfl.gov.uk" + stub!(:compress_pdf).and_return nil + apply_masks!(pdf, "application/pdf") + pdf.should match "something about xxx@xxx.xxx.xx" + end + it "should apply hard-coded privacy rules to HTML files" do data = "http://test.host/c/cheese" apply_masks!(data, 'text/html') diff --git a/spec/lib/attachment_to_html/adapters/could_not_convert_spec.rb b/spec/lib/attachment_to_html/adapters/could_not_convert_spec.rb index afdc5c552..040f02bae 100644 --- a/spec/lib/attachment_to_html/adapters/could_not_convert_spec.rb +++ b/spec/lib/attachment_to_html/adapters/could_not_convert_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::CouldNotConvert do diff --git a/spec/lib/attachment_to_html/adapters/google_docs_viewer_spec.rb b/spec/lib/attachment_to_html/adapters/google_docs_viewer_spec.rb index e7aafb40d..b1a97ea9b 100644 --- a/spec/lib/attachment_to_html/adapters/google_docs_viewer_spec.rb +++ b/spec/lib/attachment_to_html/adapters/google_docs_viewer_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::GoogleDocsViewer do diff --git a/spec/lib/attachment_to_html/adapters/pdf_spec.rb b/spec/lib/attachment_to_html/adapters/pdf_spec.rb index ceb438be8..f4b60fb93 100644 --- a/spec/lib/attachment_to_html/adapters/pdf_spec.rb +++ b/spec/lib/attachment_to_html/adapters/pdf_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::PDF do diff --git a/spec/lib/attachment_to_html/adapters/rtf_spec.rb b/spec/lib/attachment_to_html/adapters/rtf_spec.rb index 2c53b5272..59aef69d1 100644 --- a/spec/lib/attachment_to_html/adapters/rtf_spec.rb +++ b/spec/lib/attachment_to_html/adapters/rtf_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::RTF do diff --git a/spec/lib/attachment_to_html/adapters/text_spec.rb b/spec/lib/attachment_to_html/adapters/text_spec.rb index b2e8141e0..0eddacb05 100644 --- a/spec/lib/attachment_to_html/adapters/text_spec.rb +++ b/spec/lib/attachment_to_html/adapters/text_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::Text do diff --git a/spec/lib/attachment_to_html/attachment_to_html_spec.rb b/spec/lib/attachment_to_html/attachment_to_html_spec.rb index 1cf7debb7..59c13f501 100644 --- a/spec/lib/attachment_to_html/attachment_to_html_spec.rb +++ b/spec/lib/attachment_to_html/attachment_to_html_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe AttachmentToHTML do diff --git a/spec/lib/attachment_to_html/view_spec.rb b/spec/lib/attachment_to_html/view_spec.rb index 50179b0f7..ffe2c0d2d 100644 --- a/spec/lib/attachment_to_html/view_spec.rb +++ b/spec/lib/attachment_to_html/view_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe AttachmentToHTML::View do diff --git a/spec/lib/basic_encoding_spec.rb b/spec/lib/basic_encoding_spec.rb index 43a65eab9..6758d60a3 100644 --- a/spec/lib/basic_encoding_spec.rb +++ b/spec/lib/basic_encoding_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') def bytes_to_binary_string( bytes, claimed_encoding = nil ) @@ -103,7 +103,7 @@ end describe "convert_string_to_utf8_or_binary" do - describe "when passed uniterpretable character data" do + describe "when passed uninterpretable character data" do it "should return it as a binary string" do @@ -155,3 +155,64 @@ describe "convert_string_to_utf8_or_binary" do end end + +describe "convert_string_to_utf8" do + + describe "when passed uninterpretable character data" do + + it "should return it as a valid utf8 string with non-utf8 characters removed + and mark it as scrubbed" do + + converted = convert_string_to_utf8 random_string + + if String.method_defined?(:encode) + converted.string.encoding.to_s.should == 'UTF-8' + converted.string.valid_encoding?.should == true + end + converted.scrubbed?.should == true + + converted = convert_string_to_utf8 random_string,'UTF-8' + + if String.method_defined?(:encode) + converted.string.encoding.to_s.should == 'UTF-8' + converted.string.valid_encoding?.should == true + end + converted.scrubbed?.should == true + + end + end + + describe "when passed unlabelled Windows 1252 data" do + + it "should correctly convert it to UTF-8" do + + converted = convert_string_to_utf8 windows_1252_string + + converted.string.should == "DASH – DASH" + + if String.method_defined?(:encode) + converted.string.encoding.to_s.should == 'UTF-8' + end + converted.scrubbed?.should == false + + end + + end + + describe "when passed GB 18030 data" do + + it "should correctly convert it to UTF-8 if unlabelled" do + + converted = convert_string_to_utf8 gb_18030_spam_string + + converted.string.should start_with("贵公司负责人") + + if String.method_defined?(:encode) + converted.string.encoding.to_s.should == 'UTF-8' + end + converted.scrubbed?.should == false + end + + end + +end
\ No newline at end of file diff --git a/spec/lib/confidence_intervals_spec.rb b/spec/lib/confidence_intervals_spec.rb index cb8717f3d..58f1f3d79 100644 --- a/spec/lib/confidence_intervals_spec.rb +++ b/spec/lib/confidence_intervals_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'confidence_intervals' describe "ci_bounds" do diff --git a/spec/lib/date_quarter_spec.rb b/spec/lib/date_quarter_spec.rb index 5af6fa334..02d2c2551 100644 --- a/spec/lib/date_quarter_spec.rb +++ b/spec/lib/date_quarter_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe DateQuarter do diff --git a/spec/lib/health_checks/checks/days_ago_check_spec.rb b/spec/lib/health_checks/checks/days_ago_check_spec.rb index 33b4642cd..4fbc1913b 100644 --- a/spec/lib/health_checks/checks/days_ago_check_spec.rb +++ b/spec/lib/health_checks/checks/days_ago_check_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe HealthChecks::Checks::DaysAgoCheck do @@ -15,16 +16,16 @@ describe HealthChecks::Checks::DaysAgoCheck do expect(check.days).to eq(4) end - describe :check do + describe :ok? do it 'is successful if the subject is in the last day' do check = HealthChecks::Checks::DaysAgoCheck.new { Time.now } - expect(check.check).to be_true + expect(check.ok?).to be_true end it 'fails if the subject is over a day ago' do check = HealthChecks::Checks::DaysAgoCheck.new { 2.days.ago } - expect(check.check).to be_false + expect(check.ok?).to be_false end end diff --git a/spec/lib/health_checks/health_checkable_spec.rb b/spec/lib/health_checks/health_checkable_spec.rb index abfeb5c21..59d76c337 100644 --- a/spec/lib/health_checks/health_checkable_spec.rb +++ b/spec/lib/health_checks/health_checkable_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe HealthChecks::HealthCheckable do @@ -31,24 +32,10 @@ describe HealthChecks::HealthCheckable do end - describe :check do - - it 'is intended to be overridden by the includer' do - expect{ @subject.check }.to raise_error(NotImplementedError) - end - - end - describe :ok? do - it 'returns true if the check was successful' do - @subject.stub(:check => true) - expect(@subject.ok?).to be_true - end - - it 'returns false if the check failed' do - @subject.stub(:check => false) - expect(@subject.ok?).to be_false + it 'is intended to be overridden by the includer' do + expect{ @subject.ok? }.to raise_error(NotImplementedError) end end @@ -92,7 +79,7 @@ describe HealthChecks::HealthCheckable do context 'if the check succeeds' do before(:each) do - @subject.stub(:check => true) + @subject.stub(:ok? => true) end it 'returns the default success message' do @@ -109,7 +96,7 @@ describe HealthChecks::HealthCheckable do context 'if the check fails' do before(:each) do - @subject.stub(:check => false) + @subject.stub(:ok? => false) end it 'returns the default failure message' do diff --git a/spec/lib/health_checks/health_checks_spec.rb b/spec/lib/health_checks/health_checks_spec.rb index c7037b813..0b97725db 100644 --- a/spec/lib/health_checks/health_checks_spec.rb +++ b/spec/lib/health_checks/health_checks_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe HealthChecks do @@ -6,7 +7,7 @@ describe HealthChecks do describe :add do it 'adds a check to the collection and returns the check' do - check = double('MockCheck', :check => true) + check = double('MockCheck', :ok? => true) expect(add(check)).to eq(check) end @@ -20,8 +21,8 @@ describe HealthChecks do describe :all do it 'returns all the checks' do - check1 = double('MockCheck', :check => true) - check2 = double('AnotherCheck', :check => false) + check1 = double('MockCheck', :ok? => true) + check2 = double('AnotherCheck', :ok? => false) add(check1) add(check2) expect(all).to include(check1, check2) diff --git a/spec/lib/i18n_interpolation_spec.rb b/spec/lib/i18n_interpolation_spec.rb index 47037ecdb..8c5b8d1b5 100644 --- a/spec/lib/i18n_interpolation_spec.rb +++ b/spec/lib/i18n_interpolation_spec.rb @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe "when using i18n" do @@ -58,7 +58,7 @@ describe "gettext_interpolate" do result = gettext_interpolate(string, :a => "foo".html_safe) result.should == "Hello foo" result.should_not be_html_safe - end + end end context "html safe string" do @@ -74,6 +74,6 @@ describe "gettext_interpolate" do result = gettext_interpolate(string, :a => "foo&".html_safe) result.should == "Hello foo&" result.should be_html_safe - end + end end end diff --git a/spec/lib/languages_spec.rb b/spec/lib/languages_spec.rb new file mode 100644 index 000000000..38f611087 --- /dev/null +++ b/spec/lib/languages_spec.rb @@ -0,0 +1,22 @@ +# -*- encoding : utf-8 -*- +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe LanguageNames do + + describe :get_language_name do + + it 'should return the name assigned to the language' do + LanguageNames.get_language_name('en').should == 'English' + end + + it 'should return the name assigned to the language when there is no specific location' do + LanguageNames.get_language_name('pt_BR').should == 'Português' + end + + it 'should return the name assigned to the language/location combination' do + LanguageNames.get_language_name('zh_HK').should == '中文(香港)' + end + + end + +end diff --git a/spec/lib/mail_handler/backends/mail_backend_spec.rb b/spec/lib/mail_handler/backends/mail_backend_spec.rb index eb1d4b167..91d9e1b5a 100644 --- a/spec/lib/mail_handler/backends/mail_backend_spec.rb +++ b/spec/lib/mail_handler/backends/mail_backend_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '../../../../spec_helper') describe MailHandler::Backends::MailBackend do @@ -37,6 +37,15 @@ describe MailHandler::Backends::MailBackend do get_part_file_name(part).should be_nil end + it 'turns an invalid UTF-8 name into a valid one' do + mail = get_fixture_mail('non-utf8-filename.email') + part = mail.attachments.first + filename = get_part_file_name(part) + if filename.respond_to?(:valid_encoding) + filename.valid_encoding?.should == true + end + end + end describe :get_part_body do diff --git a/spec/lib/mail_handler/mail_handler_spec.rb b/spec/lib/mail_handler/mail_handler_spec.rb index be6da5c4f..27a7a3db4 100644 --- a/spec/lib/mail_handler/mail_handler_spec.rb +++ b/spec/lib/mail_handler/mail_handler_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper') def create_message_from(from_field) @@ -9,7 +9,7 @@ end describe 'when creating a mail object from raw data' do - it "should be able to parse a large email without raising an exception", :focus => true do + it "should be able to parse a large email without raising an exception" do m = Mail.new m.add_file(:filename => "attachment.data", :content => "a" * (8 * 1024 * 1024)) raw_email = "From jamis_buck@byu.edu Mon May 2 16:07:05 2005\r\n#{m.to_s}" @@ -22,7 +22,7 @@ describe 'when creating a mail object from raw data' do mail.multipart?.should == true end - it "should not fail on invalid byte sequence in content-disposition header", :focus => true do + it "should not fail on invalid byte sequence in content-disposition header" do part = Mail::Part.new("Content-Disposition: inline; filename=a\xB8z\r\n\r\nThis is the body text.") lambda { part.inline? }.should_not raise_error end diff --git a/spec/lib/public_body_csv_spec.rb b/spec/lib/public_body_csv_spec.rb index e3cc4be6e..5c57c9533 100644 --- a/spec/lib/public_body_csv_spec.rb +++ b/spec/lib/public_body_csv_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBodyCSV do diff --git a/spec/lib/theme_spec.rb b/spec/lib/theme_spec.rb index 829c1a269..b7259078f 100644 --- a/spec/lib/theme_spec.rb +++ b/spec/lib/theme_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe "theme_url_to_theme_name" do diff --git a/spec/lib/timezone_fixes_spec.rb b/spec/lib/timezone_fixes_spec.rb index 8a9a3bf31..c44479fd7 100644 --- a/spec/lib/timezone_fixes_spec.rb +++ b/spec/lib/timezone_fixes_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # This is a test of the monkey patches in timezone_fixes.rb # We use MailServerLogDone here just as a totally random model that has a datetime type. diff --git a/spec/lib/whatdotheyknow/strip_empty_sessions_spec.rb b/spec/lib/whatdotheyknow/strip_empty_sessions_spec.rb index fcd729b48..d4f668671 100644 --- a/spec/lib/whatdotheyknow/strip_empty_sessions_spec.rb +++ b/spec/lib/whatdotheyknow/strip_empty_sessions_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe WhatDoTheyKnow::StripEmptySessions do diff --git a/spec/mailers/application_mailer_spec.rb b/spec/mailers/application_mailer_spec.rb index 718ac47fb..1854e4741 100644 --- a/spec/mailers/application_mailer_spec.rb +++ b/spec/mailers/application_mailer_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') @@ -13,7 +14,7 @@ describe ApplicationMailer do end def add_mail_methods(method_names) - method_names.each{ |method_name| ApplicationMailer.send(:define_method, method_name){ mail() } } + method_names.each{ |method_name| ApplicationMailer.send(:define_method, method_name){ mail } } end def remove_mail_methods(method_names) diff --git a/spec/mailers/contact_mailer_spec.rb b/spec/mailers/contact_mailer_spec.rb new file mode 100644 index 000000000..a0431afd2 --- /dev/null +++ b/spec/mailers/contact_mailer_spec.rb @@ -0,0 +1,18 @@ +# -*- encoding : utf-8 -*- +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe ContactMailer do + + describe :to_admin_message do + + it 'correctly quotes the name in a "from" address' do + ContactMailer.to_admin_message("A,B,C.", + "test@example.com", + "test", + "test", nil, nil, nil)['from'].to_s.should == '"A,B,C." <test@example.com>' + + + end + + end +end diff --git a/spec/mailers/info_request_batch_mailer_spec.rb b/spec/mailers/info_request_batch_mailer_spec.rb index 19791e163..146735e73 100644 --- a/spec/mailers/info_request_batch_mailer_spec.rb +++ b/spec/mailers/info_request_batch_mailer_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe InfoRequestBatchMailer do diff --git a/spec/mailers/outgoing_mailer_spec.rb b/spec/mailers/outgoing_mailer_spec.rb index 3df5018fe..d2bdc49dd 100644 --- a/spec/mailers/outgoing_mailer_spec.rb +++ b/spec/mailers/outgoing_mailer_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe OutgoingMailer, " when working out follow up names and addresses" do diff --git a/spec/mailers/request_mailer_spec.rb b/spec/mailers/request_mailer_spec.rb index 6a45d0e94..12d83ca62 100644 --- a/spec/mailers/request_mailer_spec.rb +++ b/spec/mailers/request_mailer_spec.rb @@ -1,6 +1,8 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +# TODO: Combine all these separate "describe" blocks to tidy things up + describe RequestMailer, " when receiving incoming mail" do before(:each) do load_raw_emails_data @@ -299,7 +301,7 @@ describe RequestMailer, "when sending reminders to requesters to classify a resp ORDER BY created_at desc LIMIT 1) < ? AND url_title != 'holding_pen' AND user_id IS NOT NULL".split(' ').join(' '), - true, Time.now() - 7.days ] + true, Time.now - 7.days ] # compare the query string ignoring any spacing differences InfoRequest.should_receive(:find) do |all, query_params| @@ -432,6 +434,10 @@ describe RequestMailer, 'when sending a new response email' do @mail = RequestMailer.new_response(@info_request, @incoming_message) end + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.new_response(FactoryGirl.create(:info_request, :title => "Here's a request"), FactoryGirl.create(:incoming_message)) + expect(mail.subject).to eq "New response to your FOI request - Here's a request" + end end describe RequestMailer, 'requires_admin' do @@ -440,7 +446,7 @@ describe RequestMailer, 'requires_admin' do :name => 'Bruce Jones') @info_request = mock_model(InfoRequest, :user => user, :described_state => 'error_message', - :title => 'Test request', + :title => "It's a Test request", :url_title => 'test_request', :law_used_short => 'FOI', :id => 123) @@ -456,4 +462,42 @@ describe RequestMailer, 'requires_admin' do mail.body.should include 'Something has gone wrong' end + it 'should not create HTML entities in the subject line' do + expect(RequestMailer.requires_admin(@info_request).subject).to eq "FOI response requires admin (error_message) - It's a Test request" + end +end + +describe RequestMailer, "overdue_alert" do + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.overdue_alert(FactoryGirl.create(:info_request, :title => "Here's a request"), FactoryGirl.create(:user)) + expect(mail.subject).to eq "Delayed response to your FOI request - Here's a request" + end +end + +describe RequestMailer, "very_overdue_alert" do + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.very_overdue_alert(FactoryGirl.create(:info_request, :title => "Here's a request"), FactoryGirl.create(:user)) + expect(mail.subject).to eq "You're long overdue a response to your FOI request - Here's a request" + end +end + +describe RequestMailer, "not_clarified_alert" do + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.not_clarified_alert(FactoryGirl.create(:info_request, :title => "Here's a request"), FactoryGirl.create(:incoming_message)) + expect(mail.subject).to eq "Clarify your FOI request - Here's a request" + end +end + +describe RequestMailer, "comment_on_alert" do + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.comment_on_alert(FactoryGirl.create(:info_request, :title => "Here's a request"), FactoryGirl.create(:comment)) + expect(mail.subject).to eq "Somebody added a note to your FOI request - Here's a request" + end +end + +describe RequestMailer, "comment_on_alert_plural" do + it 'should not create HTML entities in the subject line' do + mail = RequestMailer.comment_on_alert_plural(FactoryGirl.create(:info_request, :title => "Here's a request"), 2, FactoryGirl.create(:comment)) + expect(mail.subject).to eq "Some notes have been added to your FOI request - Here's a request" + end end diff --git a/spec/mailers/track_mailer_spec.rb b/spec/mailers/track_mailer_spec.rb index e8094b692..56e0c18f6 100644 --- a/spec/mailers/track_mailer_spec.rb +++ b/spec/mailers/track_mailer_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe TrackMailer do diff --git a/spec/models/about_me_validator_spec.rb b/spec/models/about_me_validator_spec.rb index 5610cead8..c8078f44a 100644 --- a/spec/models/about_me_validator_spec.rb +++ b/spec/models/about_me_validator_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe AboutMeValidator do diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 4ecd2d3e1..d308ac1b9 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: censor_rules @@ -17,6 +18,42 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +describe CensorRule do + + describe :apply_to_text do + + it 'applies the rule to the text' do + rule = FactoryGirl.build(:censor_rule, :text => 'secret') + text = 'Some secret text' + expect(rule.apply_to_text(text)).to eq('Some [REDACTED] text') + end + + it 'does not mutate the input' do + rule = FactoryGirl.build(:censor_rule, :text => 'secret') + text = 'Some secret text' + rule.apply_to_text(text) + expect(text).to eq('Some secret text') + end + + it 'returns the text if the rule is unmatched' do + rule = FactoryGirl.build(:censor_rule, :text => 'secret') + text = 'Some text' + expect(rule.apply_to_text(text)).to eq('Some text') + end + end + + describe :apply_to_text! do + + it 'mutates the input' do + rule = FactoryGirl.build(:censor_rule, :text => 'secret') + text = 'Some secret text' + rule.apply_to_text!(text) + expect(text).to eq('Some [REDACTED] text') + end + + end +end + describe CensorRule, "substituting things" do describe 'when using a text rule' do @@ -27,19 +64,35 @@ describe CensorRule, "substituting things" do @censor_rule.replacement = "hello" end - it 'should do basic text substitution' do - body = "I don't know why you say goodbye" - @censor_rule.apply_to_text!(body) - body.should == "I don't know why you say hello" + describe :apply_to_text do + + it 'should do basic text substitution' do + body = "I don't know why you say goodbye" + @censor_rule.apply_to_text!(body) + body.should == "I don't know why you say hello" + end + end - it 'should keep size same for binary substitution' do - body = "I don't know why you say goodbye" - orig_body = body.dup - @censor_rule.apply_to_binary!(body) - body.size.should == orig_body.size - body.should == "I don't know why you say xxxxxxx" - body.should_not == orig_body # be sure duplicated as expected + describe :apply_to_binary do + + it 'should keep size same for binary substitution' do + body = "I don't know why you say goodbye" + orig_body = body.dup + @censor_rule.apply_to_binary!(body) + body.size.should == orig_body.size + body.should == "I don't know why you say xxxxxxx" + body.should_not == orig_body # be sure duplicated as expected + end + + it 'should handle a UTF-8 rule and ASCII-8BIT text' do + body = "I don't know why you say g‘oodbye" + body.force_encoding("ASCII-8BIT") if String.method_defined?(:encode) + @censor_rule.text = 'g‘oodbye' + @censor_rule.apply_to_binary!(body) + body.should == "I don't know why you say xxxxxxxxxx" + end + end end @@ -84,6 +137,26 @@ xxxxxxxxx BODY end + it "handles a UTF-8 rule with ASCII-8BIT text" do + @censor_rule.text = "--PRIVATE.*--P‘RIVATE" + @body = +<<BODY +Some public information +--PRIVATE +Some private information +--P‘RIVATE +BODY + @body.force_encoding('ASCII-8BIT') if String.method_defined?(:encode) + @censor_rule.apply_to_binary!(@body) + @body.should == +<<BODY +Some public information +xxxxxxxxx +xxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxx +BODY + end + end end diff --git a/spec/models/change_email_validator_spec.rb b/spec/models/change_email_validator_spec.rb index b667a23d1..efa8ca819 100644 --- a/spec/models/change_email_validator_spec.rb +++ b/spec/models/change_email_validator_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') def validator_with_user_and_params(user, params = {}) diff --git a/spec/models/contact_validator_spec.rb b/spec/models/contact_validator_spec.rb index 0f5403967..9d7c192a3 100644 --- a/spec/models/contact_validator_spec.rb +++ b/spec/models/contact_validator_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe ContactValidator do diff --git a/spec/models/customstates.rb b/spec/models/customstates.rb index 942e1fcde..453453f20 100644 --- a/spec/models/customstates.rb +++ b/spec/models/customstates.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module InfoRequestCustomStates def self.included(base) diff --git a/spec/models/foi_attachment_spec.rb b/spec/models/foi_attachment_spec.rb index 882723d1e..b383e5d09 100644 --- a/spec/models/foi_attachment_spec.rb +++ b/spec/models/foi_attachment_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: foi_attachments @@ -17,45 +18,133 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe FoiAttachment do - before(:each) do - load_raw_emails_data + describe :body= do + + it "sets the body" do + attachment = FoiAttachment.new + attachment.body = "baz" + attachment.body.should == "baz" + end + + it "sets the size" do + attachment = FoiAttachment.new + attachment.body = "baz" + attachment.body.should == "baz" + attachment.display_size.should == "0K" + end + + it "reparses the body if it disappears" do + load_raw_emails_data + im = incoming_messages(:useless_incoming_message) + im.extract_attachments! + main = im.get_main_body_text_part + orig_body = main.body + main.delete_cached_file! + lambda { + im.get_main_body_text_part.body + }.should_not raise_error(Errno::ENOENT) + main.delete_cached_file! + main = im.get_main_body_text_part + main.body.should == orig_body + end + end - it "sets the body" do - attachment = FoiAttachment.new - attachment.body = "baz" - attachment.body.should == "baz" + describe :body do + + it 'returns a binary encoded string when newly created' do + foi_attachment = FactoryGirl.create(:body_text) + if String.method_defined?(:encode) + expect(foi_attachment.body.encoding.to_s).to eq('ASCII-8BIT') + end + end + + + it 'returns a binary encoded string when saved' do + foi_attachment = FactoryGirl.create(:body_text) + foi_attachment = FoiAttachment.find(foi_attachment) + if String.method_defined?(:encode) + expect(foi_attachment.body.encoding.to_s).to eq('ASCII-8BIT') + end + end + + end + + describe :body_as_text do + + it 'has a valid UTF-8 string when newly created' do + foi_attachment = FactoryGirl.create(:body_text) + if String.method_defined?(:encode) + expect(foi_attachment.body_as_text.string.encoding.to_s).to eq('UTF-8') + expect(foi_attachment.body_as_text.string.valid_encoding?).to be_true + end + end + + it 'has a valid UTF-8 string when saved' do + foi_attachment = FactoryGirl.create(:body_text) + foi_attachment = FoiAttachment.find(foi_attachment) + if String.method_defined?(:encode) + expect(foi_attachment.body_as_text.string.encoding.to_s).to eq('UTF-8') + expect(foi_attachment.body_as_text.string.valid_encoding?).to be_true + end + end + + + it 'has a true scrubbed? value if the body has been coerced to valid UTF-8' do + foi_attachment = FactoryGirl.create(:body_text) + foi_attachment.body = "\x0FX\x1C\x8F\xA4\xCF\xF6\x8C\x9D\xA7\x06\xD9\xF7\x90lo" + expect(foi_attachment.body_as_text.scrubbed?).to be_true + end + + it 'has a false scrubbed? value if the body has not been coerced to valid UTF-8' do + foi_attachment = FactoryGirl.create(:body_text) + foi_attachment.body = "κόσμε" + expect(foi_attachment.body_as_text.scrubbed?).to be_false + end + end - it "sets the size" do - attachment = FoiAttachment.new - attachment.body = "baz" - attachment.body.should == "baz" - attachment.update_display_size! - attachment.display_size.should == "0K" + + describe :default_body do + + it 'returns valid UTF-8 for a text attachment' do + foi_attachment = FactoryGirl.create(:body_text) + if String.method_defined?(:encode) + expect(foi_attachment.default_body.encoding.to_s).to eq('UTF-8') + expect(foi_attachment.default_body.valid_encoding?).to be_true + end + end + + it 'returns binary for a PDF attachment' do + foi_attachment = FactoryGirl.create(:pdf_attachment) + if String.method_defined?(:encode) + expect(foi_attachment.default_body.encoding.to_s).to eq('ASCII-8BIT') + end + end + end - it "reparses the body if it disappears" do - im = incoming_messages(:useless_incoming_message) - im.extract_attachments! - main = im.get_main_body_text_part - orig_body = main.body - main.delete_cached_file! - lambda { - im.get_main_body_text_part.body - }.should_not raise_error(Errno::ENOENT) - main.delete_cached_file! - main = im.get_main_body_text_part - main.body.should == orig_body + + + describe :ensure_filename! do + + it 'should create a filename for an instance with a blank filename' do + attachment = FoiAttachment.new + attachment.filename = '' + attachment.ensure_filename! + attachment.filename.should == 'attachment.bin' + end end -end -describe FoiAttachment, "when ensuring a filename is present" do + describe :has_body_as_html? do + + it 'should be true for a pdf attachment' do + FactoryGirl.build(:pdf_attachment).has_body_as_html?.should be_true + end + + it 'should be false for an html attachment' do + FactoryGirl.build(:html_attachment).has_body_as_html?.should be_false + end - it 'should create a filename for an instance with a blank filename' do - attachment = FoiAttachment.new - attachment.filename = '' - attachment.ensure_filename! - attachment.filename.should == 'attachment.bin' end end diff --git a/spec/models/has_tag_string_tag_spec.rb b/spec/models/has_tag_string_tag_spec.rb index 759b3396f..bbcb00ca2 100644 --- a/spec/models/has_tag_string_tag_spec.rb +++ b/spec/models/has_tag_string_tag_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HasTagString::HasTagStringTag, " when fiddling with tag strings" do diff --git a/spec/models/holiday_import_spec.rb b/spec/models/holiday_import_spec.rb index 7ec5c04d5..eb0b33e0e 100644 --- a/spec/models/holiday_import_spec.rb +++ b/spec/models/holiday_import_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe HolidayImport do diff --git a/spec/models/holiday_spec.rb b/spec/models/holiday_spec.rb index 2f8eeabd9..bd73e672b 100644 --- a/spec/models/holiday_spec.rb +++ b/spec/models/holiday_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: holidays diff --git a/spec/models/incoming_message_spec.rb b/spec/models/incoming_message_spec.rb index 0fdc7b663..8fb57e36c 100644 --- a/spec/models/incoming_message_spec.rb +++ b/spec/models/incoming_message_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: incoming_messages @@ -263,7 +263,7 @@ describe IncomingMessage, " when dealing with incoming mail" do incoming_message = InfoRequest.holding_pen_request.incoming_messages[0] # This will raise an error if the bug in TMail hasn't been fixed - incoming_message.get_body_for_html_display() + incoming_message.get_body_for_html_display end @@ -282,7 +282,7 @@ end describe IncomingMessage, " display attachments" do it "should not show slashes in filenames" do - foi_attachment = FoiAttachment.new() + foi_attachment = FoiAttachment.new # http://www.whatdotheyknow.com/request/post_commercial_manager_librarie#incoming-17233 foi_attachment.filename = "FOI/09/066 RESPONSE TO FOI REQUEST RECEIVED 21st JANUARY 2009.txt" expected_display_filename = foi_attachment.filename.gsub(/\//, " ") @@ -290,7 +290,7 @@ describe IncomingMessage, " display attachments" do end it "should not show slashes in subject generated filenames" do - foi_attachment = FoiAttachment.new() + foi_attachment = FoiAttachment.new # http://www.whatdotheyknow.com/request/post_commercial_manager_librarie#incoming-17233 foi_attachment.within_rfc822_subject = "FOI/09/066 RESPONSE TO FOI REQUEST RECEIVED 21st JANUARY 2009" foi_attachment.content_type = 'text/plain' @@ -312,20 +312,20 @@ describe IncomingMessage, " folding quoted parts of emails" do it 'should fold a plain text lotus notes quoted part correctly' do text = "FOI Team\n\n\nInfo Requester <xxx@whatdotheyknow.com>=20\nSent by: Info Requester <request-bounce-xxxxx@whatdotheyknow.com>\n06/03/08 10:00\nPlease respond to\nInfo Requester <request-xxxx@whatdotheyknow.com>" - @incoming_message = IncomingMessage.new() + @incoming_message = IncomingMessage.new @incoming_message.stub_chain(:info_request, :user_name).and_return("Info Requester") @incoming_message.remove_lotus_quoting(text).should match(/FOLDED_QUOTED_SECTION/) end it 'should not error when trying to fold lotus notes quoted parts on a request with no user_name' do text = "hello" - @incoming_message = IncomingMessage.new() + @incoming_message = IncomingMessage.new @incoming_message.stub_chain(:info_request, :user_name).and_return(nil) @incoming_message.remove_lotus_quoting(text).should == 'hello' end it "cope with [ in user names properly" do - @incoming_message = IncomingMessage.new() + @incoming_message = IncomingMessage.new @incoming_message.stub_chain(:info_request, :user_name).and_return("Sir [ Bobble") # this gives a warning if [ is in the name text = @incoming_message.remove_lotus_quoting("Sir [ Bobble \nSent by: \n") @@ -357,7 +357,7 @@ describe IncomingMessage, " checking validity to reply to" do MailHandler.stub!(:get_from_address).and_return(email) MailHandler.stub!(:empty_return_path?).with(@mail).and_return(empty_return_path) MailHandler.stub!(:get_auto_submitted).with(@mail).and_return(autosubmitted) - @incoming_message = IncomingMessage.new() + @incoming_message = IncomingMessage.new @incoming_message.stub!(:mail).and_return(@mail) @incoming_message._calculate_valid_to_reply_to.should == result end @@ -431,21 +431,21 @@ describe IncomingMessage, " when censoring data" do @im = incoming_messages(:useless_incoming_message) - @censor_rule_1 = CensorRule.new() + @censor_rule_1 = CensorRule.new @censor_rule_1.text = "Stilton" @censor_rule_1.replacement = "Jarlsberg" @censor_rule_1.last_edit_editor = "unknown" @censor_rule_1.last_edit_comment = "none" @im.info_request.censor_rules << @censor_rule_1 - @censor_rule_2 = CensorRule.new() + @censor_rule_2 = CensorRule.new @censor_rule_2.text = "blue" @censor_rule_2.replacement = "yellow" @censor_rule_2.last_edit_editor = "unknown" @censor_rule_2.last_edit_comment = "none" @im.info_request.censor_rules << @censor_rule_2 - @regex_censor_rule = CensorRule.new() + @regex_censor_rule = CensorRule.new @regex_censor_rule.text = 'm[a-z][a-z][a-z]e' @regex_censor_rule.regexp = true @regex_censor_rule.replacement = 'cat' @@ -477,7 +477,7 @@ describe IncomingMessage, " when censoring whole users" do @im = incoming_messages(:useless_incoming_message) - @censor_rule_1 = CensorRule.new() + @censor_rule_1 = CensorRule.new @censor_rule_1.text = "Stilton" @censor_rule_1.replacement = "Gorgonzola" @censor_rule_1.last_edit_editor = "unknown" @@ -563,7 +563,7 @@ describe IncomingMessage, " when uudecoding bad messages" do im.stub!(:mail).and_return(mail) ir = info_requests(:fancy_dog_request) - @censor_rule = CensorRule.new() + @censor_rule = CensorRule.new @censor_rule.text = "moo" @censor_rule.replacement = "bah" @censor_rule.last_edit_editor = "unknown" diff --git a/spec/models/info_request_batch_spec.rb b/spec/models/info_request_batch_spec.rb index 2881e7745..a8572e7ba 100644 --- a/spec/models/info_request_batch_spec.rb +++ b/spec/models/info_request_batch_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: info_request_batches @@ -80,7 +81,7 @@ describe InfoRequestBatch, "when finding an existing batch" do end end -describe InfoRequestBatch, "when creating a batch", :focus => true do +describe InfoRequestBatch, "when creating a batch" do before do @title = 'A test title' diff --git a/spec/models/info_request_event_spec.rb b/spec/models/info_request_event_spec.rb index 53c83bd46..17c6a5004 100644 --- a/spec/models/info_request_event_spec.rb +++ b/spec/models/info_request_event_spec.rb @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: info_request_events @@ -30,6 +30,12 @@ describe InfoRequestEvent do ire.params.should == example_params end + it "should restore UTF8-heavy params stored under ruby 1.8 as UTF-8" do + ire = InfoRequestEvent.new + utf8_params = "--- \n:foo: !binary |\n 0KLQvtCz0LDRiCDR\n" + ire.params_yaml = utf8_params + ire.params[:foo].encoding.to_s.should == 'UTF-8' if ire.params[:foo].respond_to?(:encoding) + end end describe 'when deciding if it is indexed by search' do @@ -105,8 +111,7 @@ describe InfoRequestEvent do describe "should know" do it "that it's an incoming message" do - event = InfoRequestEvent.new() - event.stub!(:incoming_message_selective_columns).and_return(1) + event = InfoRequestEvent.new(:incoming_message => mock_model(IncomingMessage)) event.is_incoming_message?.should be_true event.is_outgoing_message?.should be_false event.is_comment?.should be_false diff --git a/spec/models/info_request_spec.rb b/spec/models/info_request_spec.rb index 9d1e02442..18120fbb5 100644 --- a/spec/models/info_request_spec.rb +++ b/spec/models/info_request_spec.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: info_requests @@ -28,6 +28,117 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe InfoRequest do + describe :new do + + it 'sets the default law used' do + expect(InfoRequest.new.law_used).to eq('foi') + end + + it 'sets the default law used if a body is eir-only' do + body = FactoryGirl.create(:public_body, :tag_string => 'eir_only') + expect(body.info_requests.build.law_used).to eq('eir') + end + + it 'does not try to set the law used for existing requests' do + info_request = FactoryGirl.create(:info_request) + body = FactoryGirl.create(:public_body, :tag_string => 'eir_only') + info_request.update_attributes(:public_body_id => body.id) + InfoRequest.any_instance.should_not_receive(:law_used=).and_call_original + InfoRequest.find(info_request.id) + end + end + + describe :move_to_public_body do + + context 'with no options' do + + it 'requires an :editor option' do + request = FactoryGirl.create(:info_request) + new_body = FactoryGirl.create(:public_body) + expect { + request.move_to_public_body(new_body) + }.to raise_error IndexError + end + + end + + context 'with the :editor option' do + + it 'moves the info request to the new public body' do + request = FactoryGirl.create(:info_request) + new_body = FactoryGirl.create(:public_body) + user = FactoryGirl.create(:user) + request.move_to_public_body(new_body, :editor => user) + request.reload + expect(request.public_body).to eq(new_body) + end + + it 'logs the move' do + request = FactoryGirl.create(:info_request) + old_body = request.public_body + new_body = FactoryGirl.create(:public_body) + user = FactoryGirl.create(:user) + request.move_to_public_body(new_body, :editor => user) + request.reload + event = request.info_request_events.last + + expect(event.event_type).to eq('move_request') + expect(event.params[:editor]).to eq(user) + expect(event.params[:public_body_url_name]).to eq(new_body.url_name) + expect(event.params[:old_public_body_url_name]).to eq(old_body.url_name) + end + + it 'updates the law_used to the new body law' do + request = FactoryGirl.create(:info_request) + new_body = FactoryGirl.create(:public_body, :tag_string => 'eir_only') + user = FactoryGirl.create(:user) + request.move_to_public_body(new_body, :editor => user) + request.reload + expect(request.law_used).to eq('eir') + end + + it 'returns the new public body' do + request = FactoryGirl.create(:info_request) + new_body = FactoryGirl.create(:public_body) + user = FactoryGirl.create(:user) + expect(request.move_to_public_body(new_body, :editor => user)).to eq(new_body) + end + + it 'retains the existing body if the new body does not exist' do + request = FactoryGirl.create(:info_request) + user = FactoryGirl.create(:user) + existing_body = request.public_body + request.move_to_public_body(nil, :editor => user) + request.reload + expect(request.public_body).to eq(existing_body) + end + + it 'returns nil if the body cannot be updated' do + request = FactoryGirl.create(:info_request) + user = FactoryGirl.create(:user) + expect(request.move_to_public_body(nil, :editor => user)).to eq(nil) + end + + it 'reindexes the info request' do + request = FactoryGirl.create(:info_request) + new_body = FactoryGirl.create(:public_body) + user = FactoryGirl.create(:user) + reindex_job = ActsAsXapian::ActsAsXapianJob. + where(:model => 'InfoRequestEvent'). + delete_all + + request.move_to_public_body(new_body, :editor => user) + request.reload + + reindex_job = ActsAsXapian::ActsAsXapianJob. + where(:model => 'InfoRequestEvent'). + last + expect(reindex_job.model_id).to eq(request.info_request_events.last.id) + end + + end + end + describe 'when validating' do it 'should accept a summary with ascii characters' do @@ -42,7 +153,7 @@ describe InfoRequest do info_request.errors[:title].should be_empty end - it 'should not accept a summary with no ascii or unicode characters' do + it 'should not accept a summary with no ascii or unicode characters' do info_request = InfoRequest.new(:title => '55555') info_request.valid? info_request.errors[:title].should_not be_empty @@ -547,17 +658,22 @@ describe InfoRequest do before do Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59)) - @mock_comment_event = mock_model(InfoRequestEvent, :created_at => Time.now - 23.days, - :event_type => 'comment', - :response? => false) - mock_incoming_message = mock_model(IncomingMessage, :all_can_view? => true) - @mock_response_event = mock_model(InfoRequestEvent, :created_at => Time.now - 22.days, - :event_type => 'response', - :response? => true, - :incoming_message => mock_incoming_message) - @info_request = InfoRequest.new(:prominence => 'normal', - :awaiting_description => true, - :info_request_events => [@mock_response_event, @mock_comment_event]) + @info_request = FactoryGirl.create(:info_request, + :prominence => 'normal', + :awaiting_description => true) + @comment_event = FactoryGirl.create(:info_request_event, + :created_at => Time.now - 23.days, + :event_type => 'comment', + :info_request => @info_request) + @incoming_message = FactoryGirl.create(:incoming_message, + :prominence => 'normal', + :info_request => @info_request) + @response_event = FactoryGirl.create(:info_request_event, + :info_request => @info_request, + :created_at => Time.now - 22.days, + :event_type => 'response', + :incoming_message => @incoming_message) + @info_request.update_attribute(:awaiting_description, true) end it 'should return false if it is the holding pen' do @@ -571,7 +687,7 @@ describe InfoRequest do end it 'should return false if its last response event occurred less than 21 days ago' do - @mock_response_event.stub!(:created_at).and_return(Time.now - 20.days) + @response_event.update_attribute(:created_at, Time.now - 20.days) @info_request.is_old_unclassified?.should be_false end @@ -1314,4 +1430,20 @@ describe InfoRequest do end + + describe 'when destroying a message' do + + it 'can destroy a request with comments and censor rules' do + info_request = FactoryGirl.create(:info_request) + censor_rule = FactoryGirl.create(:censor_rule, :info_request => info_request) + comment = FactoryGirl.create(:comment, :info_request => info_request) + info_request.reload + info_request.fully_destroy + + InfoRequest.where(:id => info_request.id).should be_empty + CensorRule.where(:id => censor_rule.id).should be_empty + Comment.where(:id => comment.id).should be_empty + end + + end end diff --git a/spec/models/mail_server_log_spec.rb b/spec/models/mail_server_log_spec.rb index 67709b130..6b38e1270 100644 --- a/spec/models/mail_server_log_spec.rb +++ b/spec/models/mail_server_log_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: mail_server_logs diff --git a/spec/models/outgoing_message_spec.rb b/spec/models/outgoing_message_spec.rb index a3e2d1c68..8d43e2ef1 100644 --- a/spec/models/outgoing_message_spec.rb +++ b/spec/models/outgoing_message_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: outgoing_messages @@ -18,6 +19,93 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +describe OutgoingMessage do + + describe :initialize do + + it 'does not censor the #body' do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => 'abc', + :what_doing => 'normal_sort' } + + message = FactoryGirl.create(:outgoing_message, attrs) + + OutgoingMessage.any_instance.should_not_receive(:body).and_call_original + OutgoingMessage.find(message.id) + end + + end + + describe :body do + + it 'returns the body attribute' do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => 'abc', + :what_doing => 'normal_sort' } + + message = FactoryGirl.build(:outgoing_message, attrs) + expect(message.body).to eq('abc') + end + + it 'strips the body of leading and trailing whitespace' do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => ' abc ', + :what_doing => 'normal_sort' } + + message = FactoryGirl.build(:outgoing_message, attrs) + expect(message.body).to eq('abc') + end + + it 'removes excess linebreaks that unnecessarily space it out' do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => "ab\n\nc\n\n", + :what_doing => 'normal_sort' } + + message = FactoryGirl.build(:outgoing_message, attrs) + expect(message.body).to eq("ab\n\nc") + end + + it "applies the associated request's censor rules to the text" do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => 'This sensitive text contains secret info!', + :what_doing => 'normal_sort' } + message = FactoryGirl.build(:outgoing_message, attrs) + + rules = [FactoryGirl.build(:censor_rule, :text => 'secret'), + FactoryGirl.build(:censor_rule, :text => 'sensitive')] + InfoRequest.any_instance.stub(:censor_rules).and_return(rules) + + expected = 'This [REDACTED] text contains [REDACTED] info!' + expect(message.body).to eq(expected) + end + + it "applies the given censor rules to the text" do + attrs = { :status => 'ready', + :message_type => 'initial_request', + :body => 'This sensitive text contains secret info!', + :what_doing => 'normal_sort' } + message = FactoryGirl.build(:outgoing_message, attrs) + + request_rules = [FactoryGirl.build(:censor_rule, :text => 'secret'), + FactoryGirl.build(:censor_rule, :text => 'sensitive')] + InfoRequest.any_instance.stub(:censor_rules).and_return(request_rules) + + censor_rules = [FactoryGirl.build(:censor_rule, :text => 'text'), + FactoryGirl.build(:censor_rule, :text => 'contains')] + + expected = 'This sensitive [REDACTED] [REDACTED] secret info!' + expect(message.body(:censor_rules => censor_rules)).to eq(expected) + end + + end + +end + describe OutgoingMessage, " when making an outgoing message" do before do @@ -26,7 +114,7 @@ describe OutgoingMessage, " when making an outgoing message" do :status => 'ready', :message_type => 'initial_request', :body => 'This request contains a foo@bar.com email address', - :last_sent_at => Time.now(), + :last_sent_at => Time.now, :what_doing => 'normal_sort' }) end @@ -57,6 +145,7 @@ describe OutgoingMessage, " when making an outgoing message" do info_request = mock_model(InfoRequest, :public_body => public_body, :url_title => 'a_test_title', :title => 'A test title', + :applicable_censor_rules => [], :apply_censor_rules_to_text! => nil, :is_batch_request_template? => false) outgoing_message = OutgoingMessage.new({ @@ -155,27 +244,6 @@ describe OutgoingMessage, " when making an outgoing message" do end end - -describe OutgoingMessage, " when censoring data" do - - before do - @om = outgoing_messages(:useless_outgoing_message) - - @censor_rule = CensorRule.new() - @censor_rule.text = "dog" - @censor_rule.replacement = "cat" - @censor_rule.last_edit_editor = "unknown" - @censor_rule.last_edit_comment = "none" - - @om.info_request.censor_rules << @censor_rule - end - - it "should apply censor rules to outgoing messages" do - @om.read_attribute(:body).should match(/fancy dog/) - @om.body.should match(/fancy cat/) - end -end - describe OutgoingMessage, "when validating the format of the message body" do it 'should handle a salutation with a bracket in it' do diff --git a/spec/models/post_redirect_spec.rb b/spec/models/post_redirect_spec.rb index 73740e914..7d0dfe395 100644 --- a/spec/models/post_redirect_spec.rb +++ b/spec/models/post_redirect_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: post_redirects @@ -65,11 +66,18 @@ describe PostRedirect, " when accessing values" do end it "should convert reason parameters into YAML and back successfully" do - pr = PostRedirect.new + pr = PostRedirect.new example_reason_params = { :foo => 'this is stuff', :bar => 83, :humbug => "yikes!!!" } pr.reason_params = example_reason_params pr.reason_params_yaml.should == example_reason_params.to_yaml pr.reason_params.should == example_reason_params end + + it "should restore UTF8-heavy params stored under ruby 1.8 as UTF-8" do + pr = PostRedirect.new + utf8_params = "--- \n:foo: !binary |\n 0KLQvtCz0LDRiCDR\n" + pr.reason_params_yaml = utf8_params + pr.reason_params[:foo].encoding.to_s.should == 'UTF-8' if pr.reason_params[:foo].respond_to?(:encoding) + end end diff --git a/spec/models/profile_photo_spec.rb b/spec/models/profile_photo_spec.rb index e70f474a0..199c87500 100644 --- a/spec/models/profile_photo_spec.rb +++ b/spec/models/profile_photo_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: profile_photos diff --git a/spec/models/public_body_category/category_collection_spec.rb b/spec/models/public_body_category/category_collection_spec.rb index 1fbcbe739..9ee684982 100644 --- a/spec/models/public_body_category/category_collection_spec.rb +++ b/spec/models/public_body_category/category_collection_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') describe PublicBodyCategory::CategoryCollection do @@ -15,7 +16,7 @@ describe PublicBodyCategory::CategoryCollection do describe 'when asked for headings' do it 'should return a list of headings' do - @categories.headings().should == ['Local and regional', 'Miscellaneous'] + @categories.headings.should == ['Local and regional', 'Miscellaneous'] end end @@ -30,7 +31,7 @@ describe PublicBodyCategory::CategoryCollection do "Miscellaneous", ["other", "Miscellaneous", "miscellaneous"]] - @categories.with_headings().should == expected_categories + @categories.with_headings.should == expected_categories end end @@ -38,7 +39,7 @@ describe PublicBodyCategory::CategoryCollection do describe 'when asked for tags by headings' do it 'should return a hash of tags keyed by heading' do - @categories.by_heading().should == {'Local and regional' => ['local_council'], + @categories.by_heading.should == {'Local and regional' => ['local_council'], 'Miscellaneous' => ['other']} end end @@ -50,19 +51,19 @@ describe PublicBodyCategory::CategoryCollection do ["local_council", "Local councils", "a local council"], ["other", "Miscellaneous", "miscellaneous"] ] - @categories.with_description().should == expected_categories + @categories.with_description.should == expected_categories end end describe 'when asked for tags' do it 'should return a list of tags' do - @categories.tags().should == ["local_council", "other"] + @categories.tags.should == ["local_council", "other"] end end describe 'when asked for categories by tag' do it 'should return a hash of categories keyed by tag' do - @categories.by_tag().should == { + @categories.by_tag.should == { "local_council" => "Local councils", "other" => "Miscellaneous" } @@ -71,7 +72,7 @@ describe PublicBodyCategory::CategoryCollection do describe 'when asked for singular_by_tag' do it 'should return a hash of category descriptions keyed by tag' do - @categories.singular_by_tag().should == { + @categories.singular_by_tag.should == { "local_council" => "a local council", "other" => "miscellaneous" } diff --git a/spec/models/public_body_category_link_spec.rb b/spec/models/public_body_category_link_spec.rb index fd5608480..564f4126f 100644 --- a/spec/models/public_body_category_link_spec.rb +++ b/spec/models/public_body_category_link_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_category_links diff --git a/spec/models/public_body_category_spec.rb b/spec/models/public_body_category_spec.rb index 297bd096a..c6b2a8fde 100644 --- a/spec/models/public_body_category_spec.rb +++ b/spec/models/public_body_category_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_categories diff --git a/spec/models/public_body_change_request_spec.rb b/spec/models/public_body_change_request_spec.rb index 0c4cea67b..e35ffa692 100644 --- a/spec/models/public_body_change_request_spec.rb +++ b/spec/models/public_body_change_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_change_requests @@ -21,7 +22,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBodyChangeRequest, 'when validating' do it 'should not be valid without a public body name' do - change_request = PublicBodyChangeRequest.new() + change_request = PublicBodyChangeRequest.new change_request.valid?.should be_false change_request.errors[:public_body_name].should == ['Please enter the name of the authority'] end diff --git a/spec/models/public_body_heading_spec.rb b/spec/models/public_body_heading_spec.rb index be3e7c7d2..8b46181b6 100644 --- a/spec/models/public_body_heading_spec.rb +++ b/spec/models/public_body_heading_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_body_headings diff --git a/spec/models/public_body_spec.rb b/spec/models/public_body_spec.rb index 7b55efda1..3d14127f4 100644 --- a/spec/models/public_body_spec.rb +++ b/spec/models/public_body_spec.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: public_bodies @@ -102,8 +102,44 @@ describe PublicBody do end end end -end + describe :set_api_key do + + it 'generates and sets an API key' do + SecureRandom.stub(:base64).and_return('APIKEY') + body = PublicBody.new + body.set_api_key + expect(body.api_key).to eq('APIKEY') + end + + it 'does not overwrite an existing API key' do + SecureRandom.stub(:base64).and_return('APIKEY') + body = PublicBody.new(:api_key => 'EXISTING') + body.set_api_key + expect(body.api_key).to eq('EXISTING') + end + + end + + describe :set_api_key! do + + it 'generates and sets an API key' do + SecureRandom.stub(:base64).and_return('APIKEY') + body = PublicBody.new + body.set_api_key! + expect(body.api_key).to eq('APIKEY') + end + + it 'overwrites an existing API key' do + SecureRandom.stub(:base64).and_return('APIKEY') + body = PublicBody.new(:api_key => 'EXISTING') + body.set_api_key! + expect(body.api_key).to eq('APIKEY') + end + + end + +end describe PublicBody, " using tags" do before do @@ -282,6 +318,31 @@ describe PublicBody, " when saving" do pb.first_letter.should == 'Å' end + it 'should save the first letter of a translation' do + existing = FactoryGirl.create(:public_body, :first_letter => 'T', :name => 'Test body') + I18n.with_locale(:es) { existing.update_attributes :name => 'Prueba body' } + PublicBody::Translation. + where(:public_body_id => existing.id, :locale => :es). + pluck('first_letter').first.should == 'P' + end + + it 'should save the first letter of a translation, even when it is the same as the + first letter in the default locale' do + existing = FactoryGirl.create(:public_body, :first_letter => 'T', :name => 'Test body') + I18n.with_locale(:es) { existing.update_attributes :name => existing.name } + PublicBody::Translation. + where(:public_body_id => existing.id, :locale => :es). + pluck('first_letter').first.should == 'T' + end + + it 'should create a url_name for a translation' do + existing = FactoryGirl.create(:public_body, :first_letter => 'T', :short_name => 'Test body') + I18n.with_locale(:es) do + existing.update_attributes :short_name => 'Prueba', :name => 'Prueba body' + existing.url_name.should == 'prueba' + end + end + it "should not save if the url_name is already taken" do existing = FactoryGirl.create(:public_body) pb = PublicBody.new(existing.attributes) @@ -1237,6 +1298,33 @@ describe PublicBody do end + describe :request_email do + context "when the email is set" do + subject(:public_body) { FactoryGirl.create(:public_body, :request_email => "request@example.com") } + + it "should return the set email address" do + expect(public_body.request_email).to eq("request@example.com") + end + + it "should return a different email address when overridden in configuration" do + AlaveteliConfiguration.stub!(:override_all_public_body_request_emails).and_return("tester@example.com") + expect(public_body.request_email).to eq("tester@example.com") + end + end + + context "when no email is set" do + subject(:public_body) { FactoryGirl.create(:public_body, :request_email => "") } + + it "should return a blank email address" do + expect(public_body.request_email).to be_blank + end + + it "should still return a blank email address when overridden in configuration" do + AlaveteliConfiguration.stub!(:override_all_public_body_request_emails).and_return("tester@example.com") + expect(public_body.request_email).to be_blank + end + end + end end describe PublicBody::Translation do diff --git a/spec/models/purge_request_spec.rb b/spec/models/purge_request_spec.rb index 02b3d685d..642d5d2e2 100644 --- a/spec/models/purge_request_spec.rb +++ b/spec/models/purge_request_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: purge_requests @@ -22,23 +23,23 @@ describe PurgeRequest, "purging things" do req = PurgeRequest.new(:url => "/begone_from_here", :model => "don't care", :model_id => "don't care") - req.save() - PurgeRequest.all().count.should == 1 - PurgeRequest.purge_all() - PurgeRequest.all().count.should == 0 + req.save + PurgeRequest.all.count.should == 1 + PurgeRequest.purge_all + PurgeRequest.all.count.should == 0 end it 'should fail silently for a misconfigured server' do FakeWeb.register_uri(:get, %r|brokenv|, :body => "BROKEN") - config = MySociety::Config.load_default() + config = MySociety::Config.load_default config['VARNISH_HOST'] = "brokencache" req = PurgeRequest.new(:url => "/begone_from_here", :model => "don't care", :model_id => "don't care") - req.save() - PurgeRequest.all().count.should == 1 - PurgeRequest.purge_all() - PurgeRequest.all().count.should == 0 + req.save + PurgeRequest.all.count.should == 1 + PurgeRequest.purge_all + PurgeRequest.all.count.should == 0 end end diff --git a/spec/models/spam_address_spec.rb b/spec/models/spam_address_spec.rb index f28440121..670b969b0 100644 --- a/spec/models/spam_address_spec.rb +++ b/spec/models/spam_address_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: spam_addresses @@ -15,7 +16,7 @@ describe SpamAddress do describe :new do it 'requres an email address' do - SpamAddress.new().should_not be_valid + SpamAddress.new.should_not be_valid SpamAddress.new(:email => 'spam@example.org').should be_valid end diff --git a/spec/models/track_thing_spec.rb b/spec/models/track_thing_spec.rb index 3edf2d1ad..251a50803 100644 --- a/spec/models/track_thing_spec.rb +++ b/spec/models/track_thing_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: track_things diff --git a/spec/models/track_things_sent_email_spec.rb b/spec/models/track_things_sent_email_spec.rb index 4675d0847..b31a989db 100644 --- a/spec/models/track_things_sent_email_spec.rb +++ b/spec/models/track_things_sent_email_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: track_things_sent_emails diff --git a/spec/models/user_info_request_sent_alert_spec.rb b/spec/models/user_info_request_sent_alert_spec.rb index 69be1092b..6b4efa575 100644 --- a/spec/models/user_info_request_sent_alert_spec.rb +++ b/spec/models/user_info_request_sent_alert_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: user_info_request_sent_alerts diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 2245a024f..009045bdf 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # == Schema Information # # Table name: users diff --git a/spec/models/widget_vote_spec.rb b/spec/models/widget_vote_spec.rb new file mode 100644 index 000000000..1a6d3833c --- /dev/null +++ b/spec/models/widget_vote_spec.rb @@ -0,0 +1,54 @@ +# -*- encoding : utf-8 -*- +# == Schema Information +# +# Table name: widget_votes +# +# id :integer not null, primary key +# cookie :string(255) +# info_request_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# + +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe WidgetVote do + + describe :new do + + it 'requires an info request' do + widget_vote = WidgetVote.new + widget_vote.should_not be_valid + widget_vote.errors[:info_request].should == ["can't be blank"] + end + + it 'validates the cookie length' do + widget_vote = WidgetVote.new + widget_vote.should_not be_valid + widget_vote.errors[:cookie].should == ["is the wrong length (should be 20 characters)"] + end + + it 'is valid with a cookie and info request' do + widget_vote = FactoryGirl.create(:widget_vote) + widget_vote.should be_valid + end + + it 'enforces uniqueness of cookie per info request' do + info_request = FactoryGirl.create(:info_request) + widget_vote = info_request.widget_votes.create(:cookie => 'x' * 20) + duplicate_vote = info_request.widget_votes.build(:cookie => 'x' * 20) + duplicate_vote.should_not be_valid + duplicate_vote.errors[:cookie].should == ["has already been taken"] + end + + it 'allows the same cookie to be used across info requests' do + info_request = FactoryGirl.create(:info_request) + second_info_request = FactoryGirl.create(:info_request) + widget_vote = info_request.widget_votes.create(:cookie => 'x' * 20) + second_request_vote = second_info_request.widget_votes.build(:cookie => 'x' * 20) + second_request_vote.should be_valid + end + + end + +end diff --git a/spec/models/xapian_spec.rb b/spec/models/xapian_spec.rb index ca6cd7db7..212a1cc7e 100644 --- a/spec/models/xapian_spec.rb +++ b/spec/models/xapian_spec.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe User, " when indexing users with Xapian" do @@ -102,7 +102,7 @@ describe PublicBody, " when indexing requests by body they are to" do end # if you index via the Xapian TermGenerator, it ignores terms of this length, - # this checks we're using Document:::add_term() instead + # this checks we're using Document:::add_term instead it "should work with URL names that are longer than 64 characters" do # change the URL name of the body body = public_bodies(:geraldine_public_body) diff --git a/spec/script/handle-mail-replies_spec.rb b/spec/script/handle-mail-replies_spec.rb index 72914e517..e45f13fc9 100644 --- a/spec/script/handle-mail-replies_spec.rb +++ b/spec/script/handle-mail-replies_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require "external_command" diff --git a/spec/script/mailin_spec.rb b/spec/script/mailin_spec.rb index 0ff094c2b..6cdc1308e 100644 --- a/spec/script/mailin_spec.rb +++ b/spec/script/mailin_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require "external_command" diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 93bcfa1ba..d9feba6cd 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require 'rubygems' require 'spork' @@ -124,13 +125,6 @@ Spork.prefork do end end - # TODO: No idea what namespace/class/module to put this in - # Create a clean xapian index based on the fixture files and the raw_email data. - def create_fixtures_xapian_index - load_raw_emails_data - rebuild_xapian_index - end - # Use the before create job hook to simulate a race condition with # another process by creating an acts_as_xapian_job record for the # same model: diff --git a/spec/support/email_helpers.rb b/spec/support/email_helpers.rb index 252b1f137..8f2abdbfa 100644 --- a/spec/support/email_helpers.rb +++ b/spec/support/email_helpers.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- def load_raw_emails_data raw_emails_yml = File.join(RSpec.configuration.fixture_path, "raw_emails.yml") for raw_email_id in YAML::load_file(raw_emails_yml).map{|k,v| v["id"]} do diff --git a/spec/support/load_file_fixtures.rb b/spec/support/load_file_fixtures.rb index a54505e99..4370a1b3d 100644 --- a/spec/support/load_file_fixtures.rb +++ b/spec/support/load_file_fixtures.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- def file_fixture_name(file_name) return File.join(RSpec.configuration.fixture_path, "files", file_name) end diff --git a/spec/support/xapian_index.rb b/spec/support/xapian_index.rb index 344c28ebb..3f5f900fd 100644 --- a/spec/support/xapian_index.rb +++ b/spec/support/xapian_index.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- # Rebuild the current xapian index def rebuild_xapian_index(terms = true, values = true, texts = true, dropfirst = true) if dropfirst @@ -22,7 +23,7 @@ end # Copy the xapian index created in create_fixtures_xapian_index to a temporary # copy at the same level and point xapian at the copy -def get_fixtures_xapian_index() +def get_fixtures_xapian_index # Create a base index for the fixtures if not already created $existing_xapian_db ||= create_fixtures_xapian_index # Store whatever the xapian db path is originally diff --git a/spec/views/public_body/show.html.erb_spec.rb b/spec/views/public_body/show.html.erb_spec.rb index 6ebc39caa..c20d8483c 100644 --- a/spec/views/public_body/show.html.erb_spec.rb +++ b/spec/views/public_body/show.html.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe "public_body/show" do @@ -13,11 +14,11 @@ describe "public_body/show" do :publication_scheme => '', :disclosure_log => '', :calculated_home_page => '') - @pb.stub!(:override_request_email).and_return(nil) @pb.stub!(:is_requestable?).and_return(true) @pb.stub!(:special_not_requestable_reason?).and_return(false) @pb.stub!(:has_notes?).and_return(false) @pb.stub!(:has_tag?).and_return(false) + @pb.stub!(:tag_string).and_return('') @xap = mock(ActsAsXapian::Search, :matches_estimated => 2) @xap.stub!(:results).and_return([ { :model => mock_event }, @@ -30,6 +31,7 @@ describe "public_body/show" do assign(:xapian_requests, @xap) assign(:page, 1) assign(:per_page, 10) + assign(:number_of_visible_requests, 4) end it "should be successful" do @@ -48,7 +50,7 @@ describe "public_body/show" do end it "should cope with no results" do - @pb.stub!(:info_requests).and_return([]) + assign(:number_of_visible_requests, 0) render response.should have_selector('p', :content => "Nobody has made any Freedom of Information requests") end diff --git a/spec/views/reports/new.erb_spec.rb b/spec/views/reports/new.erb_spec.rb index 66b738261..d599100b9 100644 --- a/spec/views/reports/new.erb_spec.rb +++ b/spec/views/reports/new.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe 'reports/new.html.erb' do diff --git a/spec/views/request/_after_actions.html.erb_spec.rb b/spec/views/request/_after_actions.html.erb_spec.rb index 833323d68..7a58731ce 100644 --- a/spec/views/request/_after_actions.html.erb_spec.rb +++ b/spec/views/request/_after_actions.html.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe 'when displaying actions that can be taken with regard to a request' do diff --git a/spec/views/request/_describe_state.html.erb_spec.rb b/spec/views/request/_describe_state.html.erb_spec.rb index 88dea53c5..1026ad2f3 100644 --- a/spec/views/request/_describe_state.html.erb_spec.rb +++ b/spec/views/request/_describe_state.html.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe 'when showing the form for describing the state of a request' do diff --git a/spec/views/request/show.html.erb_spec.rb b/spec/views/request/show.html.erb_spec.rb index 6e63b9b43..71057f028 100644 --- a/spec/views/request/show.html.erb_spec.rb +++ b/spec/views/request/show.html.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe 'request/show' do diff --git a/spec/views/request_game/play.html.erb_spec.rb b/spec/views/request_game/play.html.erb_spec.rb index b5cf57c23..37a84b211 100644 --- a/spec/views/request_game/play.html.erb_spec.rb +++ b/spec/views/request_game/play.html.erb_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require File.expand_path(File.join('..', '..', '..', 'spec_helper'), __FILE__) describe 'request_game/play' do |