Commit a005c996574e07c974ae1fb2c833dd575182dbcb
1 parent
52591d04
Exists in
master
and in
29 other branches
ActionItem916: changed birth_date to use select forms
Had to convert the birth_date setting to a database column for active_record do its magic and couple with the date_select helper that is used on the pick_date helper
Showing
7 changed files
with
123 additions
and
7 deletions
Show diff stats
app/helpers/dates_helper.rb
@@ -86,8 +86,8 @@ module DatesHelper | @@ -86,8 +86,8 @@ module DatesHelper | ||
86 | link_to show_month(next_month_date.year, next_month_date.month) + ' →', :year => next_month_date.year, :month => next_month_date.month | 86 | link_to show_month(next_month_date.year, next_month_date.month) + ' →', :year => next_month_date.year, :month => next_month_date.month |
87 | end | 87 | end |
88 | 88 | ||
89 | - def pick_date(object, method) | ||
90 | - date_select(object, method, :use_month_names => MONTHS.map {|item| gettext(item)}) | 89 | + def pick_date(object, method, options = {}, html_options = {}) |
90 | + date_select(object, method, html_options.merge(options.merge(:use_month_names => MONTHS.map {|item| gettext(item)}))) | ||
91 | end | 91 | end |
92 | 92 | ||
93 | end | 93 | end |
app/models/person.rb
@@ -105,8 +105,8 @@ class Person < Profile | @@ -105,8 +105,8 @@ class Person < Profile | ||
105 | N_('Formation'); N_('Custom formation'); N_('Custom area of study'); | 105 | N_('Formation'); N_('Custom formation'); N_('Custom area of study'); |
106 | settings_items :formation, :custom_formation, :custom_area_of_study | 106 | settings_items :formation, :custom_formation, :custom_area_of_study |
107 | 107 | ||
108 | - N_('Contact information'); N_('Birth date'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code') | ||
109 | - settings_items :photo, :contact_information, :birth_date, :sex, :city, :state, :country, :zip_code | 108 | + N_('Contact information'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code') |
109 | + settings_items :photo, :contact_information, :sex, :city, :state, :country, :zip_code | ||
110 | 110 | ||
111 | def self.conditions_for_profiles(conditions, person) | 111 | def self.conditions_for_profiles(conditions, person) |
112 | new_conditions = sanitize_sql(['role_assignments.accessor_id = ?', person]) | 112 | new_conditions = sanitize_sql(['role_assignments.accessor_id = ?', person]) |
app/views/profile_editor/_person_form.rhtml
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | <%= optional_field(@person, 'cell_phone', f.text_field(:cell_phone)) %> | 14 | <%= optional_field(@person, 'cell_phone', f.text_field(:cell_phone)) %> |
15 | <%= optional_field(@person, 'comercial_phone', f.text_field(:comercial_phone)) %> | 15 | <%= optional_field(@person, 'comercial_phone', f.text_field(:comercial_phone)) %> |
16 | <%= optional_field(@person, 'sex', f.radio_group(:profile_data, :sex, [ ['male',_('Male')], ['female',_('Female')] ])) %> | 16 | <%= optional_field(@person, 'sex', f.radio_group(:profile_data, :sex, [ ['male',_('Male')], ['female',_('Female')] ])) %> |
17 | -<%= optional_field(@person, 'birth_date', f.text_field(:birth_date)) %> | 17 | +<%= optional_field(@person, 'birth_date', labelled_form_field(_('Birth date'), '<div class="select-birth-date">' + pick_date(:profile_data, :birth_date, {:start_year => (Date.today.year - 100), :end_year => (Date.today.year - 10)}) + '</div>')) %> |
18 | <%= optional_field(@person, 'address', labelled_form_field(_('Address (street and number)'), text_field(:profile_data, :address))) %> | 18 | <%= optional_field(@person, 'address', labelled_form_field(_('Address (street and number)'), text_field(:profile_data, :address))) %> |
19 | <%= optional_field(@person, 'zip_code', labelled_form_field(_('ZIP code'), text_field(:profile_data, :zip_code))) %> | 19 | <%= optional_field(@person, 'zip_code', labelled_form_field(_('ZIP code'), text_field(:profile_data, :zip_code))) %> |
20 | <%= optional_field(@person, 'city', f.text_field(:city)) %> | 20 | <%= optional_field(@person, 'city', f.text_field(:city)) %> |
@@ -0,0 +1,111 @@ | @@ -0,0 +1,111 @@ | ||
1 | +require File.dirname(__FILE__) + '/../../config/environment' | ||
2 | + | ||
3 | +class AddBirthDateToPerson < ActiveRecord::Migration | ||
4 | + | ||
5 | + class ConvertDates | ||
6 | + def self.convert(date_string) | ||
7 | + return if date_string.blank? | ||
8 | + return date_string if date_string.kind_of?(Date) | ||
9 | + return unless date_string.kind_of?(String) | ||
10 | + return if date_string =~ /[a-zA-Z]/ | ||
11 | + | ||
12 | + if date_string =~ /^\d\d([^\d]+)\d\d$/ | ||
13 | + date_string += $1 + (Date.today.year - 100).to_s | ||
14 | + end | ||
15 | + | ||
16 | + if date_string =~ /[^\d](\d\d)$/ | ||
17 | + year = $1.to_i | ||
18 | + date_string = date_string[0..-3] + (year > (Date.today.year - 2000) ? year + 1900 : year + 2000).to_s | ||
19 | + end | ||
20 | + | ||
21 | + date_string.gsub!('/', '.') | ||
22 | + Date.parse(date_string) | ||
23 | + end | ||
24 | + end | ||
25 | + | ||
26 | + class Person < ActiveRecord::Base | ||
27 | + set_table_name 'profiles' | ||
28 | + serialize :data, Hash | ||
29 | + end | ||
30 | + | ||
31 | + def self.up | ||
32 | + add_column :profiles, :birth_date, :date | ||
33 | + Person.find(:all).select{|p| p.type = 'Person'}.each do |p| | ||
34 | + p.birth_date = ConvertDates.convert(p.data[:birth_date].to_s) | ||
35 | + p.save | ||
36 | + end | ||
37 | + end | ||
38 | + | ||
39 | + def self.down | ||
40 | + remove_column :profiles, :birth_date | ||
41 | + end | ||
42 | +end | ||
43 | + | ||
44 | +if $PROGRAM_NAME == __FILE__ | ||
45 | + require File.dirname(__FILE__) + '/../../test/test_helper' | ||
46 | + | ||
47 | + class ConvertDatesTest < Test::Unit::TestCase | ||
48 | + | ||
49 | + should 'convert with slash' do | ||
50 | + date = ConvertDates.convert('10/01/2009') | ||
51 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | ||
52 | + end | ||
53 | + | ||
54 | + should 'convert with hyphen' do | ||
55 | + date = ConvertDates.convert('10-01-2009') | ||
56 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | ||
57 | + end | ||
58 | + | ||
59 | + should 'convert with dot' do | ||
60 | + date = ConvertDates.convert('10.01.2009') | ||
61 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | ||
62 | + end | ||
63 | + | ||
64 | + should 'convert with slash and space' do | ||
65 | + date = ConvertDates.convert('10/ 01/ 2009') | ||
66 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | ||
67 | + end | ||
68 | + | ||
69 | + should 'convert with empty to nil' do | ||
70 | + date = ConvertDates.convert('') | ||
71 | + assert_nil date | ||
72 | + end | ||
73 | + | ||
74 | + should 'convert with nil to nil' do | ||
75 | + date = ConvertDates.convert(nil) | ||
76 | + assert_nil date | ||
77 | + end | ||
78 | + | ||
79 | + should 'convert with two digits 1900' do | ||
80 | + date = ConvertDates.convert('10/01/99') | ||
81 | + assert_equal [10, 1, 1999], [date.day, date.month, date.year] | ||
82 | + end | ||
83 | + | ||
84 | + should 'convert with two digits 2000' do | ||
85 | + date = ConvertDates.convert('10/01/09') | ||
86 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | ||
87 | + end | ||
88 | + | ||
89 | + should 'convert with two numbers' do | ||
90 | + date = ConvertDates.convert('10/01') | ||
91 | + assert_equal [10, 1, (Date.today.year - 100)], [date.day, date.month, date.year] | ||
92 | + end | ||
93 | + | ||
94 | + should 'convert to nil if non-numeric date' do | ||
95 | + date = ConvertDates.convert('10 de agosto de 2009') | ||
96 | + assert_nil date | ||
97 | + end | ||
98 | + | ||
99 | + should 'do nothing if date' do | ||
100 | + date = ConvertDates.convert(Date.today) | ||
101 | + assert_equal Date.today, date | ||
102 | + end | ||
103 | + | ||
104 | + should 'return nil when not string nor date' do | ||
105 | + date = ConvertDates.convert(1001) | ||
106 | + assert_nil date | ||
107 | + end | ||
108 | + | ||
109 | + end | ||
110 | + | ||
111 | +end |
db/schema.rb
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | # | 9 | # |
10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | ||
12 | -ActiveRecord::Schema.define(:version => 58) do | 12 | +ActiveRecord::Schema.define(:version => 59) do |
13 | 13 | ||
14 | create_table "article_versions", :force => true do |t| | 14 | create_table "article_versions", :force => true do |t| |
15 | t.integer "article_id" | 15 | t.integer "article_id" |
@@ -232,6 +232,7 @@ ActiveRecord::Schema.define(:version => 58) do | @@ -232,6 +232,7 @@ ActiveRecord::Schema.define(:version => 58) do | ||
232 | t.text "custom_footer" | 232 | t.text "custom_footer" |
233 | t.string "theme" | 233 | t.string "theme" |
234 | t.boolean "public_profile", :default => true | 234 | t.boolean "public_profile", :default => true |
235 | + t.date "birth_date" | ||
235 | end | 236 | end |
236 | 237 | ||
237 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" | 238 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" |
public/stylesheets/person_data.css
test/functional/profile_editor_controller_test.rb
@@ -279,7 +279,7 @@ class ProfileEditorControllerTest < Test::Unit::TestCase | @@ -279,7 +279,7 @@ class ProfileEditorControllerTest < Test::Unit::TestCase | ||
279 | 279 | ||
280 | should 'render person partial' do | 280 | should 'render person partial' do |
281 | person = create_user('test_profile', :environment => Environment.default).person | 281 | person = create_user('test_profile', :environment => Environment.default).person |
282 | - Person.any_instance.expects(:active_fields).returns(['contact_phone', 'birth_date', 'address']).at_least_once | 282 | + Person.any_instance.expects(:active_fields).returns(['contact_phone', 'address']).at_least_once |
283 | get :edit, :profile => person.identifier | 283 | get :edit, :profile => person.identifier |
284 | person.active_fields.each do |field| | 284 | person.active_fields.each do |field| |
285 | assert_tag :tag => 'input', :attributes => { :name => "profile_data[#{field}]" } | 285 | assert_tag :tag => 'input', :attributes => { :name => "profile_data[#{field}]" } |