aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.codeclimate.yml5
-rw-r--r--.gitignore5
-rw-r--r--.ruby-version.example (renamed from .ruby-version)0
-rw-r--r--.travis.yml2
-rw-r--r--Gemfile23
-rw-r--r--Gemfile.lock40
-rw-r--r--README.md32
-rw-r--r--app/assets/images/icon_application_octet-stream_large.pngbin3184 -> 1315 bytes
-rw-r--r--app/assets/images/icon_application_pdf_large.pngbin2522 -> 849 bytes
-rw-r--r--app/assets/images/icon_application_rtf_large.pngbin2564 -> 818 bytes
-rw-r--r--app/assets/images/icon_application_vnd.ms-excel_large.pngbin2891 -> 848 bytes
-rw-r--r--app/assets/images/icon_application_vnd.ms-powerpoint_large.pngbin2495 -> 894 bytes
-rw-r--r--app/assets/images/icon_application_vnd.ms-word_large.pngbin2775 -> 935 bytes
-rw-r--r--app/assets/images/icon_application_zip_large.pngbin2863 -> 443 bytes
l---------[-rw-r--r--]app/assets/images/icon_image_bmp_large.pngbin2774 -> 24 bytes
l---------[-rw-r--r--]app/assets/images/icon_image_gif_large.pngbin2575 -> 24 bytes
-rw-r--r--app/assets/images/icon_image_img_large.pngbin0 -> 890 bytes
l---------[-rw-r--r--]app/assets/images/icon_image_jpeg_large.pngbin2633 -> 24 bytes
l---------[-rw-r--r--]app/assets/images/icon_image_png_large.pngbin2736 -> 24 bytes
-rw-r--r--app/assets/images/icon_image_tiff_large.pngbin2552 -> 1160 bytes
-rw-r--r--app/assets/images/icon_message_delivery-status_large.pngbin3184 -> 1010 bytes
-rw-r--r--app/assets/images/icon_text_html_large.pngbin3259 -> 1186 bytes
-rw-r--r--app/assets/images/icon_text_plain_large.pngbin2138 -> 400 bytes
-rw-r--r--app/assets/images/icon_text_x-vcard_large.pngbin2779 -> 1059 bytes
-rw-r--r--app/assets/images/icon_unknown.pngbin3604 -> 949 bytes
-rw-r--r--app/assets/images/widget-base.pngbin0 -> 569 bytes
-rw-r--r--app/assets/javascripts/admin/admin.js.coffee4
-rw-r--r--app/assets/javascripts/general.js10
-rw-r--r--app/assets/javascripts/jquery.Jcrop.js163
-rw-r--r--app/assets/javascripts/jquery.Jcrop.min.js7
-rw-r--r--app/assets/javascripts/jquery.js4
-rw-r--r--app/assets/javascripts/jquery_ujs.js393
-rw-r--r--app/assets/javascripts/profile-photos.js2
-rw-r--r--app/assets/javascripts/profile_photo.js100
-rwxr-xr-xapp/assets/stylesheets/jquery-ui-1.8.15.custom.css375
-rw-r--r--app/assets/stylesheets/jquery.Jcrop.css35
-rw-r--r--app/assets/stylesheets/jquery.Jcrop.min.css2
-rw-r--r--app/assets/stylesheets/responsive/_global_layout.scss7
-rw-r--r--app/assets/stylesheets/responsive/_global_style.scss3
-rw-r--r--app/assets/stylesheets/responsive/_header_layout.scss16
-rw-r--r--app/assets/stylesheets/responsive/_header_style.scss6
-rw-r--r--app/assets/stylesheets/responsive/_request_style.scss15
-rw-r--r--app/assets/stylesheets/responsive/_utils.scss15
-rw-r--r--app/assets/stylesheets/widget.scss109
-rw-r--r--app/controllers/admin_censor_rule_controller.rb1
-rw-r--r--app/controllers/admin_comment_controller.rb5
-rw-r--r--app/controllers/admin_controller.rb1
-rw-r--r--app/controllers/admin_general_controller.rb35
-rw-r--r--app/controllers/admin_holiday_imports_controller.rb1
-rw-r--r--app/controllers/admin_holidays_controller.rb1
-rw-r--r--app/controllers/admin_incoming_message_controller.rb7
-rw-r--r--app/controllers/admin_info_request_event_controller.rb1
-rw-r--r--app/controllers/admin_outgoing_message_controller.rb5
-rw-r--r--app/controllers/admin_public_body_categories_controller.rb1
-rw-r--r--app/controllers/admin_public_body_change_requests_controller.rb1
-rw-r--r--app/controllers/admin_public_body_controller.rb17
-rw-r--r--app/controllers/admin_public_body_headings_controller.rb5
-rw-r--r--app/controllers/admin_raw_email_controller.rb1
-rw-r--r--app/controllers/admin_request_controller.rb30
-rw-r--r--app/controllers/admin_spam_addresses_controller.rb1
-rw-r--r--app/controllers/admin_track_controller.rb1
-rw-r--r--app/controllers/admin_user_controller.rb4
-rw-r--r--app/controllers/api_controller.rb3
-rw-r--r--app/controllers/application_controller.rb4
-rw-r--r--app/controllers/comment_controller.rb1
-rw-r--r--app/controllers/general_controller.rb5
-rw-r--r--app/controllers/health_checks_controller.rb1
-rw-r--r--app/controllers/help_controller.rb1
-rw-r--r--app/controllers/holiday_controller.rb1
-rw-r--r--app/controllers/info_request_batch_controller.rb1
-rw-r--r--app/controllers/public_body_change_requests_controller.rb1
-rw-r--r--app/controllers/public_body_controller.rb33
-rw-r--r--app/controllers/reports_controller.rb1
-rw-r--r--app/controllers/request_controller.rb26
-rw-r--r--app/controllers/request_game_controller.rb3
-rw-r--r--app/controllers/services_controller.rb1
-rw-r--r--app/controllers/track_controller.rb3
-rw-r--r--app/controllers/user_controller.rb9
-rw-r--r--app/controllers/widgets_controller.rb64
-rw-r--r--app/helpers/admin_helper.rb1
-rw-r--r--app/helpers/admin_public_body_category_helper.rb1
-rw-r--r--app/helpers/application_helper.rb1
-rw-r--r--app/helpers/config_helper.rb1
-rw-r--r--app/helpers/date_time_helper.rb1
-rw-r--r--app/helpers/health_checks_helper.rb3
-rwxr-xr-xapp/helpers/link_to_helper.rb27
-rw-r--r--app/helpers/mailer_helper.rb1
-rw-r--r--app/helpers/public_body_helper.rb22
-rw-r--r--app/helpers/track_helper.rb1
-rw-r--r--app/helpers/widget_helper.rb47
-rw-r--r--app/mailers/application_mailer.rb1
-rw-r--r--app/mailers/contact_mailer.rb3
-rw-r--r--app/mailers/info_request_batch_mailer.rb1
-rw-r--r--app/mailers/outgoing_mailer.rb15
-rw-r--r--app/mailers/request_mailer.rb98
-rw-r--r--app/mailers/track_mailer.rb3
-rw-r--r--app/mailers/user_mailer.rb1
-rw-r--r--app/models/about_me_validator.rb12
-rw-r--r--app/models/censor_rule.rb39
-rw-r--r--app/models/change_email_validator.rb1
-rw-r--r--app/models/comment.rb14
-rw-r--r--app/models/concerns/admin_column.rb17
-rw-r--r--app/models/concerns/public_body_derived_fields.rb47
-rw-r--r--app/models/concerns/translatable.rb37
-rw-r--r--app/models/contact_validator.rb1
-rw-r--r--app/models/foi_attachment.rb64
-rw-r--r--app/models/holiday.rb1
-rw-r--r--app/models/holiday_import.rb1
-rw-r--r--app/models/incoming_message.rb105
-rw-r--r--app/models/info_request.rb187
-rw-r--r--app/models/info_request_batch.rb5
-rw-r--r--app/models/info_request_event.rb32
-rw-r--r--app/models/mail_server_log.rb55
-rw-r--r--app/models/mail_server_log_done.rb1
-rw-r--r--app/models/outgoing_message.rb55
-rw-r--r--app/models/post_redirect.rb7
-rw-r--r--app/models/profile_photo.rb1
-rw-r--r--app/models/public_body.rb520
-rw-r--r--app/models/public_body_category.rb41
-rw-r--r--app/models/public_body_category/category_collection.rb9
-rw-r--r--app/models/public_body_category_link.rb1
-rw-r--r--app/models/public_body_change_request.rb1
-rw-r--r--app/models/public_body_heading.rb39
-rw-r--r--app/models/purge_request.rb1
-rw-r--r--app/models/raw_email.rb1
-rw-r--r--app/models/request_classification.rb3
-rw-r--r--app/models/spam_address.rb1
-rw-r--r--app/models/track_thing.rb1
-rw-r--r--app/models/track_things_sent_email.rb1
-rw-r--r--app/models/user.rb11
-rw-r--r--app/models/user_info_request_sent_alert.rb1
-rw-r--r--app/models/widget_vote.rb20
-rw-r--r--app/views/admin_general/index.html.erb99
-rw-r--r--app/views/admin_public_body/edit.html.erb2
-rw-r--r--app/views/comment/_comment_form.html.erb2
-rw-r--r--app/views/comment/_single_comment.html.erb2
-rw-r--r--app/views/general/_responsive_topnav.html.erb13
-rw-r--r--app/views/help/unhappy.html.erb5
-rw-r--r--app/views/layouts/default.html.erb2
-rw-r--r--app/views/public_body/show.html.erb93
-rw-r--r--app/views/public_body_change_requests/new.html.erb2
-rw-r--r--app/views/request/_act.html.erb5
-rw-r--r--app/views/request/_followup.html.erb2
-rw-r--r--app/views/request/_incoming_correspondence.html.erb2
-rw-r--r--app/views/request/_outgoing_correspondence.html.erb2
-rw-r--r--app/views/request/_request_listing_via_event.html.erb4
-rw-r--r--app/views/request/_request_search_form.html.erb44
-rw-r--r--app/views/request/_resent_outgoing_correspondence.html.erb2
-rw-r--r--app/views/request/new.html.erb4
-rw-r--r--app/views/request/new_bad_contact.html.erb2
-rw-r--r--app/views/request/select_authorities.html.erb2
-rw-r--r--app/views/request/show.html.erb4
-rw-r--r--app/views/request_game/play.html.erb7
-rw-r--r--app/views/track/_tracking_links.html.erb34
-rw-r--r--app/views/user/_user_listing_single.html.erb2
-rw-r--r--app/views/user/set_crop_profile_photo.html.erb2
-rw-r--r--app/views/user/show.html.erb4
-rw-r--r--app/views/widgets/new.html.erb15
-rw-r--r--app/views/widgets/show.html.erb48
m---------commonlib0
-rw-r--r--config/.cvsignore3
-rwxr-xr-xconfig/alert-tracks-debian.example (renamed from config/alert-tracks-debian.ugly)6
-rw-r--r--config/application.rb14
-rw-r--r--config/boot.rb1
-rw-r--r--config/crontab-example8
-rw-r--r--config/deploy.rb3
-rw-r--r--config/environment.rb1
-rw-r--r--config/environments/development.rb9
-rw-r--r--config/environments/production.rb16
-rw-r--r--config/environments/staging.rb1
-rw-r--r--config/environments/test.rb1
-rw-r--r--config/general.yml-example43
-rw-r--r--config/httpd.conf-example4
-rw-r--r--config/initializers/acts_as_xapian.rb1
-rw-r--r--config/initializers/alaveteli.rb2
-rw-r--r--config/initializers/backtrace_silencers.rb1
-rw-r--r--config/initializers/fast_gettext.rb1
-rw-r--r--config/initializers/gettext_i18n_rails.rb1
-rw-r--r--config/initializers/has_tag_string.rb1
-rw-r--r--config/initializers/health_checks.rb1
-rw-r--r--config/initializers/inflections.rb1
-rw-r--r--config/initializers/mime_types.rb1
-rw-r--r--config/initializers/secret_token.rb1
-rw-r--r--config/initializers/secure_headers.rb1
-rw-r--r--config/initializers/session_store.rb1
-rw-r--r--config/initializers/strip_attributes.rb1
-rw-r--r--config/initializers/theme_loader.rb1
-rw-r--r--config/initializers/xml.rb2
-rw-r--r--config/packages1
-rw-r--r--config/packages.debian-squeeze1
-rw-r--r--config/packages.debian-wheezy2
-rw-r--r--config/packages.ubuntu-precise1
-rw-r--r--config/packages_development2
-rw-r--r--config/preinitializer.rb1
-rwxr-xr-xconfig/purge-varnish-debian.example (renamed from config/purge-varnish-debian.ugly)6
-rw-r--r--config/routes.rb4
-rw-r--r--config/run-with-rbenv-path.example8
-rwxr-xr-xconfig/sysvinit-passenger.example (renamed from config/sysvinit-passenger.ugly)0
-rwxr-xr-xconfig/sysvinit-thin.example (renamed from config/sysvinit-thin.ugly)0
-rw-r--r--config/varnish-alaveteli.vcl16
-rw-r--r--db/migrate/001_create_users.rb1
-rw-r--r--db/migrate/002_add_sessions.rb1
-rw-r--r--db/migrate/004_create_info_requests.rb1
-rw-r--r--db/migrate/005_create_public_bodies.rb1
-rw-r--r--db/migrate/006_version_public_body.rb1
-rw-r--r--db/migrate/007_add_public_body_editor_notes.rb1
-rw-r--r--db/migrate/008_request_has_public_body.rb1
-rw-r--r--db/migrate/009_create_outgoing_messages.rb1
-rw-r--r--db/migrate/010_remove_public_body_id_from_outgoing_messages.rb1
-rw-r--r--db/migrate/011_add_created_updated_fields.rb1
-rw-r--r--db/migrate/012_add_sent_outgoing_message.rb1
-rw-r--r--db/migrate/013_create_incoming_messages.rb1
-rw-r--r--db/migrate/014_create_post_redirects.rb1
-rw-r--r--db/migrate/015_add_email_token_to_post_redirects.rb1
-rw-r--r--db/migrate/016_add_reasons_to_post_redirects.rb1
-rw-r--r--db/migrate/017_add_email_confirmed_to_users.rb1
-rw-r--r--db/migrate/018_add_response_type_to_incoming_message.rb1
-rw-r--r--db/migrate/021_remove_contains_information_default.rb1
-rw-r--r--db/migrate/022_create_info_request_events.rb1
-rw-r--r--db/migrate/023_outgoing_message_last_sent_at.rb1
-rw-r--r--db/migrate/024_add_is_bounce_to_incoming_messages.rb1
-rw-r--r--db/migrate/025_add_followup_to_outgoing_message.rb1
-rw-r--r--db/migrate/026_add_many_null_constraints.rb1
-rw-r--r--db/migrate/027_change_classification_system.rb1
-rw-r--r--db/migrate/028_give_incoming_messages_events.rb1
-rw-r--r--db/migrate/029_add_describe_status_history.rb1
-rw-r--r--db/migrate/030_add_some_indices.rb1
-rw-r--r--db/migrate/031_add_indices_for_session_deletion.rb1
-rw-r--r--db/migrate/032_addforeignkeys.rb1
-rw-r--r--db/migrate/033_add_prominence.rb1
-rw-r--r--db/migrate/034_run_solr_indexing.rb1
-rw-r--r--db/migrate/035_track_overdue_alerts.rb1
-rw-r--r--db/migrate/036_add_public_body_tags.rb1
-rw-r--r--db/migrate/037_add_url_name.rb1
-rw-r--r--db/migrate/038_add_more_url_names.rb1
-rw-r--r--db/migrate/039_request_url_names.rb1
-rw-r--r--db/migrate/040_email_is_unique.rb1
-rw-r--r--db/migrate/041_index_requests_with_solr.rb1
-rw-r--r--db/migrate/042_unique_user_urls.rb1
-rw-r--r--db/migrate/043_remove_complaint_email.rb1
-rw-r--r--db/migrate/044_remove_is_bounce.rb1
-rw-r--r--db/migrate/045_add_circumstance_to_post_redirect.rb1
-rw-r--r--db/migrate/046_add_last_event_id_to_alert_table.rb1
-rw-r--r--db/migrate/047_add_calculated_state.rb1
-rw-r--r--db/migrate/048_add_calculated_state_at.rb1
-rw-r--r--db/migrate/049_track_things.rb1
-rw-r--r--db/migrate/050_improve_track_things.rb1
-rw-r--r--db/migrate/051_add_track_things_unique_indices.rb1
-rw-r--r--db/migrate/052_include_event_foreign_references.rb1
-rw-r--r--db/migrate/053_acts_as_xapian_migration.rb1
-rw-r--r--db/migrate/054_allow_longer_comments.rb1
-rw-r--r--db/migrate/055_stop_new_responses.rb1
-rw-r--r--db/migrate/056_add_attachment_text.rb1
-rw-r--r--db/migrate/057_add_law_used.rb1
-rw-r--r--db/migrate/058_remove_sessions.rb1
-rw-r--r--db/migrate/059_add_url_notes.rb1
-rw-r--r--db/migrate/060_add_cached_main_text.rb1
-rw-r--r--db/migrate/061_include_responses_in_tracks.rb1
-rw-r--r--db/migrate/062_add_comments.rb1
-rw-r--r--db/migrate/063_add_admin_users.rb1
-rw-r--r--db/migrate/064_indices_for_annotations.rb1
-rw-r--r--db/migrate/065_add_comments_to_user_track.rb1
-rw-r--r--db/migrate/066_add_first_letter.rb1
-rw-r--r--db/migrate/067_factor_out_raw_email.rb1
-rw-r--r--db/migrate/068_add_censor_table.rb1
-rw-r--r--db/migrate/069_add_what_doing.rb1
-rw-r--r--db/migrate/070_sent_are_waiting_response.rb1
-rw-r--r--db/migrate/071_add_exim_log.rb1
-rw-r--r--db/migrate/072_add_publication_scheme.rb1
-rw-r--r--db/migrate/073_add_ban_user.rb1
-rw-r--r--db/migrate/074_create_holidays.rb1
-rw-r--r--db/migrate/075_add_charity_number.rb1
-rw-r--r--db/migrate/076_add_indices.rb1
-rw-r--r--db/migrate/077_add_exim_log_index.rb1
-rw-r--r--db/migrate/078_expand_stop_new_responses.rb1
-rw-r--r--db/migrate/079_add_profile_photo.rb1
-rw-r--r--db/migrate/080_cache_only_clipped_attachment_text.rb1
-rw-r--r--db/migrate/081_add_event_prominence.rb1
-rw-r--r--db/migrate/082_change_raw_email_to_binary.rb1
-rw-r--r--db/migrate/083_add_indices_track_sent.rb1
-rw-r--r--db/migrate/084_alter_profile_photo.rb1
-rw-r--r--db/migrate/085_draft_profile_photo.rb1
-rw-r--r--db/migrate/086_allow_null_profile_photo_user.rb1
-rw-r--r--db/migrate/087_add_about_me.rb1
-rw-r--r--db/migrate/088_public_body_machine_tags.rb1
-rw-r--r--db/migrate/089_remove_charity_number.rb1
-rw-r--r--db/migrate/090_remove_tag_uniqueness.rb1
-rw-r--r--db/migrate/091_add_censor_rules_indices.rb1
-rw-r--r--db/migrate/092_cache_only_marked_body_text.rb1
-rw-r--r--db/migrate/093_move_to_has_tag_string.rb1
-rw-r--r--db/migrate/094_remove_old_tags_foreign_key.rb1
-rw-r--r--db/migrate/095_add_post_redirect_user_index.rb1
-rw-r--r--db/migrate/096_create_translation_tables.rb1
-rw-r--r--db/migrate/097_add_comment_locale.rb1
-rw-r--r--db/migrate/098_fix_public_body_translations.rb1
-rw-r--r--db/migrate/099_move_raw_email_to_filesystem.rb1
-rw-r--r--db/migrate/100_remove_redundant_raw_email_columns.rb1
-rw-r--r--db/migrate/101_add_hash_to_info_request.rb1
-rw-r--r--db/migrate/102_add_locale_to_users.rb1
-rw-r--r--db/migrate/103_add_user_bounce_columns.rb1
-rw-r--r--db/migrate/104_create_foi_attachments.rb1
-rw-r--r--db/migrate/105_extend_incoming_message.rb1
-rw-r--r--db/migrate/106_add_hex_digest_to_foi_attachment.rb1
-rw-r--r--db/migrate/107_add_date_parsed_field_to_incoming_message.rb1
-rw-r--r--db/migrate/108_change_safe_mail_from_to_mail_from.rb1
-rw-r--r--db/migrate/109_change_sent_at_to_datetime.rb1
-rw-r--r--db/migrate/110_add_user_no_limit.rb1
-rw-r--r--db/migrate/111_create_purge_requests.rb1
-rw-r--r--db/migrate/112_add_api_key_to_public_bodies.rb1
-rw-r--r--db/migrate/113_add_external_fields_to_info_requests.rb1
-rw-r--r--db/migrate/114_add_attention_requested_flag_to_info_requests.rb1
-rw-r--r--db/migrate/115_add_receive_email_alerts_to_user.rb1
-rw-r--r--db/migrate/116_add_censor_rule_regexp.rb1
-rw-r--r--db/migrate/117_create_sessions.rb1
-rw-r--r--db/migrate/118_remove_sessions_again.rb1
-rw-r--r--db/migrate/20120822145640_correct_external_request_constraint.rb1
-rw-r--r--db/migrate/20120910153022_create_request_classifications.rb1
-rw-r--r--db/migrate/20120912111713_add_raw_email_index_to_incoming_messages.rb1
-rw-r--r--db/migrate/20120912112036_add_info_request_id_index_to_exim_logs.rb1
-rw-r--r--db/migrate/20120912112312_add_info_request_id_index_to_incoming_and_outgoing_messages.rb1
-rw-r--r--db/migrate/20120912112655_add_incoming_message_id_index_to_foi_attachments.rb1
-rw-r--r--db/migrate/20120912113004_add_indexes_to_info_request_events.rb1
-rw-r--r--db/migrate/20120912113720_add_public_body_index_to_info_requests.rb1
-rw-r--r--db/migrate/20120912114022_add_user_index_to_info_requests.rb1
-rw-r--r--db/migrate/20120912170035_add_info_requests_count_to_public_bodies.rb1
-rw-r--r--db/migrate/20120913074940_add_incoming_message_index_to_outgoing_messages.rb1
-rw-r--r--db/migrate/20120913080807_add_info_request_event_index_to_track_things_sent_emails.rb1
-rw-r--r--db/migrate/20120913081136_add_info_request_event_index_to_user_info_request_sent_alerts.rb1
-rw-r--r--db/migrate/20120913135745_add_updated_at_index_to_public_body_versions.rb1
-rw-r--r--db/migrate/20120919140404_add_comments_allowed_to_info_request.rb1
-rw-r--r--db/migrate/20121010214348_rename_exim_log_tables.rb1
-rw-r--r--db/migrate/20121022031914_add_disclosure_log.rb1
-rw-r--r--db/migrate/20130731142632_remove_prominence_from_info_request_event.rb1
-rw-r--r--db/migrate/20130731145325_add_prominence_to_incoming_message.rb1
-rw-r--r--db/migrate/20130801154033_add_prominence_reason_to_incoming_message.rb1
-rw-r--r--db/migrate/20130816150110_add_statistics_to_public_body.rb1
-rw-r--r--db/migrate/20130822161803_add_prominence_fields_to_outgoing_message.rb1
-rw-r--r--db/migrate/20130919151140_add_can_make_batch_requests_to_user.rb1
-rw-r--r--db/migrate/20131024114346_create_info_request_batches.rb1
-rw-r--r--db/migrate/20131024152540_add_body_to_info_request_batches.rb1
-rw-r--r--db/migrate/20131101155844_add_stats_denominator.rb1
-rw-r--r--db/migrate/20131127105438_create_info_request_batch_public_bodies_join_table.rb1
-rw-r--r--db/migrate/20131127135622_add_sent_at_to_info_request_batch.rb1
-rw-r--r--db/migrate/20131211152641_create_public_body_change_requests.rb1
-rw-r--r--db/migrate/20140325120619_create_spam_addresses.rb1
-rw-r--r--db/migrate/20140408145616_add_default_short_name_to_public_bodies.rb1
-rw-r--r--db/migrate/20140528110536_update_track_things_index.rb1
-rw-r--r--db/migrate/20140710094405_create_public_body_headings_and_categories.rb3
-rw-r--r--db/migrate/20140716131107_create_category_translation_tables.rb1
-rw-r--r--db/migrate/20140801132719_add_index_to_info_request_events.rb1
-rw-r--r--db/migrate/20140804120601_add_display_order_to_categories_and_headings.rb1
-rw-r--r--db/migrate/20140824191444_create_widget_votes.rb12
-rw-r--r--db/seeds.rb1
-rw-r--r--doc/CHANGES.md132
-rw-r--r--lib/ability.rb1
-rw-r--r--lib/activerecord_errors_extensions.rb1
-rw-r--r--lib/activesupport_cache_extensions.rb1
-rw-r--r--lib/acts_as_xapian/acts_as_xapian.rb229
-rw-r--r--lib/acts_as_xapian/tasks/xapian.rake2
-rw-r--r--lib/alaveteli_external_command.rb1
-rw-r--r--lib/alaveteli_file_types.rb3
-rw-r--r--lib/alaveteli_localization.rb1
-rw-r--r--lib/alaveteli_text_masker.rb57
-rw-r--r--lib/attachment_to_html/adapter.rb67
-rw-r--r--lib/attachment_to_html/adapters/could_not_convert.rb44
-rw-r--r--lib/attachment_to_html/adapters/google_docs_viewer.rb39
-rw-r--r--lib/attachment_to_html/adapters/pdf.rb51
-rw-r--r--lib/attachment_to_html/adapters/rtf.rb51
-rw-r--r--lib/attachment_to_html/adapters/text.rb42
-rw-r--r--lib/attachment_to_html/attachment_to_html.rb3
-rw-r--r--lib/attachment_to_html/view.rb1
-rw-r--r--lib/confidence_intervals.rb1
-rw-r--r--lib/configuration.rb19
-rw-r--r--lib/date_quarter.rb1
-rw-r--r--lib/generators/acts_as_xapian/acts_as_xapian_generator.rb1
-rw-r--r--lib/generators/acts_as_xapian/templates/migration.rb1
-rw-r--r--lib/has_tag_string/has_tag_string.rb5
-rw-r--r--lib/health_checks/checks/days_ago_check.rb3
-rw-r--r--lib/health_checks/health_checkable.rb7
-rw-r--r--lib/health_checks/health_checks.rb3
-rw-r--r--lib/i18n_fixes.rb1
-rw-r--r--lib/languages.rb4
-rw-r--r--lib/mail_handler/backends/mail_backend.rb10
-rw-r--r--lib/mail_handler/backends/mail_extensions.rb9
-rw-r--r--lib/mail_handler/mail_handler.rb3
-rw-r--r--lib/memory_profiler.rb1
-rw-r--r--lib/message_prominence.rb1
-rw-r--r--lib/no_constraint_disabling.rb1
-rw-r--r--lib/normalize_string.rb24
-rw-r--r--lib/public_body_csv.rb1
-rw-r--r--lib/quiet_opener.rb1
-rw-r--r--lib/routing_filters.rb1
-rw-r--r--lib/ruby19.rb8
-rw-r--r--lib/strip_attributes/strip_attributes.rb1
-rw-r--r--lib/strip_attributes/test/strip_attributes_test.rb1
-rw-r--r--lib/strip_attributes/test/test_helper.rb3
-rw-r--r--lib/tasks/config_files.rake26
-rw-r--r--lib/tasks/temp.rake96
-rw-r--r--lib/tasks/usage.rb3
-rw-r--r--lib/theme.rb1
-rw-r--r--lib/use_spans_for_errors.rb1
-rw-r--r--lib/whatdotheyknow/strip_empty_sessions.rb1
-rw-r--r--lib/world_foi_websites.rb7
-rw-r--r--lib/xapian_queries.rb5
-rw-r--r--locale/aln/app.po94
-rw-r--r--locale/app.pot90
-rw-r--r--locale/ar/app.po98
-rw-r--r--locale/bg/app.po96
-rw-r--r--locale/bs/app.po97
-rw-r--r--locale/ca/app.po96
-rw-r--r--locale/cs/app.po97
-rw-r--r--locale/cy/app.po98
-rw-r--r--locale/de/app.po96
-rw-r--r--locale/en/app.po90
-rw-r--r--locale/en_IE/app.po94
-rw-r--r--locale/en_RW/app.po72
-rw-r--r--locale/en_UG/app.po78
-rw-r--r--locale/es/app.po96
-rw-r--r--locale/es_NI/app.po96
-rw-r--r--locale/es_PA/app.po96
-rw-r--r--locale/eu/app.po96
-rw-r--r--locale/fi/app.po94
-rw-r--r--locale/fr/app.po96
-rw-r--r--locale/fr_CA/app.po96
-rw-r--r--locale/ga_IE/app.po97
-rw-r--r--locale/gl/app.po96
-rw-r--r--locale/he_IL/app.po96
-rw-r--r--locale/hr/app.po97
-rw-r--r--locale/hu_HU/app.po96
-rw-r--r--locale/id/app.po95
-rw-r--r--locale/is_IS/app.po94
-rw-r--r--locale/it/app.po96
-rw-r--r--locale/mk_MK/app.po96
-rw-r--r--locale/model_attributes.rb2
-rw-r--r--locale/nb/app.po98
-rw-r--r--locale/nl/app.po94
-rw-r--r--locale/nn/app.po96
-rw-r--r--locale/pl/app.po95
-rw-r--r--locale/pt_BR/app.po96
-rw-r--r--locale/pt_PT/app.po96
-rw-r--r--locale/ro_RO/app.po97
-rw-r--r--locale/rw/app.po96
-rw-r--r--locale/se/app.po94
-rw-r--r--locale/sl/app.po98
-rw-r--r--locale/sq/app.po96
-rw-r--r--locale/sr@latin/app.po97
-rw-r--r--locale/sv/app.po94
-rw-r--r--locale/sw_KE/app.po94
-rw-r--r--locale/tr/app.po94
-rw-r--r--locale/uk/app.po97
-rw-r--r--locale/vi/app.po93
-rw-r--r--locale/zh_HK/app.po96
-rw-r--r--public/.cvsignore5
-rwxr-xr-xscript/handle-mail-replies.rb2
-rwxr-xr-xscript/mailin2
-rwxr-xr-xscript/request-creation-graph12
-rwxr-xr-xscript/site-specific-install.sh7
-rwxr-xr-xscript/switch-theme.rb4
-rwxr-xr-xscript/user-use-graph6
-rw-r--r--spec/controllers/admin_censor_rule_controller_spec.rb3
-rw-r--r--spec/controllers/admin_comment_controller_spec.rb1
-rw-r--r--spec/controllers/admin_general_controller_spec.rb1
-rw-r--r--spec/controllers/admin_holiday_imports_controller_spec.rb1
-rw-r--r--spec/controllers/admin_holidays_controller_spec.rb1
-rw-r--r--spec/controllers/admin_incoming_message_controller_spec.rb1
-rw-r--r--spec/controllers/admin_info_request_event_controller_spec.rb2
-rw-r--r--spec/controllers/admin_outgoing_message_controller_spec.rb1
-rw-r--r--spec/controllers/admin_public_body_categories_controller_spec.rb3
-rw-r--r--spec/controllers/admin_public_body_change_requests_controller_spec.rb2
-rw-r--r--spec/controllers/admin_public_body_controller_spec.rb16
-rw-r--r--spec/controllers/admin_public_body_headings_controller_spec.rb1
-rw-r--r--spec/controllers/admin_raw_email_controller_spec.rb1
-rw-r--r--spec/controllers/admin_request_controller_spec.rb1
-rw-r--r--spec/controllers/admin_spam_addresses_controller_spec.rb1
-rw-r--r--spec/controllers/admin_track_controller_spec.rb1
-rw-r--r--spec/controllers/admin_user_controller_spec.rb1
-rw-r--r--spec/controllers/api_controller_spec.rb2
-rw-r--r--spec/controllers/comment_controller_spec.rb1
-rw-r--r--spec/controllers/general_controller_spec.rb5
-rw-r--r--spec/controllers/health_checks_controller_spec.rb1
-rw-r--r--spec/controllers/help_controller_spec.rb2
-rw-r--r--spec/controllers/info_request_batch_controller_spec.rb2
-rw-r--r--spec/controllers/public_body_change_requests_controller_spec.rb2
-rw-r--r--spec/controllers/public_body_controller_spec.rb4
-rw-r--r--spec/controllers/reports_controller_spec.rb1
-rw-r--r--spec/controllers/request_controller_spec.rb49
-rw-r--r--spec/controllers/request_game_controller_spec.rb1
-rw-r--r--spec/controllers/services_controller_spec.rb12
-rw-r--r--spec/controllers/track_controller_spec.rb1
-rw-r--r--spec/controllers/user_controller_spec.rb6
-rw-r--r--spec/controllers/widgets_controller_spec.rb181
-rw-r--r--spec/factories/censor_rules.rb1
-rw-r--r--spec/factories/comments.rb1
-rw-r--r--spec/factories/foi_attchments.rb1
-rw-r--r--spec/factories/holidays.rb1
-rw-r--r--spec/factories/incoming_messages.rb1
-rw-r--r--spec/factories/info_request_batches.rb1
-rw-r--r--spec/factories/info_request_events.rb1
-rw-r--r--spec/factories/info_requests.rb3
-rw-r--r--spec/factories/outgoing_messages.rb1
-rw-r--r--spec/factories/public_bodies.rb1
-rw-r--r--spec/factories/public_body_categories.rb1
-rw-r--r--spec/factories/public_body_category_links.rb1
-rw-r--r--spec/factories/public_body_change_requests.rb1
-rw-r--r--spec/factories/public_body_headings.rb1
-rw-r--r--spec/factories/raw_emails.rb1
-rw-r--r--spec/factories/spam_addresses.rb1
-rw-r--r--spec/factories/track_things.rb1
-rw-r--r--spec/factories/users.rb1
-rw-r--r--spec/factories/widget_votes.rb8
-rw-r--r--spec/fixtures/files/non-utf8-filename.email52
-rw-r--r--spec/helpers/admin_helper_spec.rb1
-rw-r--r--spec/helpers/application_helper_spec.rb1
-rw-r--r--spec/helpers/date_time_helper_spec.rb1
-rw-r--r--spec/helpers/health_checks_helper_spec.rb6
-rw-r--r--spec/helpers/highlight_helper_spec.rb1
-rw-r--r--spec/helpers/link_to_helper_spec.rb1
-rw-r--r--spec/helpers/public_body_helper_spec.rb2
-rw-r--r--spec/helpers/track_helper_spec.rb1
-rw-r--r--spec/helpers/widget_helper_spec.rb29
-rw-r--r--spec/integration/admin_public_body_category_edit_spec.rb1
-rw-r--r--spec/integration/admin_public_body_edit_spec.rb3
-rw-r--r--spec/integration/admin_public_body_heading_edit_spec.rb1
-rw-r--r--spec/integration/admin_spec.rb1
-rw-r--r--spec/integration/alaveteli_dsl.rb1
-rw-r--r--spec/integration/cookie_stripping_spec.rb1
-rw-r--r--spec/integration/create_request_spec.rb1
-rw-r--r--spec/integration/download_request_spec.rb4
-rw-r--r--spec/integration/errors_spec.rb2
-rw-r--r--spec/integration/ip_spoofing_spec.rb1
-rw-r--r--spec/integration/localisation_spec.rb1
-rw-r--r--spec/integration/parameter_stripping_spec.rb24
-rw-r--r--spec/integration/request_controller_spec.rb2
-rw-r--r--spec/integration/search_request_spec.rb1
-rw-r--r--spec/integration/view_request_spec.rb1
-rw-r--r--spec/integration/xapian_search_highlighting_spec.rb6
-rw-r--r--spec/lib/ability_spec.rb1
-rw-r--r--spec/lib/alaveteli_external_command_spec.rb1
-rw-r--r--spec/lib/alaveteli_text_masker_spec.rb28
-rw-r--r--spec/lib/attachment_to_html/adapters/could_not_convert_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/adapters/google_docs_viewer_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/adapters/pdf_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/adapters/rtf_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/adapters/text_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/attachment_to_html_spec.rb1
-rw-r--r--spec/lib/attachment_to_html/view_spec.rb1
-rw-r--r--spec/lib/basic_encoding_spec.rb65
-rw-r--r--spec/lib/confidence_intervals_spec.rb1
-rw-r--r--spec/lib/date_quarter_spec.rb1
-rw-r--r--spec/lib/health_checks/checks/days_ago_check_spec.rb7
-rw-r--r--spec/lib/health_checks/health_checkable_spec.rb23
-rw-r--r--spec/lib/health_checks/health_checks_spec.rb7
-rw-r--r--spec/lib/i18n_interpolation_spec.rb6
-rw-r--r--spec/lib/languages_spec.rb22
-rw-r--r--spec/lib/mail_handler/backends/mail_backend_spec.rb11
-rw-r--r--spec/lib/mail_handler/mail_handler_spec.rb6
-rw-r--r--spec/lib/public_body_csv_spec.rb1
-rw-r--r--spec/lib/theme_spec.rb1
-rw-r--r--spec/lib/timezone_fixes_spec.rb1
-rw-r--r--spec/lib/whatdotheyknow/strip_empty_sessions_spec.rb1
-rw-r--r--spec/mailers/application_mailer_spec.rb3
-rw-r--r--spec/mailers/contact_mailer_spec.rb18
-rw-r--r--spec/mailers/info_request_batch_mailer_spec.rb1
-rw-r--r--spec/mailers/outgoing_mailer_spec.rb1
-rw-r--r--spec/mailers/request_mailer_spec.rb50
-rw-r--r--spec/mailers/track_mailer_spec.rb1
-rw-r--r--spec/models/about_me_validator_spec.rb1
-rw-r--r--spec/models/censor_rule_spec.rb95
-rw-r--r--spec/models/change_email_validator_spec.rb1
-rw-r--r--spec/models/contact_validator_spec.rb1
-rw-r--r--spec/models/customstates.rb1
-rw-r--r--spec/models/foi_attachment_spec.rb151
-rw-r--r--spec/models/has_tag_string_tag_spec.rb1
-rw-r--r--spec/models/holiday_import_spec.rb1
-rw-r--r--spec/models/holiday_spec.rb1
-rw-r--r--spec/models/incoming_message_spec.rb26
-rw-r--r--spec/models/info_request_batch_spec.rb3
-rw-r--r--spec/models/info_request_event_spec.rb11
-rw-r--r--spec/models/info_request_spec.rb160
-rw-r--r--spec/models/mail_server_log_spec.rb1
-rw-r--r--spec/models/outgoing_message_spec.rb112
-rw-r--r--spec/models/post_redirect_spec.rb10
-rw-r--r--spec/models/profile_photo_spec.rb1
-rw-r--r--spec/models/public_body_category/category_collection_spec.rb15
-rw-r--r--spec/models/public_body_category_link_spec.rb1
-rw-r--r--spec/models/public_body_category_spec.rb1
-rw-r--r--spec/models/public_body_change_request_spec.rb3
-rw-r--r--spec/models/public_body_heading_spec.rb1
-rw-r--r--spec/models/public_body_spec.rb92
-rw-r--r--spec/models/purge_request_spec.rb19
-rw-r--r--spec/models/spam_address_spec.rb3
-rw-r--r--spec/models/track_thing_spec.rb1
-rw-r--r--spec/models/track_things_sent_email_spec.rb1
-rw-r--r--spec/models/user_info_request_sent_alert_spec.rb1
-rw-r--r--spec/models/user_spec.rb1
-rw-r--r--spec/models/widget_vote_spec.rb54
-rw-r--r--spec/models/xapian_spec.rb4
-rw-r--r--spec/script/handle-mail-replies_spec.rb1
-rw-r--r--spec/script/mailin_spec.rb1
-rw-r--r--spec/spec_helper.rb8
-rw-r--r--spec/support/email_helpers.rb1
-rw-r--r--spec/support/load_file_fixtures.rb1
-rw-r--r--spec/support/xapian_index.rb3
-rw-r--r--spec/views/public_body/show.html.erb_spec.rb6
-rw-r--r--spec/views/reports/new.erb_spec.rb1
-rw-r--r--spec/views/request/_after_actions.html.erb_spec.rb1
-rw-r--r--spec/views/request/_describe_state.html.erb_spec.rb1
-rw-r--r--spec/views/request/show.html.erb_spec.rb1
-rw-r--r--spec/views/request_game/play.html.erb_spec.rb1
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
diff --git a/Gemfile b/Gemfile
index eca861681..9a88e70cb 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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)
diff --git a/README.md b/README.md
index de025dcb2..a3cb61a93 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Welcome to Alaveteli!
-[![Build Status](https://secure.travis-ci.org/mysociety/alaveteli.png)](http://travis-ci.org/mysociety/alaveteli) [![Dependency Status](https://gemnasium.com/mysociety/alaveteli.png)](https://gemnasium.com/mysociety/alaveteli) [![Coverage Status](https://coveralls.io/repos/mysociety/alaveteli/badge.png?branch=rails-3-develop)](https://coveralls.io/r/mysociety/alaveteli) [![Code Climate](https://codeclimate.com/github/mysociety/alaveteli.png)](https://codeclimate.com/github/mysociety/alaveteli)
+[![Build Status](https://secure.travis-ci.org/mysociety/alaveteli.png)](http://travis-ci.org/mysociety/alaveteli) [![Dependency Status](https://gemnasium.com/mysociety/alaveteli.png)](https://gemnasium.com/mysociety/alaveteli) [![Coverage Status](https://coveralls.io/repos/mysociety/alaveteli/badge.png?branch=develop)](https://coveralls.io/r/mysociety/alaveteli) [![Code Climate](https://codeclimate.com/github/mysociety/alaveteli.png)](https://codeclimate.com/github/mysociety/alaveteli)
[![Installability: Gold](http://img.shields.io/badge/installability-gold-ffd700.svg "Installability: Gold")](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
index a239862e1..a23916e9c 100644
--- a/app/assets/images/icon_application_octet-stream_large.png
+++ b/app/assets/images/icon_application_octet-stream_large.png
Binary files differ
diff --git a/app/assets/images/icon_application_pdf_large.png b/app/assets/images/icon_application_pdf_large.png
index 9a38ca33c..990b96c0a 100644
--- a/app/assets/images/icon_application_pdf_large.png
+++ b/app/assets/images/icon_application_pdf_large.png
Binary files differ
diff --git a/app/assets/images/icon_application_rtf_large.png b/app/assets/images/icon_application_rtf_large.png
index 2ad990608..977972124 100644
--- a/app/assets/images/icon_application_rtf_large.png
+++ b/app/assets/images/icon_application_rtf_large.png
Binary files differ
diff --git a/app/assets/images/icon_application_vnd.ms-excel_large.png b/app/assets/images/icon_application_vnd.ms-excel_large.png
index 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
Binary files differ
diff --git a/app/assets/images/icon_application_vnd.ms-powerpoint_large.png b/app/assets/images/icon_application_vnd.ms-powerpoint_large.png
index 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
Binary files differ
diff --git a/app/assets/images/icon_application_vnd.ms-word_large.png b/app/assets/images/icon_application_vnd.ms-word_large.png
index 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
Binary files differ
diff --git a/app/assets/images/icon_application_zip_large.png b/app/assets/images/icon_application_zip_large.png
index 0a14e978e..c52d6d5aa 100644
--- a/app/assets/images/icon_application_zip_large.png
+++ b/app/assets/images/icon_application_zip_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_bmp_large.png b/app/assets/images/icon_image_bmp_large.png
index f6e8dbaed..347bdaaf1 100644..120000
--- a/app/assets/images/icon_image_bmp_large.png
+++ b/app/assets/images/icon_image_bmp_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_gif_large.png b/app/assets/images/icon_image_gif_large.png
index 424d1e0fd..347bdaaf1 100644..120000
--- a/app/assets/images/icon_image_gif_large.png
+++ b/app/assets/images/icon_image_gif_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_img_large.png b/app/assets/images/icon_image_img_large.png
new file mode 100644
index 000000000..e19e7553c
--- /dev/null
+++ b/app/assets/images/icon_image_img_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_jpeg_large.png b/app/assets/images/icon_image_jpeg_large.png
index fd50a889d..347bdaaf1 100644..120000
--- a/app/assets/images/icon_image_jpeg_large.png
+++ b/app/assets/images/icon_image_jpeg_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_png_large.png b/app/assets/images/icon_image_png_large.png
index f16edb08e..347bdaaf1 100644..120000
--- a/app/assets/images/icon_image_png_large.png
+++ b/app/assets/images/icon_image_png_large.png
Binary files differ
diff --git a/app/assets/images/icon_image_tiff_large.png b/app/assets/images/icon_image_tiff_large.png
index 356f63478..000bd0318 100644
--- a/app/assets/images/icon_image_tiff_large.png
+++ b/app/assets/images/icon_image_tiff_large.png
Binary files differ
diff --git a/app/assets/images/icon_message_delivery-status_large.png b/app/assets/images/icon_message_delivery-status_large.png
index a239862e1..dccdbbccd 100644
--- a/app/assets/images/icon_message_delivery-status_large.png
+++ b/app/assets/images/icon_message_delivery-status_large.png
Binary files differ
diff --git a/app/assets/images/icon_text_html_large.png b/app/assets/images/icon_text_html_large.png
index 914502cf4..3813d2582 100644
--- a/app/assets/images/icon_text_html_large.png
+++ b/app/assets/images/icon_text_html_large.png
Binary files differ
diff --git a/app/assets/images/icon_text_plain_large.png b/app/assets/images/icon_text_plain_large.png
index f74a997ba..f15b0dbdc 100644
--- a/app/assets/images/icon_text_plain_large.png
+++ b/app/assets/images/icon_text_plain_large.png
Binary files differ
diff --git a/app/assets/images/icon_text_x-vcard_large.png b/app/assets/images/icon_text_x-vcard_large.png
index cc44d3edc..804066af8 100644
--- a/app/assets/images/icon_text_x-vcard_large.png
+++ b/app/assets/images/icon_text_x-vcard_large.png
Binary files differ
diff --git a/app/assets/images/icon_unknown.png b/app/assets/images/icon_unknown.png
index 992c646c0..9a06d9baa 100644
--- a/app/assets/images/icon_unknown.png
+++ b/app/assets/images/icon_unknown.png
Binary files differ
diff --git a/app/assets/images/widget-base.png b/app/assets/images/widget-base.png
new file mode 100644
index 000000000..872244543
--- /dev/null
+++ b/app/assets/images/widget-base.png
Binary files differ
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}) %>&nbsp;&nbsp;
- <%= 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}) %>&nbsp;&nbsp;
+ <%= 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