From c2c1961bd02edcf1cb91d431a44044eb2e7d2386 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 31 May 2013 18:42:28 +0200 Subject: [PATCH 01/14] adds i18n support to routes and application controller; default_locale is set to :en --- app/controllers/application_controller.rb | 13 +- config/application.rb | 2 +- config/routes.rb | 356 +++++++++++----------- lib/foodsoft/controller_extensions.rb | 52 ++++ 4 files changed, 239 insertions(+), 184 deletions(-) create mode 100644 lib/foodsoft/controller_extensions.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 29b752a0..96b2e510 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,10 +1,13 @@ # encoding: utf-8 class ApplicationController < ActionController::Base + include Foodsoft::ControllerExtensions::Locale + helper_method :available_locales protect_from_forgery - before_filter :select_language, :select_foodcoop, :authenticate, :store_controller, :items_per_page, :set_redirect_to + before_filter :select_foodcoop, :authenticate, :store_controller, :items_per_page, :set_redirect_to after_filter :remove_controller + # Returns the controller handling the current request. def self.current Thread.current[:application_controller] @@ -26,7 +29,7 @@ class ApplicationController < ActionController::Base redirect_to login_url, :alert => 'Access denied!' end - private + private def authenticate(role = 'any') # Attempt to retrieve authenticated user from controller instance or session... @@ -141,9 +144,5 @@ class ApplicationController < ActionController::Base def default_url_options(options = {}) {foodcoop: FoodsoftConfig.scope} end - - # Used to prevent accidently switching to :en in production mode. - def select_language - I18n.locale = :de - end + end diff --git a/config/application.rb b/config/application.rb index 32ea295b..6d519277 100644 --- a/config/application.rb +++ b/config/application.rb @@ -31,7 +31,7 @@ module Foodsoft # Internationalization. config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] - config.i18n.default_locale = :de + config.i18n.default_locale = :en # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" diff --git a/config/routes.rb b/config/routes.rb index cbcf2828..b4e8ab4b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,183 +8,187 @@ Foodsoft::Application.routes.draw do root :to => redirect("/#{FoodsoftConfig.scope}") - scope '/:foodcoop' do - - # Root path - root :to => 'home#index' - - ########### Sessions - - match '/login' => 'sessions#new', :as => 'login' - match '/logout' => 'sessions#destroy', :as => 'logout' - get '/login/forgot_password' => 'login#forgot_password', as: :forgot_password - get '/login/new_password' => 'login#new_password', as: :new_password - match '/login/accept_invitation/:token' => 'login#accept_invitation', as: :accept_invitation - resources :sessions, :only => [:new, :create, :destroy] - - ########### User specific - - match '/home/profile' => 'home#profile', :as => 'my_profile' - match '/home/ordergroup' => 'home#ordergroup', :as => 'my_ordergroup' - match '/home/cancel_membership' => 'home#cancel_membership', :as => 'cancel_membership' - - ############ Wiki - - resources :pages do - get :all, :on => :collection - get :version, :on => :member - get :revert, :on => :member - end - match '/wiki/:permalink' => 'pages#show', :as => 'wiki_page' # , :constraints => {:permalink => /[^\s]+/} - match '/wiki' => 'pages#show', :defaults => {:permalink => 'Home'}, :as => 'wiki' - - ############ Orders, ordering - - resources :orders do - member do - post :finish - post :add_comment - end - end - - resources :group_orders do - get :archive, :on => :collection - end - - resources :order_comments, :only => [:new, :create] - - ############ Foodcoop orga - - resources :invites, :only => [:new, :create] - - resources :tasks do - collection do - get :user - get :archive - get :workgroup - end - member do - post :accept - post :reject - post :set_done - end - end - - resources :messages, :only => [:index, :show, :new, :create] - - namespace :foodcoop do - root :to => 'users#index' - - resources :users, :only => [:index] - - resources :ordergroups, :only => [:index] - - resources :workgroups, :only => [:index, :edit, :update] - end - - ########### Article management - - resources :stock_takings do - collection do - get :fill_new_stock_article_form - post :add_stock_article - end - end - - resources :stock_articles, :to => 'stockit' do - collection do - get :articles_search - get :fill_new_stock_article_form - end - end - - resources :suppliers do - get :shared_suppliers, :on => :collection - - resources :deliveries do - post :drop_stock_change, :on => :member - post :add_stock_article, :on => :collection - end - - resources :articles do - collection do - post :update_selected - get :edit_all - post :update_all - get :upload - post :parse_upload - post :create_from_upload - get :shared - get :import - post :sync - post :update_synchronized + constraints(locale: /[a-z]{2}/) do + scope "(:locale)" do + scope '/:foodcoop' do + + # Root path + root :to => 'home#index' + + ########### Sessions + + match '/login' => 'sessions#new', :as => 'login' + match '/logout' => 'sessions#destroy', :as => 'logout' + get '/login/forgot_password' => 'login#forgot_password', as: :forgot_password + get '/login/new_password' => 'login#new_password', as: :new_password + match '/login/accept_invitation/:token' => 'login#accept_invitation', as: :accept_invitation + resources :sessions, :only => [:new, :create, :destroy] + + ########### User specific + + match '/home/profile' => 'home#profile', :as => 'my_profile' + match '/home/ordergroup' => 'home#ordergroup', :as => 'my_ordergroup' + match '/home/cancel_membership' => 'home#cancel_membership', :as => 'cancel_membership' + + ############ Wiki + + resources :pages do + get :all, :on => :collection + get :version, :on => :member + get :revert, :on => :member end - end - end - - resources :article_categories - - ########### Finance - - namespace :finance do - root :to => 'base#index' - - resources :order, controller: 'balancing', path: 'balancing' do - member do - get :update_summary - get :edit_note - put :update_note - - get :confirm - put :close - put :close_direct + match '/wiki/:permalink' => 'pages#show', :as => 'wiki_page' # , :constraints => {:permalink => /[^\s]+/} + match '/wiki' => 'pages#show', :defaults => {:permalink => 'Home'}, :as => 'wiki' + + ############ Orders, ordering + + resources :orders do + member do + post :finish + post :add_comment + end end - - resources :order_articles - end - - resources :group_order_articles do - member do - put :update_result + + resources :group_orders do + get :archive, :on => :collection end - end - - resources :invoices - - resources :ordergroups, :only => [:index] do - resources :financial_transactions, :as => :transactions - end - - get 'transactions/new_collection' => 'financial_transactions#new_collection', :as => 'new_transaction_collection' - post 'transactions/create_collection' => 'financial_transactions#create_collection', :as => 'create_transaction_collection' - end - - ########### Administration - - namespace :admin do - root :to => 'base#index' - - resources :users - - resources :workgroups do - get :memberships, :on => :member - end - - resources :ordergroups do - get :memberships, :on => :member - end - end - - ############## Feedback - - resource :feedback, :only => [:new, :create], :controller => 'feedback' - - ############## The rest - - resources :users, :only => [:index] - - # TODO: This is very error prone. Better deactivate this catch all route - match ':controller(/:action(/:id))(.:format)' - - end # End of /:foodcoop scope + + resources :order_comments, :only => [:new, :create] + + ############ Foodcoop orga + + resources :invites, :only => [:new, :create] + + resources :tasks do + collection do + get :user + get :archive + get :workgroup + end + member do + post :accept + post :reject + post :set_done + end + end + + resources :messages, :only => [:index, :show, :new, :create] + + namespace :foodcoop do + root :to => 'users#index' + + resources :users, :only => [:index] + + resources :ordergroups, :only => [:index] + + resources :workgroups, :only => [:index, :edit, :update] + end + + ########### Article management + + resources :stock_takings do + collection do + get :fill_new_stock_article_form + post :add_stock_article + end + end + + resources :stock_articles, :to => 'stockit' do + collection do + get :articles_search + get :fill_new_stock_article_form + end + end + + resources :suppliers do + get :shared_suppliers, :on => :collection + + resources :deliveries do + post :drop_stock_change, :on => :member + post :add_stock_article, :on => :collection + end + + resources :articles do + collection do + post :update_selected + get :edit_all + post :update_all + get :upload + post :parse_upload + post :create_from_upload + get :shared + get :import + post :sync + post :update_synchronized + end + end + end + + resources :article_categories + + ########### Finance + + namespace :finance do + root :to => 'base#index' + + resources :order, controller: 'balancing', path: 'balancing' do + member do + get :update_summary + get :edit_note + put :update_note + + get :confirm + put :close + put :close_direct + end + + resources :order_articles + end + + resources :group_order_articles do + member do + put :update_result + end + end + + resources :invoices + + resources :ordergroups, :only => [:index] do + resources :financial_transactions, :as => :transactions + end + + get 'transactions/new_collection' => 'financial_transactions#new_collection', :as => 'new_transaction_collection' + post 'transactions/create_collection' => 'financial_transactions#create_collection', :as => 'create_transaction_collection' + end + + ########### Administration + + namespace :admin do + root :to => 'base#index' + + resources :users + + resources :workgroups do + get :memberships, :on => :member + end + + resources :ordergroups do + get :memberships, :on => :member + end + end + + ############## Feedback + + resource :feedback, :only => [:new, :create], :controller => 'feedback' + + ############## The rest + + resources :users, :only => [:index] + + # TODO: This is very error prone. Better deactivate this catch all route + match ':controller(/:action(/:id))(.:format)' + + end # End of /:foodcoop scope + end # End of /:locale scope + end # End of :locale constraints end diff --git a/lib/foodsoft/controller_extensions.rb b/lib/foodsoft/controller_extensions.rb new file mode 100644 index 00000000..fe8c940f --- /dev/null +++ b/lib/foodsoft/controller_extensions.rb @@ -0,0 +1,52 @@ +# -*- encoding : utf-8 -*- +module Foodsoft + module ControllerExtensions + module Locale + extend ActiveSupport::Concern + + included do + before_filter :set_locale + end + + module InstanceMethods + def explicitly_requested_language + params[:locale] + end + + def session_language + session[:locale] + end + + def browser_language + request.env['HTTP_ACCEPT_LANGUAGE'] ? request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first : nil + end + + def default_language + ::I18n.default_locale + end + + protected + + def select_language_according_to_priority + explicitly_requested_language || session_language || browser_language + end + + def available_locales + ::I18n.available_locales + end + + def set_locale + if available_locales.include?(select_language_according_to_priority) + ::I18n.locale = select_language_according_to_priority + else + ::I18n.locale = default_language + end + + locale = session[:locale] = ::I18n.locale + logger.info("Set locale to #{locale}") + end + end + + end + end +end \ No newline at end of file From 47405b5b19364ea166db1eea9fe90ed6210d1177 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 6 Jun 2013 03:18:02 +0200 Subject: [PATCH 02/14] fixes locales issue --- lib/foodsoft/controller_extensions.rb | 57 +++++++++++++-------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/lib/foodsoft/controller_extensions.rb b/lib/foodsoft/controller_extensions.rb index fe8c940f..ea8c5265 100644 --- a/lib/foodsoft/controller_extensions.rb +++ b/lib/foodsoft/controller_extensions.rb @@ -8,43 +8,42 @@ module Foodsoft before_filter :set_locale end - module InstanceMethods - def explicitly_requested_language - params[:locale] - end + def explicitly_requested_language + params[:locale] + end - def session_language - session[:locale] - end + def session_language + session[:locale] + end - def browser_language - request.env['HTTP_ACCEPT_LANGUAGE'] ? request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first : nil - end + def browser_language + request.env['HTTP_ACCEPT_LANGUAGE'] ? request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first : nil + end - def default_language - ::I18n.default_locale - end + def default_language + ::I18n.default_locale + end - protected + protected - def select_language_according_to_priority - explicitly_requested_language || session_language || browser_language - end + def select_language_according_to_priority + language = explicitly_requested_language || session_language || browser_language + language.to_sym unless language.blank? + end - def available_locales - ::I18n.available_locales - end + def available_locales + ::I18n.available_locales + end - def set_locale - if available_locales.include?(select_language_according_to_priority) - ::I18n.locale = select_language_according_to_priority - else - ::I18n.locale = default_language - end - - locale = session[:locale] = ::I18n.locale - logger.info("Set locale to #{locale}") + def set_locale + if available_locales.include?(select_language_according_to_priority) + ::I18n.locale = select_language_according_to_priority + else + ::I18n.locale = default_language end + + locale = session[:locale] = ::I18n.locale + logger.info("Set locale to #{locale}") end end From e8173d44aee250a99be06e9ab5189ad16e7587e1 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 6 Jun 2013 03:21:44 +0200 Subject: [PATCH 03/14] adds rails-settings cached and rails-i18n-debug gems --- Gemfile | 9 +++++++-- Gemfile.lock | 9 ++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index e794d5a8..4de14f07 100644 --- a/Gemfile +++ b/Gemfile @@ -35,7 +35,7 @@ gem 'simple-navigation-bootstrap' gem 'meta_search' gem 'acts_as_versioned', git: 'git://github.com/technoweenie/acts_as_versioned.git' # Use this instead of rubygem gem 'acts_as_tree' -gem 'acts_as_configurable', git: 'git://github.com/bwalding/acts_as_configurable.git' +gem "rails-settings-cached", "0.2.4" gem 'resque' gem 'whenever', require: false # For defining cronjobs, see config/schedule.rb @@ -50,7 +50,8 @@ group :development do # Better error output gem 'better_errors' gem 'binding_of_caller' - + # gem "rails-i18n-debug" + # Re-enable rails benchmarker/profiler gem 'ruby-prof' gem 'test-unit' @@ -66,3 +67,7 @@ group :development do gem 'capistrano-ext' gem 'common_deploy', require: false, path: '../../common_deploy' #git: 'git://github.com/fsmanuel/common_deploy.git' end + +# Gems left for backwards compatibility +gem 'acts_as_configurable', git: 'git://github.com/bwalding/acts_as_configurable.git' # user settings migration needs it + diff --git a/Gemfile.lock b/Gemfile.lock index 447cb723..173c8c7a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -108,7 +108,7 @@ GEM has_scope (0.5.1) hashery (2.0.1) highline (1.6.19) - hike (1.2.1) + hike (1.2.3) i18n (0.6.1) inherited_resources (1.3.1) has_scope (~> 0.5.0) @@ -147,7 +147,7 @@ GEM polyamorous (~> 0.5.0) mime-types (1.21) mono_logger (1.1.0) - multi_json (1.7.3) + multi_json (1.7.6) mysql2 (0.3.11) net-scp (1.1.1) net-ssh (>= 2.6.5) @@ -185,6 +185,8 @@ GEM activesupport (= 3.2.13) bundler (~> 1.0) railties (= 3.2.13) + rails-settings-cached (0.2.4) + rails (>= 3.0.0) railties (3.2.13) actionpack (= 3.2.13) activesupport (= 3.2.13) @@ -225,7 +227,7 @@ GEM activesupport (>= 2.3.2) simple-navigation-bootstrap (0.0.4) simple-navigation (>= 3.7.0) - simple_form (2.0.3) + simple_form (2.1.0) actionpack (~> 3.0) activemodel (~> 3.0) sinatra (1.3.6) @@ -301,6 +303,7 @@ DEPENDENCIES prawn quiet_assets rails (~> 3.2.9) + rails-settings-cached (= 0.2.4) resque ruby-prof sass-rails (~> 3.2.3) From 60c4c5510a389b7c371e66a68fd0a27e2cb393cf Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 6 Jun 2013 03:40:15 +0200 Subject: [PATCH 04/14] adds a new user settings system + migration + rake task/worker updates --- app/models/user.rb | 61 +++++++------------ app/views/shared/_user_form_fields.html.haml | 24 +++++--- app/workers/user_notifier.rb | 4 +- config/locales/de/de.defaults.yml | 8 --- config/locales/de/de.simple_form.yml | 18 ++++++ config/locales/en/en.defaults.yml | 8 --- config/locales/en/en.simple_form.yml | 18 ++++++ db/migrate/20130605112109_create_settings.rb | 17 ++++++ .../20130605235825_migrate_user_settings.rb | 34 +++++++++++ db/schema.rb | 13 +++- lib/tasks/foodsoft.rake | 4 +- 11 files changed, 141 insertions(+), 68 deletions(-) create mode 100644 db/migrate/20130605112109_create_settings.rb create mode 100644 db/migrate/20130605235825_migrate_user_settings.rb diff --git a/app/models/user.rb b/app/models/user.rb index 359bf51c..1b0e818a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,6 +3,7 @@ require 'digest/sha1' # specific user rights through memberships (see Group) class User < ActiveRecord::Base + include RailsSettings::Extend #TODO: acts_as_paraniod ?? has_many :memberships, :dependent => :destroy @@ -19,8 +20,11 @@ class User < ActiveRecord::Base has_many :pages, :foreign_key => 'updated_by' has_many :created_orders, :class_name => 'Order', :foreign_key => 'created_by_user_id', :dependent => :nullify - attr_accessor :password, :setting_attributes - + attr_accessor :password, :settings_attributes + + # makes the current_user (logged-in-user) available in models + cattr_accessor :current_user + validates_presence_of :nick, :email validates_presence_of :password, :on => :create validates_length_of :nick, :in => 2..25 @@ -32,44 +36,23 @@ class User < ActiveRecord::Base validates_length_of :password, :in => 5..25, :allow_blank => true before_validation :set_password - after_save :update_settings - - # Adds support for configuration settings (through "settings" attribute). - acts_as_configurable - - # makes the current_user (logged-in-user) available in models - cattr_accessor :current_user - - # User settings keys - # returns the User-settings and the translated description - def self.setting_keys - { - "notify.orderFinished" => I18n.t('model.user.notify.order_finished'), - "notify.negativeBalance" => I18n.t('model.user.notify.negative_balance'), - "notify.upcoming_tasks" => I18n.t('model.user.notify.upcoming_tasks'), - "messages.sendAsEmail" => I18n.t('model.user.notify.send_as_email'), - "profile.phoneIsPublic" => I18n.t('model.user.notify.phone_is_public'), - "profile.emailIsPublic" => I18n.t('model.user.notify.email_is_public'), - "profile.nameIsPublic" => I18n.t('model.user.notify.name_is_public') - } + after_initialize do + settings.defaults['profile'] = { 'language' => I18n.default_locale } unless settings.profile + settings.defaults['messages'] = { 'send_as_email' => true } unless settings.messages + settings.defaults['notify'] = { 'upcoming_tasks' => true } unless settings.notify end - # retuns the default setting for a NEW user - # for old records nil will returned - # TODO: integrate default behaviour in acts_as_configurable plugin - def settings_default(setting) - # define a default for the settings - defaults = { - "messages.sendAsEmail" => true, - "notify.upcoming_tasks" => true - } - return true if self.new_record? && defaults[setting] - end - - def update_settings - unless setting_attributes.nil? - for setting in User::setting_keys.keys - self.settings[setting] = setting_attributes[setting] && setting_attributes[setting] == '1' ? '1' : nil + + after_save do + settings_attributes.each do |key, value| + value.each do |k, v| + case v + when '1' + value[k] = true + when '0' + value[k] = false + end end + self.settings.merge!(key, value) end end @@ -78,7 +61,7 @@ class User < ActiveRecord::Base end def receive_email? - settings['messages.sendAsEmail'] == "1" && email.present? + settings['messages.send_as_mail'] == "1" && email.present? end # Sets the user's password. It will be stored encrypted along with a random salt. diff --git a/app/views/shared/_user_form_fields.html.haml b/app/views/shared/_user_form_fields.html.haml index fa11b393..21d5fe2b 100644 --- a/app/views/shared/_user_form_fields.html.haml +++ b/app/views/shared/_user_form_fields.html.haml @@ -5,11 +5,19 @@ = f.input :phone = f.input :password, :required => f.object.new_record? = f.input :password_confirmation -.control-group - .controls - - for setting in User::setting_keys.keys - %label.checkbox{:for => "user[setting_attributes][#{setting}]"} - = hidden_field_tag "user[setting_attributes][#{setting}]", '0' - = check_box_tag "user[setting_attributes][#{setting}]", '1', - f.object.settings[setting] == '1' || f.object.settings_default(setting) - = User::setting_keys[setting] + += f.simple_fields_for :settings_attributes do |s| + + = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| + = profile.input 'language', as: :select, collection: available_locales, required: false, selected: f.object.settings.profile['language'] + = profile.input 'phone_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['phone_is_public'] } + = profile.input 'email_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['email_is_public'] } + = profile.input 'name_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['name_is_public'] } + + = s.simple_fields_for :messages, defaults: { inline_label: true, label: false } do |messages| + = messages.input 'send_as_email', as: :boolean, input_html: { checked: f.object.settings.messages['send_as_email'] } + + = s.simple_fields_for :notify, defaults: { inline_label: true, label: false } do |notify| + = notify.input 'order_finished', as: :boolean, input_html: { checked: f.object.settings.notify['order_finished'] } + = notify.input 'negative_balance', as: :boolean, input_html: { checked: f.object.settings.notify['negative_balance'] } + = notify.input 'upcoming_tasks', as: :boolean, input_html: { checked: f.object.settings.notify['upcoming_tasks'] } diff --git a/app/workers/user_notifier.rb b/app/workers/user_notifier.rb index 297ae978..754477d5 100644 --- a/app/workers/user_notifier.rb +++ b/app/workers/user_notifier.rb @@ -18,7 +18,7 @@ class UserNotifier Order.find(order_id).group_orders.each do |group_order| group_order.ordergroup.users.each do |user| begin - Mailer.order_result(user, group_order).deliver if user.settings["notify.orderFinished"] == '1' + Mailer.order_result(user, group_order).deliver if user.settings.notify["order_finished"] rescue Rails.logger.warn "Can't deliver mail to #{user.email}" end @@ -34,7 +34,7 @@ class UserNotifier Ordergroup.find(ordergroup_id).users.each do |user| begin - Mailer.negative_balance(user, transaction).deliver if user.settings["notify.negativeBalance"] == '1' + Mailer.negative_balance(user, transaction).deliver if user.settings.notify["negative_balance"] rescue Rails.logger.warn "Can't deliver mail to #{user.email}" end diff --git a/config/locales/de/de.defaults.yml b/config/locales/de/de.defaults.yml index 890ee796..ee8633a6 100644 --- a/config/locales/de/de.defaults.yml +++ b/config/locales/de/de.defaults.yml @@ -263,14 +263,6 @@ de: page: redirect: 'Weiterleiting auf [[%{title}]]...' user: - notify: - order_finished: 'Informier mich über meine Bestellergebnisse (nach Ende der Bestellung).' - negative_balance: 'Informiere mich, falls meine Bestellgruppe ins Minus rutscht.' - upcoming_tasks: 'Erinnere mich an anstehende Aufgaben.' - send_as_email: 'Bekomme Nachrichten als Emails.' - phone_is_public: 'Telefon ist für Mitglieder sichtbar' - email_is_public: 'E-Mail ist für Mitglieder sichtbar' - name_is_public: 'Name ist für Mitglieder sichtbar' no_ordergroup: 'keine Bestellgruppe' helpers: diff --git a/config/locales/de/de.simple_form.yml b/config/locales/de/de.simple_form.yml index 5aa5279a..db4a7610 100644 --- a/config/locales/de/de.simple_form.yml +++ b/config/locales/de/de.simple_form.yml @@ -8,6 +8,12 @@ de: mark: '*' error_notification: default_message: "Fehler wurden gefunden. Bitte das Formular überprüfen." + options: + settings: + profile: + language: + de: Deutsch + en: English labels: defaults: password: 'Passwort' @@ -30,6 +36,18 @@ de: nick: "Benutzerinnenname" first_name: "Vorname" last_name: "Nachname" + settings: + profile: + language: Sprache + phone_is_public: 'Telefon ist für Mitglieder sichtbar' + email_is_public: 'E-Mail ist für Mitglieder sichtbar' + name_is_public: 'Name ist für Mitglieder sichtbar' + notify: + order_finished: 'Informier mich über meine Bestellergebnisse (nach Ende der Bestellung).' + negative_balance: 'Informiere mich, falls meine Bestellgruppe ins Minus rutscht.' + upcoming_tasks: 'Erinnere mich an anstehende Aufgaben.' + messages: + send_as_email: 'Bekomme Nachrichten als Emails.' workgroup: weekly_task: 'Monatlichen Job definieren?' weekday: 'Wochentag' diff --git a/config/locales/en/en.defaults.yml b/config/locales/en/en.defaults.yml index ca4b436c..03a1f0e0 100644 --- a/config/locales/en/en.defaults.yml +++ b/config/locales/en/en.defaults.yml @@ -263,14 +263,6 @@ en: page: redirect: 'Redirect to [[%{title}]]...' user: - notify: - order_finished: 'Inform me about my order result (when the order is closed).' - negative_balance: 'inform me when by order group has a negative balance.' - upcoming_tasks: 'Remind me of upcoming tasks.' - send_as_email: 'Receive messages as emails.' - phone_is_public: 'Phone number is visible for other members.' - email_is_public: 'Email is visible for other members.' - name_is_public: 'Name is visible for other members.' no_ordergroup: 'no order group' helpers: diff --git a/config/locales/en/en.simple_form.yml b/config/locales/en/en.simple_form.yml index 31cc4b6c..305dde1e 100644 --- a/config/locales/en/en.simple_form.yml +++ b/config/locales/en/en.simple_form.yml @@ -8,6 +8,12 @@ en: mark: '*' error_notification: default_message: 'Errors were found. Please check the form.' + options: + settings: + profile: + language: + de: German + en: English labels: defaults: password: 'Password' @@ -30,6 +36,18 @@ en: nick: 'Username' first_name: 'First name' last_name: 'Last name' + settings: + profile: + language: Language + phone_is_public: 'Phone number is visible for other members.' + email_is_public: 'Email is visible for other members.' + name_is_public: 'Name is visible for other members.' + notify: + order_finished: 'Inform me about my order result (when the order is closed).' + negative_balance: 'inform me when by order group has a negative balance.' + upcoming_tasks: 'Remind me of upcoming tasks.' + messages: + send_as_email: 'Receive messages as emails.' workgroup: weekly_task: 'Define monthly task?' weekday: 'Weekday' diff --git a/db/migrate/20130605112109_create_settings.rb b/db/migrate/20130605112109_create_settings.rb new file mode 100644 index 00000000..90a0f527 --- /dev/null +++ b/db/migrate/20130605112109_create_settings.rb @@ -0,0 +1,17 @@ +class CreateSettings < ActiveRecord::Migration + def self.up + create_table :settings do |t| + t.string :var, null: false + t.text :value, null: true + t.integer :thing_id, null: true + t.string :thing_type, limit: 30, null: true + t.timestamps + end + + add_index :settings, [ :thing_type, :thing_id, :var ], unique: true + end + + def self.down + drop_table :settings + end +end diff --git a/db/migrate/20130605235825_migrate_user_settings.rb b/db/migrate/20130605235825_migrate_user_settings.rb new file mode 100644 index 00000000..a9722f1b --- /dev/null +++ b/db/migrate/20130605235825_migrate_user_settings.rb @@ -0,0 +1,34 @@ +class MigrateUserSettings < ActiveRecord::Migration + def up + old_settings = ConfigurableSetting.all + + old_settings.each do |old_setting| + # get target (user) + type = old_setting.configurable_type + id = old_setting.configurable_id + user = type.constantize.find(id) + + # get the data (settings) + name = old_setting.name + namespace = name.split('.')[0] + key = name.split('.')[1].underscore # Camelcase to underscore + + # prepare value + value = YAML.load(old_setting.value) + value = value.nil? ? false : value + + # set the settings_attributes (thanks to settings.merge! we can set them one by one) + user.settings_attributes = { + "#{namespace}" => { + "#{key}" => value + } + } + + # save the user to apply after_save callback + user.save + end + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 188ea83b..477ebbf5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121230142516) do +ActiveRecord::Schema.define(:version => 20130605235825) do create_table "article_categories", :force => true do |t| t.string "name", :default => "", :null => false @@ -268,6 +268,17 @@ ActiveRecord::Schema.define(:version => 20121230142516) do add_index "pages", ["permalink"], :name => "index_pages_on_permalink" add_index "pages", ["title"], :name => "index_pages_on_title" + create_table "settings", :force => true do |t| + t.string "var", :null => false + t.text "value" + t.integer "thing_id" + t.string "thing_type", :limit => 30 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "settings", ["thing_type", "thing_id", "var"], :name => "index_settings_on_thing_type_and_thing_id_and_var", :unique => true + create_table "stock_changes", :force => true do |t| t.integer "delivery_id" t.integer "order_id" diff --git a/lib/tasks/foodsoft.rake b/lib/tasks/foodsoft.rake index fd96cf9c..5fa4cc2a 100644 --- a/lib/tasks/foodsoft.rake +++ b/lib/tasks/foodsoft.rake @@ -8,7 +8,7 @@ namespace :foodsoft do puts "Send notifications for #{task.name} to .." for user in task.users begin - Mailer.upcoming_tasks(user, task).deliver if user.settings['notify.upcoming_tasks'] == 1 + Mailer.upcoming_tasks(user, task).deliver if user.settings.notify['upcoming_tasks'] == 1 rescue puts "deliver aborted for #{user.email}.." end @@ -38,7 +38,7 @@ namespace :foodsoft do unless task.enough_users_assigned? puts "Notify workgroup: #{workgroup.name} for task #{task.name}" for user in workgroup.users - if user.settings['messages.sendAsEmail'] == "1" && !user.email.blank? + if user.settings.messages['send_as_email'] == "1" && !user.email.blank? begin Mailer.not_enough_users_assigned(task, user).deliver rescue From 0061e45198b7df45aa67b3c967d2b37313ef2f30 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 6 Jun 2013 04:29:53 +0200 Subject: [PATCH 05/14] removes routes locale constrain and fixes some bugs --- app/models/user.rb | 1 + app/views/admin/users/show.html.haml | 6 +- app/views/foodcoop/users/_users.html.haml | 6 +- config/routes.rb | 357 +++++++++++----------- lib/foodsoft/controller_extensions.rb | 2 +- 5 files changed, 185 insertions(+), 187 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 1b0e818a..0a5767b6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -43,6 +43,7 @@ class User < ActiveRecord::Base end after_save do + return if settings_attributes.nil? settings_attributes.each do |key, value| value.each do |k, v| case v diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index a954b7d5..4d0cd1ab 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -20,10 +20,10 @@ .well %h4= t '.preference' %table.table - - for setting in User::setting_keys.keys + - @user.settings.profile.each do |key, setting| %tr - %td= User::setting_keys[setting] - %td= @user.settings[setting] == '1' ? t('simple_form.yes') : t('simple_form.no') + %td= t("simple_form.labels.settings.profile.#{key}") + %td= (setting != true and setting != false) ? setting : (setting === true ? t('simple_form.yes') : t('simple_form.no')) .span3 .well %h4= t '.groupabos' diff --git a/app/views/foodcoop/users/_users.html.haml b/app/views/foodcoop/users/_users.html.haml index 487f15e4..90b1de3a 100644 --- a/app/views/foodcoop/users/_users.html.haml +++ b/app/views/foodcoop/users/_users.html.haml @@ -14,9 +14,9 @@ - for user in @users %tr %td= user.nick - %td= user.name if @current_user.role_admin? || user.settings["profile.nameIsPublic"] == '1' - %td= user.email if @current_user.role_admin? || user.settings["profile.emailIsPublic"] == '1' - %td= user.phone if @current_user.role_admin? || user.settings["profile.phoneIsPublic"] == '1' + %td= user.name if @current_user.role_admin? || user.settings.profile["name_is_public"] + %td= user.email if @current_user.role_admin? || user.settings.profile["email_is_public"] + %td= user.phone if @current_user.role_admin? || user.settings.profile["phone_is_public"] %td= user.ordergroup_name %td= user.workgroups.collect(&:name).join(', ') %td= link_to_new_message(message_params: {mail_to: user.id}) diff --git a/config/routes.rb b/config/routes.rb index b4e8ab4b..ee60ac0a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,187 +8,184 @@ Foodsoft::Application.routes.draw do root :to => redirect("/#{FoodsoftConfig.scope}") - constraints(locale: /[a-z]{2}/) do - scope "(:locale)" do - scope '/:foodcoop' do - - # Root path - root :to => 'home#index' - - ########### Sessions - - match '/login' => 'sessions#new', :as => 'login' - match '/logout' => 'sessions#destroy', :as => 'logout' - get '/login/forgot_password' => 'login#forgot_password', as: :forgot_password - get '/login/new_password' => 'login#new_password', as: :new_password - match '/login/accept_invitation/:token' => 'login#accept_invitation', as: :accept_invitation - resources :sessions, :only => [:new, :create, :destroy] - - ########### User specific - - match '/home/profile' => 'home#profile', :as => 'my_profile' - match '/home/ordergroup' => 'home#ordergroup', :as => 'my_ordergroup' - match '/home/cancel_membership' => 'home#cancel_membership', :as => 'cancel_membership' - - ############ Wiki - - resources :pages do - get :all, :on => :collection - get :version, :on => :member - get :revert, :on => :member + + scope '/:foodcoop' do + + # Root path + root :to => 'home#index' + + ########### Sessions + + match '/login' => 'sessions#new', :as => 'login' + match '/logout' => 'sessions#destroy', :as => 'logout' + get '/login/forgot_password' => 'login#forgot_password', as: :forgot_password + get '/login/new_password' => 'login#new_password', as: :new_password + match '/login/accept_invitation/:token' => 'login#accept_invitation', as: :accept_invitation + resources :sessions, :only => [:new, :create, :destroy] + + ########### User specific + + match '/home/profile' => 'home#profile', :as => 'my_profile' + match '/home/ordergroup' => 'home#ordergroup', :as => 'my_ordergroup' + match '/home/cancel_membership' => 'home#cancel_membership', :as => 'cancel_membership' + + ############ Wiki + + resources :pages do + get :all, :on => :collection + get :version, :on => :member + get :revert, :on => :member + end + match '/wiki/:permalink' => 'pages#show', :as => 'wiki_page' # , :constraints => {:permalink => /[^\s]+/} + match '/wiki' => 'pages#show', :defaults => {:permalink => 'Home'}, :as => 'wiki' + + ############ Orders, ordering + + resources :orders do + member do + post :finish + post :add_comment + end + end + + resources :group_orders do + get :archive, :on => :collection + end + + resources :order_comments, :only => [:new, :create] + + ############ Foodcoop orga + + resources :invites, :only => [:new, :create] + + resources :tasks do + collection do + get :user + get :archive + get :workgroup + end + member do + post :accept + post :reject + post :set_done + end + end + + resources :messages, :only => [:index, :show, :new, :create] + + namespace :foodcoop do + root :to => 'users#index' + + resources :users, :only => [:index] + + resources :ordergroups, :only => [:index] + + resources :workgroups, :only => [:index, :edit, :update] + end + + ########### Article management + + resources :stock_takings do + collection do + get :fill_new_stock_article_form + post :add_stock_article + end + end + + resources :stock_articles, :to => 'stockit' do + collection do + get :articles_search + get :fill_new_stock_article_form + end + end + + resources :suppliers do + get :shared_suppliers, :on => :collection + + resources :deliveries do + post :drop_stock_change, :on => :member + post :add_stock_article, :on => :collection + end + + resources :articles do + collection do + post :update_selected + get :edit_all + post :update_all + get :upload + post :parse_upload + post :create_from_upload + get :shared + get :import + post :sync + post :update_synchronized end - match '/wiki/:permalink' => 'pages#show', :as => 'wiki_page' # , :constraints => {:permalink => /[^\s]+/} - match '/wiki' => 'pages#show', :defaults => {:permalink => 'Home'}, :as => 'wiki' - - ############ Orders, ordering - - resources :orders do - member do - post :finish - post :add_comment - end + end + end + + resources :article_categories + + ########### Finance + + namespace :finance do + root :to => 'base#index' + + resources :order, controller: 'balancing', path: 'balancing' do + member do + get :update_summary + get :edit_note + put :update_note + + get :confirm + put :close + put :close_direct end - - resources :group_orders do - get :archive, :on => :collection + + resources :order_articles + end + + resources :group_order_articles do + member do + put :update_result end - - resources :order_comments, :only => [:new, :create] - - ############ Foodcoop orga - - resources :invites, :only => [:new, :create] - - resources :tasks do - collection do - get :user - get :archive - get :workgroup - end - member do - post :accept - post :reject - post :set_done - end - end - - resources :messages, :only => [:index, :show, :new, :create] - - namespace :foodcoop do - root :to => 'users#index' - - resources :users, :only => [:index] - - resources :ordergroups, :only => [:index] - - resources :workgroups, :only => [:index, :edit, :update] - end - - ########### Article management - - resources :stock_takings do - collection do - get :fill_new_stock_article_form - post :add_stock_article - end - end - - resources :stock_articles, :to => 'stockit' do - collection do - get :articles_search - get :fill_new_stock_article_form - end - end - - resources :suppliers do - get :shared_suppliers, :on => :collection - - resources :deliveries do - post :drop_stock_change, :on => :member - post :add_stock_article, :on => :collection - end - - resources :articles do - collection do - post :update_selected - get :edit_all - post :update_all - get :upload - post :parse_upload - post :create_from_upload - get :shared - get :import - post :sync - post :update_synchronized - end - end - end - - resources :article_categories - - ########### Finance - - namespace :finance do - root :to => 'base#index' - - resources :order, controller: 'balancing', path: 'balancing' do - member do - get :update_summary - get :edit_note - put :update_note - - get :confirm - put :close - put :close_direct - end - - resources :order_articles - end - - resources :group_order_articles do - member do - put :update_result - end - end - - resources :invoices - - resources :ordergroups, :only => [:index] do - resources :financial_transactions, :as => :transactions - end - - get 'transactions/new_collection' => 'financial_transactions#new_collection', :as => 'new_transaction_collection' - post 'transactions/create_collection' => 'financial_transactions#create_collection', :as => 'create_transaction_collection' - end - - ########### Administration - - namespace :admin do - root :to => 'base#index' - - resources :users - - resources :workgroups do - get :memberships, :on => :member - end - - resources :ordergroups do - get :memberships, :on => :member - end - end - - ############## Feedback - - resource :feedback, :only => [:new, :create], :controller => 'feedback' - - ############## The rest - - resources :users, :only => [:index] - - # TODO: This is very error prone. Better deactivate this catch all route - match ':controller(/:action(/:id))(.:format)' - - end # End of /:foodcoop scope - end # End of /:locale scope - end # End of :locale constraints + end + + resources :invoices + + resources :ordergroups, :only => [:index] do + resources :financial_transactions, :as => :transactions + end + + get 'transactions/new_collection' => 'financial_transactions#new_collection', :as => 'new_transaction_collection' + post 'transactions/create_collection' => 'financial_transactions#create_collection', :as => 'create_transaction_collection' + end + + ########### Administration + + namespace :admin do + root :to => 'base#index' + + resources :users + + resources :workgroups do + get :memberships, :on => :member + end + + resources :ordergroups do + get :memberships, :on => :member + end + end + + ############## Feedback + + resource :feedback, :only => [:new, :create], :controller => 'feedback' + + ############## The rest + + resources :users, :only => [:index] + + # TODO: This is very error prone. Better deactivate this catch all route + match ':controller(/:action(/:id))(.:format)' + + end # End of /:foodcoop scope end diff --git a/lib/foodsoft/controller_extensions.rb b/lib/foodsoft/controller_extensions.rb index ea8c5265..476906cc 100644 --- a/lib/foodsoft/controller_extensions.rb +++ b/lib/foodsoft/controller_extensions.rb @@ -41,7 +41,7 @@ module Foodsoft else ::I18n.locale = default_language end - + locale = session[:locale] = ::I18n.locale logger.info("Set locale to #{locale}") end From c8c810a0a4511be30b33ae3d3096211817db11a3 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 7 Jun 2013 19:05:28 +0200 Subject: [PATCH 06/14] added user setting to set_locale --- lib/foodsoft/controller_extensions.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/foodsoft/controller_extensions.rb b/lib/foodsoft/controller_extensions.rb index 476906cc..a5f3fe6f 100644 --- a/lib/foodsoft/controller_extensions.rb +++ b/lib/foodsoft/controller_extensions.rb @@ -12,6 +12,10 @@ module Foodsoft params[:locale] end + def user_settings_language + current_user.settings.profile['language'] if current_user + end + def session_language session[:locale] end @@ -27,7 +31,7 @@ module Foodsoft protected def select_language_according_to_priority - language = explicitly_requested_language || session_language || browser_language + language = explicitly_requested_language || session_language || user_settings_language || browser_language language.to_sym unless language.blank? end From 2c1d9aeb9c448f1029b38d5b8af0f19c47e4f657 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 14 Jun 2013 02:39:25 +0200 Subject: [PATCH 07/14] finishes i18n set_locale with user settings --- app/controllers/home_controller.rb | 1 + app/controllers/login_controller.rb | 1 + app/models/user.rb | 4 ++++ lib/foodsoft/controller_extensions.rb | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 55afb7b2..99f108ce 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -16,6 +16,7 @@ class HomeController < ApplicationController def update_profile if @current_user.update_attributes(params[:user]) + session[:locale] = @current_user.locale redirect_to my_profile_url, notice: I18n.t('home.changes_saved') else render :profile diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb index 745d5e58..3aab74c5 100644 --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -58,6 +58,7 @@ class LoginController < ApplicationController if @user.save Membership.new(:user => @user, :group => @invite.group).save! @invite.destroy + session[:locale] = @user.locale redirect_to login_url, notice: I18n.t('login.controller.accept_invitation.notice') end end diff --git a/app/models/user.rb b/app/models/user.rb index 0a5767b6..aced06d7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -57,6 +57,10 @@ class User < ActiveRecord::Base end end + def locale + settings.profile['language'] + end + def name [first_name, last_name].join(" ") end diff --git a/lib/foodsoft/controller_extensions.rb b/lib/foodsoft/controller_extensions.rb index a5f3fe6f..e0b64aa6 100644 --- a/lib/foodsoft/controller_extensions.rb +++ b/lib/foodsoft/controller_extensions.rb @@ -13,7 +13,7 @@ module Foodsoft end def user_settings_language - current_user.settings.profile['language'] if current_user + current_user.locale if current_user end def session_language From ba923a8f16f2395ebb07c60a12c6bab6f9f685cc Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 14 Jun 2013 02:53:17 +0200 Subject: [PATCH 08/14] updates locale files --- config/locales/de.yml | 26 ++- config/locales/de/de.defaults.yml | 313 --------------------------- config/locales/de/de.simple_form.yml | 167 -------------- config/locales/en.yml | 27 ++- config/locales/en/en.defaults.yml | 312 -------------------------- config/locales/en/en.simple_form.yml | 167 -------------- 6 files changed, 37 insertions(+), 975 deletions(-) delete mode 100644 config/locales/de/de.defaults.yml delete mode 100644 config/locales/de/de.simple_form.yml delete mode 100644 config/locales/en/en.defaults.yml delete mode 100644 config/locales/en/en.simple_form.yml diff --git a/config/locales/de.yml b/config/locales/de.yml index b5521af9..f618345c 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1158,14 +1158,6 @@ de: redirect: Weiterleiting auf [[%{title}]]... user: no_ordergroup: keine Bestellgruppe - notify: - email_is_public: E-Mail ist für Mitglieder sichtbar - name_is_public: Name ist für Mitglieder sichtbar - negative_balance: Informiere mich, falls meine Bestellgruppe ins Minus rutscht. - order_finished: Informier mich über meine Bestellergebnisse (nach Ende der Bestellung). - phone_is_public: Telefon ist für Mitglieder sichtbar - send_as_email: Bekomme Nachrichten als Emails. - upcoming_tasks: Erinnere mich an anstehende Aufgaben. navigation: admin: home: Übersicht @@ -1503,6 +1495,12 @@ de: simple_form: error_notification: default_message: Fehler wurden gefunden. Bitte das Formular überprüfen. + options: + settings: + profile: + language: + de: Deutsch + en: English hints: article: unit: z.B. KG oder 1L oder 500g @@ -1622,6 +1620,18 @@ de: workgroup: one: Arbeitsgruppe other: Arbeitsgruppen + settings: + profile: + language: Sprache + phone_is_public: Telefon ist für Mitglieder sichtbar + email_is_public: E-Mail ist für Mitglieder sichtbar + name_is_public: Name ist für Mitglieder sichtbar + notify: + order_finished: Informier mich über meine Bestellergebnisse (nach Ende der Bestellung). + negative_balance: Informiere mich, falls meine Bestellgruppe ins Minus rutscht. + upcoming_tasks: Erinnere mich an anstehende Aufgaben. + messages: + send_as_email: Bekomme Nachrichten als Emails. workgroup: next_weekly_tasks_number: Für wieviel Wochen im Voraus sollen Aufgaben erstellt werden? role_admin: Administration diff --git a/config/locales/de/de.defaults.yml b/config/locales/de/de.defaults.yml deleted file mode 100644 index ee8633a6..00000000 --- a/config/locales/de/de.defaults.yml +++ /dev/null @@ -1,313 +0,0 @@ -de: - orders: - state: - open: laufend - finished: beendet - closed: abgerechnet - - group_orders: - messages: - not_enough_apples: > - Um zu Bestellen brauchst Du mindestends %{stop_ordering_under} Äpfel. - Momentan hat Deine Bestellgruppe aber nur %{apples} Äpfel. - views: - pagination: - first: "«" - last: "»" - previous: "‹" - next: "›" - truncate: "..." - - date: - abbr_day_names: - - So - - Mo - - Di - - Mi - - Do - - Fr - - Sa - abbr_month_names: - - - - Jan - - Feb - - Mär - - Apr - - Mai - - Jun - - Jul - - Aug - - Sep - - Okt - - Nov - - Dez - day_names: - - Sonntag - - Montag - - Dienstag - - Mittwoch - - Donnerstag - - Freitag - - Samstag - formats: - default: ! '%d.%m.%Y' - long: ! '%e. %B %Y' - short: ! '%e. %b' - month_names: - - - - Januar - - Februar - - März - - April - - Mai - - Juni - - Juli - - August - - September - - Oktober - - November - - Dezember - order: - - :day - - :month - - :year - datetime: - distance_in_words: - about_x_hours: - one: etwa eine Stunde - other: etwa %{count} Stunden - about_x_months: - one: etwa ein Monat - other: etwa %{count} Monate - about_x_years: - one: etwa ein Jahr - other: etwa %{count} Jahre - almost_x_years: - one: fast ein Jahr - other: fast %{count} Jahre - half_a_minute: eine halbe Minute - less_than_x_minutes: - one: weniger als eine Minute - other: weniger als %{count} Minuten - less_than_x_seconds: - one: weniger als eine Sekunde - other: weniger als %{count} Sekunden - over_x_years: - one: mehr als ein Jahr - other: mehr als %{count} Jahre - x_days: - one: ein Tag - other: ! '%{count} Tage' - x_minutes: - one: eine Minute - other: ! '%{count} Minuten' - x_months: - one: ein Monat - other: ! '%{count} Monate' - x_seconds: - one: eine Sekunde - other: ! '%{count} Sekunden' - prompts: - day: Tag - hour: Stunden - minute: Minuten - month: Monat - second: Sekunden - year: Jahr - errors: &errors - general: 'Ein Problem ist aufgetreten.' - general_msg: 'Ein Fehler ist aufgetreten: %{msg}' - general_again: 'Ein Fehler ist aufgetreten. Bitte erneut versuchen.' - format: ! '%{attribute} %{message}' - messages: - accepted: muss akzeptiert werden - blank: muss ausgefüllt werden - confirmation: stimmt nicht mit der Bestätigung überein - empty: muss ausgefüllt werden - equal_to: muss genau %{count} sein - even: muss gerade sein - exclusion: ist nicht verfügbar - greater_than: muss größer als %{count} sein - greater_than_or_equal_to: muss größer oder gleich %{count} sein - inclusion: ist kein gültiger Wert - invalid: ist nicht gültig - less_than: muss kleiner als %{count} sein - less_than_or_equal_to: muss kleiner oder gleich %{count} sein - not_a_number: ist keine Zahl - not_an_integer: muss ganzzahlig sein - odd: muss ungerade sein - record_invalid: ! 'Gültigkeitsprüfung ist fehlgeschlagen: %{errors}' - taken: ist bereits vergeben - taken_with_deleted: ist bereits vergeben (eine gelöschte Gruppe) - too_long: ist zu lang (nicht mehr als %{count} Zeichen) - too_short: ist zu kurz (nicht weniger als %{count} Zeichen) - wrong_length: hat die falsche Länge (muss genau %{count} Zeichen haben) - template: - body: ! 'Bitte überprüfen Sie die folgenden Felder:' - header: - one: ! 'Konnte %{model} nicht speichern: ein Fehler.' - other: ! 'Konnte %{model} nicht speichern: %{count} Fehler.' - number: - currency: - format: - delimiter: . - format: ! '%n %u' - precision: 2 - separator: ! ',' - significant: false - strip_insignificant_zeros: false - unit: € - format: - delimiter: . - precision: 2 - separator: ! ',' - significant: false - strip_insignificant_zeros: false - human: - decimal_units: - format: ! '%n %u' - units: - billion: - one: Milliarde - other: Milliarden - million: Millionen - quadrillion: - one: Billiarde - other: Billiarden - thousand: Tausend - trillion: Billionen - unit: '' - format: - delimiter: '' - precision: 1 - significant: true - strip_insignificant_zeros: true - storage_units: - format: ! '%n %u' - units: - byte: - one: Byte - other: Bytes - gb: GB - kb: KB - mb: MB - tb: TB - percentage: - format: - delimiter: '' - precision: - format: - delimiter: '' - support: - array: - last_word_connector: ! ' und ' - two_words_connector: ! ' und ' - words_connector: ! ', ' - time: - am: vormittags - formats: - default: ! '%A, %d. %B %Y, %H:%M Uhr' - long: ! '%A, %d. %B %Y, %H:%M Uhr' - short: ! '%d. %B, %H:%M Uhr' - pm: nachmittags - # remove these aliases after 'activemodel' and 'activerecord' namespaces are removed from Rails repository - activemodel: - errors: - <<: *errors - activerecord: - errors: - <<: *errors - has_many_left: 'ist noch mit einem/r %{collection} verknüpft!' - models: - article: Artikel - supplier: Lieferant - user: Benutzerinnen - workgroup: Arbeitsgruppe - ordergroup: Bestellgruppe - task: Aufgabe - message: Nachricht - article_category: Artikelkategorie - stock_article: Lagerartikel - delivery: Lieferung - stock_taking: Inventur - financial_transaction: Kontotransaktion - order: Bestellung - order_comment: Kommentar - order_article: Bestell-Artikel - invoice: Rechnung - attributes: - article: - availability: 'Artikel ist verfügbar?' - price: Nettopreis - gross_price: Bruttopreis - unit: Einheit - unit_quantity: Gebindegröße - tax: MwSt - deposit: Pfand - article_category: Kategorie - stock_article: - price: Nettopreis - user: - password: Passwort - first_name: Vorname - financial_transaction: - amount: Betrag - note: Notiz - - # messages in model that don't have a corresponding view - model: - membership: - no_admin_delete: 'Mitgliedschaft kann nicht beendet werden. Du bist die letzte Administratorin' - order_article: - error_price: 'muss angegeben sein und einen aktuellen Preis haben' - page: - redirect: 'Weiterleiting auf [[%{title}]]...' - user: - no_ordergroup: 'keine Bestellgruppe' - - helpers: - select: - prompt: Bitte wählen - submit: - create: "%{model} speichern" - update: "Änderungen speichern" - message: - create: 'Nachricht verschicken' - invite: - create: Einladung verschicken - application: - sort_by: 'Nach %{text} sortieren' - edit_user: 'Mitglieder bearbeiten' - show_google_maps: 'Show it on Google maps' - # long names in simple_form.labels.workgroup - role_admin: 'Admin' - role_finance: 'Finanzen' - role_suppliers: 'Lieferanten' - role_article_meta: 'Artikel' - role_orders: 'Bestellung' - write_message: 'Nachricht_schreiben' - deliveries: - show_invoice: 'Rechnung anzeigen' - new_invoice: 'Rechnung anlegen' - orders: - order_pdf: 'PDF erstellen' - option_choose: 'Lieferantin/Lager auswählen' - option_stock: 'Lager' - tasks: - required_users: 'Es fehlen %{count} Mitstreiterinnen!' - - lib: - order_pdf: - page: 'Seite %{number}' - - # general user-interface - ui: - close: 'Schließen' - edit: 'Bearbeiten' - delete: 'Löschen' - show: 'Anzeigen' - save: 'Speichern' - or_cancel: 'oder abbrechen' - marks: - close: '×' - diff --git a/config/locales/de/de.simple_form.yml b/config/locales/de/de.simple_form.yml deleted file mode 100644 index db4a7610..00000000 --- a/config/locales/de/de.simple_form.yml +++ /dev/null @@ -1,167 +0,0 @@ -de: - # Simple form i18n is used to build the forms - simple_form: - "yes": 'Ja' - "no": 'Nein' - required: - text: 'benötigt' - mark: '*' - error_notification: - default_message: "Fehler wurden gefunden. Bitte das Formular überprüfen." - options: - settings: - profile: - language: - de: Deutsch - en: English - labels: - defaults: - password: 'Passwort' - password_confirmation: 'Passwort wiederholen' - description: 'Beschreibung' - title: 'Titel' - email: 'E-Mail' - note: 'Notiz' - date: 'Datum' - ordergroup: 'Bestellgruppe' - amount: 'Betrag' - phone: "Telefon" - user_tokens: 'Mitglieder' - price: 'Preis (netto)' - unit_quantity: 'Gebindegröße' - order_number: 'Bestellnummer' - tax: 'MwSt' - deposit: 'Pfand' - user: - nick: "Benutzerinnenname" - first_name: "Vorname" - last_name: "Nachname" - settings: - profile: - language: Sprache - phone_is_public: 'Telefon ist für Mitglieder sichtbar' - email_is_public: 'E-Mail ist für Mitglieder sichtbar' - name_is_public: 'Name ist für Mitglieder sichtbar' - notify: - order_finished: 'Informier mich über meine Bestellergebnisse (nach Ende der Bestellung).' - negative_balance: 'Informiere mich, falls meine Bestellgruppe ins Minus rutscht.' - upcoming_tasks: 'Erinnere mich an anstehende Aufgaben.' - messages: - send_as_email: 'Bekomme Nachrichten als Emails.' - workgroup: - weekly_task: 'Monatlichen Job definieren?' - weekday: 'Wochentag' - task_name: 'Name für Job' - task_required_users: 'Benötige Verantwortliche' - task_duration: 'Vor. Dauer in Stunden' - task_description: 'Beschreibung' - next_weekly_tasks_number: "Für wieviel Wochen im Voraus sollen Aufgaben erstellt werden?" - role_admin: "Administration" - role_finance: "Finanzen" - role_suppliers: "Lieferanten" - role_article_meta: "Artikeldatenbank" - role_orders: "Bestellverwaltung" - ordergroup: - contact_person: "Kontaktperson" - contact_phone: "Telefon" - contact_address: "Adresse" - ignore_apple_restriction: "Bestellstop bei zu wenig Äpfeln ignorieren" - task: - name: 'Name' - duration: 'Dauer' - user_list: 'Verantwortliche' - required_users: 'Anzahl' - due_date: 'Wann erledigen?' - workgroup: 'Arbeitsgruppe' - done: Erledigt? - message: - sent_to_all: 'An alle Mitglieder schicken' - recipient_tokens: 'Empfänger_innen' - group_id: 'Gruppe' - subject: 'Betreff' - body: 'Inhalt' - private: Privat - page: - body: 'Inhalt' - parent_id: Oberseite - supplier: - name: 'Name' - address: 'Adresse' - phone: 'Telefon' - phone2: 'Telefon 2' - fax: 'FAX' - email: 'Email' - url: 'Homepage' - contact_person: 'Ansprechparter_in' - customer_number: 'Kundennummer' - delivery_days: 'Liefertage' - order_howto: 'Howto Bestellen' - note: 'Notiz' - min_order_quantity: 'Mindestbestellmenge' - is_subscribed: 'abonniert?' - article: - name: 'Name' - origin: 'Herkunft' - manufacturer: 'Produzent' - unit: 'Einheit' - note: 'Notiz' - article_category: 'Kategorie' - article_category: - name: 'Name' - description: 'Beschreibung' - stock_article: - supplier: 'Lieferant' - delivery: - supplier: 'Lieferantin' - delivered_on: 'Lieferdatum' - user: - nick: "Benutzername" - name: "Name" - last_name: "Nachname" - email: 'Email' - phone: "Telefon" - ordergroup: 'Bestellgruppe' - workgroup: - one: 'Arbeitsgruppe' - other: 'Arbeitsgruppen' - order_comment: - text: Kommentiere diese Bestellung ... - order: - starts: "Läuft vom" - ends: "Endet am" - order_article: - article_id: Artikel aus dem Katalog wählen - group_order_article: - ordergroup_id: Bestellgruppe - result: Menge - invoice: - supplier: Lieferant - number: Nummer - date: Rechnungsdatum - paid_on: Bezahlt am - deposit: Pfand berechnet - deposit_credit: Pfand gutgeschrieben - amount: Betrag - delivery: Lieferung - order: Bestellung - note: Notiz - order_article: - units_to_order: Menge - update_current_price: Globalen Preis aktualisieren - - hints: - tax: 'In Prozent, Standard sind 7,0' - task: - duration: 'Wie lange dauert die Aufgabe, 1-3 Stunden' - required_users: 'Wieviel Benutzerinnen werden insgesamt benötigt?' - supplier: - min_order_quantity: 'Die Mindestbestellmenge wird während der Bestellung angezeigt und soll motivieren' - article: - unit: 'z.B. KG oder 1L oder 500g' - stock_article: - supplier: '' - message: - private: Nachricht erscheint nicht im Foodsoft Posteingang - order_article: - units_to_order: Anzahl gelieferter Gebinde - update_current_price: Ändert auch den Preis für aktuelle Bestellungen diff --git a/config/locales/en.yml b/config/locales/en.yml index 01b62e62..f7d7098e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1161,14 +1161,6 @@ en: redirect: Redirect to [[%{title}]]... user: no_ordergroup: no order group - notify: - email_is_public: Email is visible for other members. - name_is_public: Name is visible for other members. - negative_balance: inform me when by order group has a negative balance. - order_finished: Inform me about my order result (when the order is closed). - phone_is_public: Phone number is visible for other members. - send_as_email: Receive messages as emails. - upcoming_tasks: Remind me of upcoming tasks. navigation: admin: home: Overview @@ -1506,6 +1498,12 @@ en: simple_form: error_notification: default_message: Errors were found. Please check the form. + options: + settings: + profile: + language: + de: German + en: English hints: article: unit: ! 'For example: KG or 1L or 500g' @@ -1625,6 +1623,19 @@ en: workgroup: one: Workgroup other: Workgroups + settings: + notify: + profile: + language: Language + phone_is_public: Phone number is visible for other members. + email_is_public: Email is visible for other members. + name_is_public: Name is visible for other members. + notify: + order_finished: Inform me about my order result (when the order is closed). + negative_balance: inform me when my order group has a negative balance. + upcoming_tasks: Remind me of upcoming tasks. + messages: + send_as_email: Receive messages as emails. workgroup: next_weekly_tasks_number: For how many weeks in advance would you like to define tasks? role_admin: Administration diff --git a/config/locales/en/en.defaults.yml b/config/locales/en/en.defaults.yml deleted file mode 100644 index 03a1f0e0..00000000 --- a/config/locales/en/en.defaults.yml +++ /dev/null @@ -1,312 +0,0 @@ -en: - orders: - state: - open: open - finished: finished - closed: closed - - group_orders: - messages: - not_enough_apples: > - You need at least %{stop_ordering_under} apples to order. - Currently your order group has only %{apples} apples. - views: - pagination: - first: "«" - last: "»" - previous: "‹" - next: "›" - truncate: "..." - - date: - abbr_day_names: - - Su - - Mo - - Tu - - We - - Th - - Fr - - Sa - abbr_month_names: - - - - Jan - - Feb - - Mar - - Apr - - May - - Jun - - Jul - - Aug - - Sep - - Oct - - Nov - - Dec - day_names: - - Sunday - - Monday - - Tuesday - - Wednesday - - Thursday - - Friday - - Saturday - formats: - default: ! '%d/%m/%Y' - long: ! '%e %B %Y' - short: ! '%e %b' - month_names: - - - - January - - February - - March - - April - - May - - June - - July - - August - - September - - October - - November - - December - order: - - :day - - :month - - :year - datetime: - distance_in_words: - about_x_hours: - one: about one hour - other: about %{count} hours - about_x_months: - one: about one month - other: about %{count} months - about_x_years: - one: about one year - other: about %{count} years - almost_x_years: - one: almost one year - other: almost %{count} years - half_a_minute: half a minute - less_than_x_minutes: - one: less than one minute - other: less then %{count} minutes - less_than_x_seconds: - one: less than a second - other: less than %{count} seconds - over_x_years: - one: more then a year - other: more than %{count} year - x_days: - one: one day - other: ! '%{count} days' - x_minutes: - one: one minute - other: ! '%{count} minutes' - x_months: - one: one month - other: ! '%{count} months' - x_seconds: - one: eine Sekunde - other: ! '%{count} seconds' - prompts: - day: day - hour: hours - minute: minutes - month: months - second: seconds - year: years - errors: &errors - general: 'A problem has occured.' - general_msg: 'A problem has occured: %{msg}' - general_again: 'A problem has occured. Please try again.' - format: ! '%{attribute} %{message}' - messages: - accepted: has to be accepted - blank: has to be filled - confirmation: does not match the confirmation - empty: has to be entered - equal_to: has to be exactly %{count} - even: has to be an even number - exclusion: is not available - greater_than: has to be greater than %{count} - greater_than_or_equal_to: has to be greater than or equal to %{count} - inclusion: is not a valid value - invalid: is invalid - less_than: has to be less than %{count} - less_than_or_equal_to: has to be less than or equal to %{count} - not_a_number: is not a number - not_an_integer: must be a whole number - odd: must be odd - record_invalid: ! 'validation failed: %{errors}' - taken: is already taken - taken_with_deleted: is already taken (deleted group) - too_long: is too long (no more than %{count} characters) - too_short: is too short (use more than %{count} characters) - wrong_length: is the wrong length (has to have exactly %{count} characters) - template: - body: ! 'Please check the following fields:' - header: - one: ! 'Could not save %{model}: an error.' - other: ! 'Could not save %{model}: %{count} errors.' - number: - currency: - format: - delimiter: . - format: ! '%n %u' - precision: 2 - separator: ! '.' - significant: false - strip_insignificant_zeros: false - unit: € - format: - delimiter: . - precision: 2 - separator: ! ',' - significant: false - strip_insignificant_zeros: false - human: - decimal_units: - format: ! '%n %u' - units: - billion: - one: billion - other: billions - million: million - quadrillion: - one: quadrillion - other: quadrillions - thousand: thousand - trillion: trillion - unit: '' - format: - delimiter: '' - precision: 1 - significant: true - strip_insignificant_zeros: true - storage_units: - format: ! '%n %u' - units: - byte: - one: byte - other: bytes - gb: GB - kb: KB - mb: MB - tb: TB - percentage: - format: - delimiter: '' - precision: - format: - delimiter: '' - support: - array: - last_word_connector: ! ' and ' - two_words_connector: ! ' and ' - words_connector: ! ', ' - time: - am: morning - formats: - default: ! '%A, %d %B %Y, %H:%M' - long: ! '%A, %d %B %Y, %H:%M' - short: ! '%d %B, %H:%M' - pm: afternoon - # remove these aliases after 'activemodel' and 'activerecord' namespaces are removed from Rails repository - activemodel: - errors: - <<: *errors - activerecord: - errors: - <<: *errors - has_many_left: 'is still associated with a %{collection}!' - models: - article: Article - supplier: Supplier - user: User - workgroup: Workgroup - ordergroup: Ordergroup - task: Task - message: Message - article_category: Article category - stock_article: Stock article - delivery: Delivery - stock_taking: Stock taking - financial_transaction: Financial transaction - order: Order - order_comment: Order comment - order_article: Order article - invoice: Invoice - attributes: - article: - availability: 'Is article available?' - price: price - gross_price: gross price - unit: unit - unit_quantity: unit quantity - tax: VAT - deposit: deposit - article_category: article category - stock_article: - price: Price - user: - password: Password - first_name: First name - financial_transaction: - amount: amount - note: note - - # messages in model that don't have a corresponding view - model: - membership: - no_admin_delete: 'Membership can not be withdrawn as you are the last administrator.' - order_article: - error_price: 'must be specified and have a current price price' - page: - redirect: 'Redirect to [[%{title}]]...' - user: - no_ordergroup: 'no order group' - - helpers: - select: - prompt: please select - submit: - create: "save %{model}" - update: "save changes" - message: - create: 'send message' - invite: - create: send invitation - application: - sort_by: 'Sort by %{text}' - edit_user: 'Edit user' - show_google_maps: 'Show it on Google maps' - # long names in simple_form.labels.workgroup - role_admin: 'Admin' - role_finance: 'Finance' - role_suppliers: 'Suppliers' - role_article_meta: 'Articles' - role_orders: 'Orders' - write_message: 'Write message' - deliveries: - show_invoice: 'Show invoice' - new_invoice: 'New invoice' - orders: - order_pdf: 'Create PDF' - option_choose: 'Choose supplier/stock' - option_stock: 'Stock' - tasks: - required_users: '%{count} members are still needed!' - - lib: - order_pdf: - page: 'Page %{number}' - - # general user-interface - ui: - close: 'Close' - edit: 'Edit' - delete: 'Delete' - show: 'Show' - save: 'Save' - or_cancel: 'or cancel' - marks: - close: '×' diff --git a/config/locales/en/en.simple_form.yml b/config/locales/en/en.simple_form.yml deleted file mode 100644 index 305dde1e..00000000 --- a/config/locales/en/en.simple_form.yml +++ /dev/null @@ -1,167 +0,0 @@ -en: - # Simple form i18n is used to build the forms - simple_form: - "yes": 'Yes' - "no": 'No' - required: - text: 'required' - mark: '*' - error_notification: - default_message: 'Errors were found. Please check the form.' - options: - settings: - profile: - language: - de: German - en: English - labels: - defaults: - password: 'Password' - password_confirmation: 'Repeat password' - description: 'Description' - title: 'Title' - email: 'Email' - note: 'Note' - date: 'Date' - ordergroup: 'Ordergroup' - amount: 'Amount' - phone: 'Phone' - user_tokens: 'Members' - price: 'Price (net)' - unit_quantity: 'Unit quantity' - order_number: 'Order number' - tax: 'VAT' - deposit: 'Deposit' - user: - nick: 'Username' - first_name: 'First name' - last_name: 'Last name' - settings: - profile: - language: Language - phone_is_public: 'Phone number is visible for other members.' - email_is_public: 'Email is visible for other members.' - name_is_public: 'Name is visible for other members.' - notify: - order_finished: 'Inform me about my order result (when the order is closed).' - negative_balance: 'inform me when by order group has a negative balance.' - upcoming_tasks: 'Remind me of upcoming tasks.' - messages: - send_as_email: 'Receive messages as emails.' - workgroup: - weekly_task: 'Define monthly task?' - weekday: 'Weekday' - task_name: 'Task name' - task_required_users: 'People required' - task_duration: 'Duration in hours' - task_description: 'Description' - next_weekly_tasks_number: 'For how many weeks in advance would you like to define tasks?' - role_admin: 'Administration' - role_finance: 'Finances' - role_suppliers: 'Suppliers' - role_article_meta: 'Article database' - role_orders: 'Order management' - ordergroup: - contact_person: 'Contact person' - contact_phone: 'Phone' - contact_address: 'Address' - ignore_apple_restriction: 'Ignore order stop by apple points restriction' - task: - name: 'Name' - duration: 'Duration' - user_list: 'Responsible user' - required_users: 'People required' - due_date: 'Due date' - workgroup: 'Workgroup' - done: 'Done?' - message: - sent_to_all: 'Send to all members' - recipient_tokens: 'Recipients' - group_id: 'Group' - subject: 'Subject' - body: 'Body' - private: 'Private' - page: - body: 'Body' - parent_id: Parent page - supplier: - name: 'Name' - address: 'Address' - phone: 'Phone' - phone2: 'Phone 2' - fax: 'Fax' - email: 'Email' - url: 'Homepage' - contact_person: 'Contact person' - customer_number: 'Customer ID' - delivery_days: 'Delivery days' - order_howto: 'How to order' - note: 'Note' - min_order_quantity: 'Minimum order quantity' - is_subscribed: 'subscribed?' - article: - name: 'Name' - origin: 'Origin' - manufacturer: 'Manufacturer' - unit: 'Unit' - note: 'Note' - article_category: 'Category' - article_category: - name: 'Name' - description: 'Description' - stock_article: - supplier: 'Supplier' - delivery: - supplier: 'Supplier' - delivered_on: 'Delivery date' - user: - nick: 'Username' - name: "Name" - last_name: 'Last name' - email: 'Email' - phone: "Telephone" - ordergroup: 'Ordergroup' - workgroup: - one: 'Workgroup' - other: 'Workgroups' - order_comment: - text: Add comment to this order ... - order: - starts: 'Starts at' - ends: 'Ends at' - order_article: - article_id: Choose article from the catalogue - group_order_article: - ordergroup_id: Ordergroup - result: Amount - invoice: - supplier: Supplier - number: Number - date: Billing date - paid_on: Paid on - deposit: Charge deposit - deposit_credit: Credit deposit - amount: Amount - delivery: Delivery - order: Order - note: Note - order_article: - units_to_order: Amount of units - update_current_price: Globally update current price - - hints: - tax: 'In percentage, standard is 7,0' - task: - duration: 'How long will the task take, 1-3 hours' - required_users: 'How many users will be needed in total?' - supplier: - min_order_quantity: 'The minimum amount which has to be orderd will be shown during the order process and should motivate ordering' - article: - unit: 'For example: KG or 1L or 500g' - stock_article: - supplier: '' - message: - private: Message doesn’t show in Foodsoft mail inbox - order_article: - units_to_order: Amount of delivered units - update_current_price: Also update the price of the current order From 6569579c02104a019532779e7f2b03982a6bd795 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 14 Jun 2013 22:38:07 +0200 Subject: [PATCH 09/14] styles the preferences in user profile --- .../bootstrap_and_overrides.css.less | 18 ++++++++ app/views/shared/_user_form_fields.html.haml | 45 +++++++++++++------ config/locales/de.yml | 5 +++ config/locales/en.yml | 6 ++- 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/assets/stylesheets/bootstrap_and_overrides.css.less index 52f2f108..0d399fd5 100644 --- a/app/assets/stylesheets/bootstrap_and_overrides.css.less +++ b/app/assets/stylesheets/bootstrap_and_overrides.css.less @@ -208,3 +208,21 @@ tr.unavailable { dt { width: 160px; } dd { margin-left: 170px; } } + +.settings { + .settings-group { + margin-bottom: 10px; + .control-label { + margin: 5px 0 0 0; + } + } + .control-group { + margin-bottom: 5px; + } + .control-group.h_wrapper { + margin-bottom: 5px; + } + .control-group.select { + margin-bottom: 15px + } +} \ No newline at end of file diff --git a/app/views/shared/_user_form_fields.html.haml b/app/views/shared/_user_form_fields.html.haml index 21d5fe2b..0cfc5473 100644 --- a/app/views/shared/_user_form_fields.html.haml +++ b/app/views/shared/_user_form_fields.html.haml @@ -6,18 +6,37 @@ = f.input :password, :required => f.object.new_record? = f.input :password_confirmation -= f.simple_fields_for :settings_attributes do |s| - - = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| - = profile.input 'language', as: :select, collection: available_locales, required: false, selected: f.object.settings.profile['language'] - = profile.input 'phone_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['phone_is_public'] } - = profile.input 'email_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['email_is_public'] } - = profile.input 'name_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['name_is_public'] } +.settings + %h4 + =t 'simple_form.labels.settings.settings_groups' + = f.simple_fields_for :settings_attributes do |s| - = s.simple_fields_for :messages, defaults: { inline_label: true, label: false } do |messages| - = messages.input 'send_as_email', as: :boolean, input_html: { checked: f.object.settings.messages['send_as_email'] } + .settings-group + %div{class: 'control-group h_wrapper'} + %h5{class: 'control-label'} + = t 'simple_form.labels.settings.settings_group.profile' + + = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| + = profile.input 'language', as: :select, collection: available_locales, required: false, selected: f.object.settings.profile['language'] + = profile.input 'phone_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['phone_is_public'] } + = profile.input 'email_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['email_is_public'] } + = profile.input 'name_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['name_is_public'] } - = s.simple_fields_for :notify, defaults: { inline_label: true, label: false } do |notify| - = notify.input 'order_finished', as: :boolean, input_html: { checked: f.object.settings.notify['order_finished'] } - = notify.input 'negative_balance', as: :boolean, input_html: { checked: f.object.settings.notify['negative_balance'] } - = notify.input 'upcoming_tasks', as: :boolean, input_html: { checked: f.object.settings.notify['upcoming_tasks'] } + .settings-group + %div{class: 'control-group'} + %h5{class: 'control-label'} + =t 'simple_form.labels.settings.settings_group.messages' + + = s.simple_fields_for :messages, defaults: { inline_label: true, label: false } do |messages| + = messages.input 'send_as_email', as: :boolean, input_html: { checked: f.object.settings.messages['send_as_email'] } + + .settings-group + %div{class: 'control-group'} + %h5{class: 'control-label'} + = t 'simple_form.labels.settings.settings_group.notify' + + = s.simple_fields_for :notify, defaults: { inline_label: true, label: false } do |notify| + = notify.input 'order_finished', as: :boolean, input_html: { checked: f.object.settings.notify['order_finished'] } + = notify.input 'negative_balance', as: :boolean, input_html: { checked: f.object.settings.notify['negative_balance'] } + = notify.input 'upcoming_tasks', as: :boolean, input_html: { checked: f.object.settings.notify['upcoming_tasks'] } + \ No newline at end of file diff --git a/config/locales/de.yml b/config/locales/de.yml index f618345c..87e5e592 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1621,6 +1621,11 @@ de: one: Arbeitsgruppe other: Arbeitsgruppen settings: + settings_groups: Einstellungen + settings_group: + profile: Porfil + notify: Benachrichtigungen + messages: Nachrichten profile: language: Sprache phone_is_public: Telefon ist für Mitglieder sichtbar diff --git a/config/locales/en.yml b/config/locales/en.yml index f7d7098e..4974d16a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1624,7 +1624,11 @@ en: one: Workgroup other: Workgroups settings: - notify: + settings_groups: Preferences + settings_group: + profile: Porfile + notify: Notifications + messages: Messages profile: language: Language phone_is_public: Phone number is visible for other members. From c48ce138f377767f1d8ac53ff38263bdb04efa6d Mon Sep 17 00:00:00 2001 From: wvengen Date: Tue, 18 Jun 2013 12:20:26 +0200 Subject: [PATCH 10/14] cleanup of profile layout --- app/views/shared/_user_form_fields.html.haml | 59 +++++++++----------- config/locales/de.yml | 4 +- config/locales/en.yml | 4 +- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/app/views/shared/_user_form_fields.html.haml b/app/views/shared/_user_form_fields.html.haml index 0cfc5473..bfd27f49 100644 --- a/app/views/shared/_user_form_fields.html.haml +++ b/app/views/shared/_user_form_fields.html.haml @@ -6,37 +6,30 @@ = f.input :password, :required => f.object.new_record? = f.input :password_confirmation -.settings - %h4 - =t 'simple_form.labels.settings.settings_groups' - = f.simple_fields_for :settings_attributes do |s| - - .settings-group += f.simple_fields_for :settings_attributes do |s| + = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| + = profile.input 'language', as: :select, collection: available_locales, required: false, selected: f.object.settings.profile['language'] + + .settings + .settings-group + = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| + %div{class: 'control-group h_wrapper'} - %h5{class: 'control-label'} - = t 'simple_form.labels.settings.settings_group.profile' - - = s.simple_fields_for :profile, defaults: { inline_label: true } do |profile| - = profile.input 'language', as: :select, collection: available_locales, required: false, selected: f.object.settings.profile['language'] - = profile.input 'phone_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['phone_is_public'] } - = profile.input 'email_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['email_is_public'] } - = profile.input 'name_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['name_is_public'] } - - .settings-group - %div{class: 'control-group'} - %h5{class: 'control-label'} - =t 'simple_form.labels.settings.settings_group.messages' - - = s.simple_fields_for :messages, defaults: { inline_label: true, label: false } do |messages| - = messages.input 'send_as_email', as: :boolean, input_html: { checked: f.object.settings.messages['send_as_email'] } - - .settings-group - %div{class: 'control-group'} - %h5{class: 'control-label'} - = t 'simple_form.labels.settings.settings_group.notify' - - = s.simple_fields_for :notify, defaults: { inline_label: true, label: false } do |notify| - = notify.input 'order_finished', as: :boolean, input_html: { checked: f.object.settings.notify['order_finished'] } - = notify.input 'negative_balance', as: :boolean, input_html: { checked: f.object.settings.notify['negative_balance'] } - = notify.input 'upcoming_tasks', as: :boolean, input_html: { checked: f.object.settings.notify['upcoming_tasks'] } - \ No newline at end of file + %h5{class: 'controls'} + = t 'simple_form.labels.settings.settings_group.privacy' + = profile.input 'phone_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['phone_is_public'] } + = profile.input 'email_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['email_is_public'] } + = profile.input 'name_is_public', as: :boolean, label: false, input_html: { checked: f.object.settings.profile['name_is_public'] } + + .settings-group + %div{class: 'control-group'} + %h5{class: 'controls'} + = t 'simple_form.labels.settings.settings_group.messages' + + = s.simple_fields_for :messages, defaults: { inline_label: true, label: false } do |messages| + = messages.input 'send_as_email', as: :boolean, input_html: { checked: f.object.settings.messages['send_as_email'] } + = s.simple_fields_for :notify, defaults: { inline_label: true, label: false } do |notify| + = notify.input 'order_finished', as: :boolean, input_html: { checked: f.object.settings.notify['order_finished'] } + = notify.input 'negative_balance', as: :boolean, input_html: { checked: f.object.settings.notify['negative_balance'] } + = notify.input 'upcoming_tasks', as: :boolean, input_html: { checked: f.object.settings.notify['upcoming_tasks'] } + diff --git a/config/locales/de.yml b/config/locales/de.yml index 87e5e592..7990d756 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1621,10 +1621,8 @@ de: one: Arbeitsgruppe other: Arbeitsgruppen settings: - settings_groups: Einstellungen settings_group: - profile: Porfil - notify: Benachrichtigungen + privacy: messages: Nachrichten profile: language: Sprache diff --git a/config/locales/en.yml b/config/locales/en.yml index 4974d16a..bc1f5e33 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1624,10 +1624,8 @@ en: one: Workgroup other: Workgroups settings: - settings_groups: Preferences settings_group: - profile: Porfile - notify: Notifications + privacy: Privacy messages: Messages profile: language: Language From 0978b84f4de6620a6e0eb7f73b74d4f19a7e2ab0 Mon Sep 17 00:00:00 2001 From: wvengen Date: Fri, 28 Jun 2013 13:30:26 +0200 Subject: [PATCH 11/14] set user language on login to override session --- app/controllers/sessions_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index c89b818d..403c3616 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -11,6 +11,7 @@ class SessionsController < ApplicationController if user session[:user_id] = user.id session[:scope] = FoodsoftConfig.scope # Save scope in session to not allow switching between foodcoops with one account + session[:locale] = user_settings_language if session[:return_to].present? redirect_to_url = session[:return_to] session[:return_to] = nil From 206709aa61e871083e2605debaaeabae1ea3d43b Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 18 Jul 2013 16:09:32 +0200 Subject: [PATCH 12/14] sets session[:locale] = user.locale after login --- app/controllers/sessions_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index c89b818d..7ee29b6a 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -9,6 +9,7 @@ class SessionsController < ApplicationController def create user = User.authenticate(params[:nick], params[:password]) if user + session[:locale] = user.locale session[:user_id] = user.id session[:scope] = FoodsoftConfig.scope # Save scope in session to not allow switching between foodcoops with one account if session[:return_to].present? From dfe1cee4cd64dd76b0eef32a3b534fc2fd90b04c Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 18 Jul 2013 16:23:29 +0200 Subject: [PATCH 13/14] german i18n + mini fix --- app/controllers/sessions_controller.rb | 4 ++-- config/locales/de.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 06497456..7de1b9de 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -9,10 +9,10 @@ class SessionsController < ApplicationController def create user = User.authenticate(params[:nick], params[:password]) if user - session[:locale] = user.locale session[:user_id] = user.id session[:scope] = FoodsoftConfig.scope # Save scope in session to not allow switching between foodcoops with one account - session[:locale] = user_settings_language + session[:locale] = user.locale + if session[:return_to].present? redirect_to_url = session[:return_to] session[:return_to] = nil diff --git a/config/locales/de.yml b/config/locales/de.yml index 7990d756..5ecc1cce 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1622,7 +1622,7 @@ de: other: Arbeitsgruppen settings: settings_group: - privacy: + privacy: Privatsphäre messages: Nachrichten profile: language: Sprache From c85a7fcc5c8224e28f86092d7cdfcd2f1d75a2b9 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Thu, 18 Jul 2013 16:58:04 +0200 Subject: [PATCH 14/14] fixes User#receive_email? --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index aced06d7..ab11da32 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -66,7 +66,7 @@ class User < ActiveRecord::Base end def receive_email? - settings['messages.send_as_mail'] == "1" && email.present? + settings.messages['send_as_email'] == "1" && email.present? end # Sets the user's password. It will be stored encrypted along with a random salt.