ixtlan 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. data/History.txt +49 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Manifest.txt +73 -48
  4. data/Rakefile +1 -1
  5. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +3 -3
  6. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +1 -1
  7. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +1 -1
  8. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +2 -2
  9. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +2 -2
  10. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +2 -2
  11. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +2 -2
  12. data/generators/ixtlan_datamapper_rspec_model/ixtlan_datamapper_rspec_model_generator.rb +1 -1
  13. data/generators/ixtlan_datamapper_rspec_scaffold/ixtlan_datamapper_rspec_scaffold_generator.rb +4 -4
  14. data/generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb +7 -7
  15. data/generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb +1 -1
  16. data/generators/ixtlan_datamapper_rspec_scaffold/templates/layout.html.erb +20 -0
  17. data/ixtlan_rails_templates.rb +537 -0
  18. data/lib/ixtlan/audit_config.rb +5 -5
  19. data/lib/ixtlan/child_path.rb +2 -2
  20. data/lib/ixtlan/cms_script.rb +4 -4
  21. data/lib/ixtlan/controllers/authentications_controller.rb +7 -2
  22. data/lib/ixtlan/controllers/configurations_controller.rb +15 -6
  23. data/lib/ixtlan/controllers/domains_controller.rb +99 -0
  24. data/lib/ixtlan/controllers/groups_controller.rb +105 -0
  25. data/lib/ixtlan/controllers/locales_controller.rb +99 -0
  26. data/lib/ixtlan/controllers/permissions_controller.rb +5 -0
  27. data/lib/ixtlan/controllers/phrases_controller.rb +26 -22
  28. data/lib/ixtlan/controllers/search_query.rb +24 -0
  29. data/lib/ixtlan/controllers/texts_controller.rb +5 -5
  30. data/lib/ixtlan/controllers/users_controller.rb +117 -0
  31. data/lib/ixtlan/controllers/word_bundles_controller.rb +13 -8
  32. data/lib/ixtlan/digest.rb +3 -3
  33. data/lib/ixtlan/guard.rb +11 -12
  34. data/lib/ixtlan/logger_config.rb +11 -11
  35. data/lib/ixtlan/mailer/error_notification.erb +1 -0
  36. data/lib/ixtlan/mailer/password.erb +1 -0
  37. data/lib/ixtlan/mailer.rb +27 -0
  38. data/lib/ixtlan/models/authentication.rb +9 -6
  39. data/lib/ixtlan/models/configuration.rb +21 -37
  40. data/lib/ixtlan/models/configuration_locale.rb +3 -3
  41. data/lib/ixtlan/models/domain.rb +44 -0
  42. data/lib/ixtlan/models/domain_group_user.rb +22 -0
  43. data/lib/ixtlan/models/group.rb +82 -16
  44. data/lib/ixtlan/models/group_locale_user.rb +4 -4
  45. data/lib/ixtlan/models/group_user.rb +7 -7
  46. data/lib/ixtlan/models/i18n_text.rb +26 -26
  47. data/lib/ixtlan/models/locale.rb +17 -5
  48. data/lib/ixtlan/models/permission.rb +3 -2
  49. data/lib/ixtlan/models/phrase.rb +15 -15
  50. data/lib/ixtlan/models/role.rb +5 -5
  51. data/lib/ixtlan/models/translation.rb +9 -9
  52. data/lib/ixtlan/models/update_children.rb +74 -0
  53. data/lib/ixtlan/models/user.rb +108 -16
  54. data/lib/ixtlan/models/word.rb +2 -1
  55. data/lib/ixtlan/models.rb +1 -0
  56. data/lib/ixtlan/modified_by.rb +9 -7
  57. data/lib/ixtlan/monkey_patches.rb +5 -5
  58. data/lib/ixtlan/optimistic_persistence.rb +2 -2
  59. data/lib/ixtlan/optimistic_persistence_module.rb +3 -3
  60. data/lib/ixtlan/optimistic_persistence_validation.rb +2 -2
  61. data/lib/ixtlan/passwords.rb +15 -13
  62. data/lib/ixtlan/rails/error_handling.rb +41 -40
  63. data/lib/ixtlan/rails/guard.rb +0 -1
  64. data/lib/ixtlan/rails/migrations.rb +75 -0
  65. data/lib/ixtlan/rails/session_timeout.rb +16 -14
  66. data/lib/ixtlan/rails/timestamps_modified_by_filter.rb +1 -1
  67. data/lib/ixtlan/rails/unrestful_authentication.rb +4 -4
  68. data/lib/ixtlan/rolling_file.rb +3 -3
  69. data/lib/ixtlan/session.rb +4 -3
  70. data/lib/ixtlan/user_logger.rb +13 -9
  71. data/lib/ixtlan/version.rb +1 -1
  72. data/spec/authentication_spec.rb +1 -1
  73. data/spec/guard_spec.rb +4 -4
  74. data/spec/guards/samples.rb +7 -7
  75. data/spec/modified_by_spec.rb +82 -0
  76. data/spec/optimistic_persistence_spec.rb +58 -0
  77. data/spec/phrase_spec.rb +119 -0
  78. data/spec/session_timeout_spec.rb +59 -0
  79. data/spec/spec_helper.rb +6 -5
  80. data/spec/text_collection_spec.rb +88 -0
  81. data/spec/text_spec.rb +105 -0
  82. data/spec/unrestful_authentication_spec.rb +142 -0
  83. data/spec/user_logger_spec.rb +105 -0
  84. data/spec/user_spec.rb +249 -0
  85. data/whitespace.rb +31 -0
  86. metadata +76 -50
  87. data/lib/ixtlan/error_notifier/error_notification.rhtml +0 -1
@@ -0,0 +1,99 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module DomainsController
4
+
5
+ def self.included(base)
6
+ base.send(:include, Ixtlan::Controllers::SearchQuery)
7
+ end
8
+
9
+ public
10
+
11
+ # GET /domains
12
+ # GET /domains.xml
13
+ def index
14
+ @domains = Domain.all(simple_query(:name))
15
+
16
+ respond_to do |format|
17
+ format.html
18
+ format.xml { render :xml => @domains }
19
+ end
20
+ end
21
+
22
+ # GET /domains/1
23
+ # GET /domains/1.xml
24
+ def show
25
+ @domain = Domain.first_or_get!(params[:id])
26
+
27
+ respond_to do |format|
28
+ format.html # show.html.erb
29
+ format.xml { render :xml => @domain }
30
+ end
31
+ end
32
+
33
+ # GET /domains/new
34
+ # GET /domains/new.xml
35
+ def new
36
+ @domain = Domain.new
37
+
38
+ respond_to do |format|
39
+ format.html # new.html.erb
40
+ format.xml { render :xml => @domain }
41
+ end
42
+ end
43
+
44
+ # GET /domains/1/edit
45
+ def edit
46
+ @domain = Domain.first_or_get!(params[:id])
47
+ end
48
+
49
+ # POST /domains
50
+ # POST /domains.xml
51
+ def create
52
+ @domain = Domain.new(params[:domain])
53
+ @domain.current_user = current_user
54
+
55
+ respond_to do |format|
56
+ if @domain.save
57
+ flash[:notice] = 'Domain was successfully created.'
58
+ format.html { redirect_to(domain_url(@domain.id)) }
59
+ format.xml { render :xml => @domain, :status => :created, :location => domain_url(@domain.id) + ".xml" }
60
+ else
61
+ format.html { render :action => "new" }
62
+ format.xml { render :xml => @domain.errors, :status => :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # PUT /domains/1
68
+ # PUT /domains/1.xml
69
+ def update
70
+ @domain = Domain.first_or_get!(params[:id])
71
+ @domain.current_user = current_user
72
+
73
+ respond_to do |format|
74
+ if @domain.update(params[:domain]) or not @domain.dirty?
75
+ flash[:notice] = 'Domain was successfully updated.'
76
+ format.html { redirect_to(domain_url(@domain.id)) }
77
+ format.xml { render :xml => @domain }
78
+ else
79
+ format.html { render :action => "edit" }
80
+ format.xml { render :xml => @domain.errors, :status => :unprocessable_entity }
81
+ end
82
+ end
83
+ end
84
+
85
+ # DELETE /domains/1
86
+ # DELETE /domains/1.xml
87
+ def destroy
88
+ @domain = Domain.first_or_get(params[:id])
89
+ @domain.destroy if @domain
90
+
91
+ respond_to do |format|
92
+ flash[:notice] = 'Domain was successfully deleted.'
93
+ format.html { redirect_to(domains_url) }
94
+ format.xml { head :ok }
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,105 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module GroupsController
4
+
5
+ def self.included(base)
6
+ base.send(:include, Ixtlan::Controllers::SearchQuery)
7
+ end
8
+
9
+ public
10
+
11
+ # GET /groups
12
+ # GET /groups.xml
13
+ def index
14
+ @groups = Group.all(simple_query(:name))
15
+
16
+ respond_to do |format|
17
+ format.html
18
+ format.xml { render :xml => @groups }
19
+ end
20
+ end
21
+
22
+ # GET /groups/1
23
+ # GET /groups/1.xml
24
+ def show
25
+ @group = Group.first_or_get!(params[:id])
26
+
27
+ respond_to do |format|
28
+ format.html # show.html.erb
29
+ format.xml { render :xml => @group }
30
+ end
31
+ end
32
+
33
+ # GET /groups/new
34
+ # GET /groups/new.xml
35
+ def new
36
+ @group = Group.new
37
+
38
+ respond_to do |format|
39
+ format.html # new.html.erb
40
+ format.xml { render :xml => @group }
41
+ end
42
+ end
43
+
44
+ # GET /groups/1/edit
45
+ def edit
46
+ @group = Group.first_or_get!(params[:id])
47
+ end
48
+
49
+ # POST /groups
50
+ # POST /groups.xml
51
+ def create
52
+ group = params[:group] || {}
53
+ group.delete(:locales)
54
+ group.delete(:domains)
55
+ @group = Group.new(group)
56
+ @group.current_user = current_user
57
+
58
+ respond_to do |format|
59
+ if @group.save
60
+ flash[:notice] = 'Group was successfully created.'
61
+ format.html { redirect_to(group_url(@group.id)) }
62
+ format.xml { render :xml => @group, :status => :created, :location => group_url(@group.id) + ".xml" }
63
+ else
64
+ format.html { render :action => "new" }
65
+ format.xml { render :xml => @group.errors, :status => :unprocessable_entity }
66
+ end
67
+ end
68
+ end
69
+
70
+ # PUT /groups/1
71
+ # PUT /groups/1.xml
72
+ def update
73
+ @group = Group.first_or_get!(params[:id])
74
+ @group.current_user = current_user
75
+
76
+ @group.update_children((params[:group] || {}).delete(:locales), :locale)
77
+
78
+ respond_to do |format|
79
+ if @group.update(params[:group]) or not @group.dirty?
80
+ flash[:notice] = 'Group was successfully updated.'
81
+ format.html { redirect_to(group_url(@group.id)) }
82
+ format.xml { render :xml => @group }
83
+ else
84
+ format.html { render :action => "edit" }
85
+ format.xml { render :xml => @group.errors, :status => :unprocessable_entity }
86
+ end
87
+ end
88
+ end
89
+
90
+ # DELETE /groups/1
91
+ # DELETE /groups/1.xml
92
+ def destroy
93
+ @group = Group.first_or_get(params[:id])
94
+ @group.current_user = current_user
95
+ @group.destroy if @group
96
+
97
+ respond_to do |format|
98
+ flash[:notice] = 'Group was successfully deleted.'
99
+ format.html { redirect_to(groups_url) }
100
+ format.xml { head :ok }
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,99 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module LocalesController
4
+
5
+ def self.included(base)
6
+ base.send(:include, Ixtlan::Controllers::SearchQuery)
7
+ end
8
+
9
+ public
10
+
11
+ # GET /locales
12
+ # GET /locales.xml
13
+ def index
14
+ @locales = Locale.all(simple_query(:code))
15
+
16
+ respond_to do |format|
17
+ format.html
18
+ format.xml { render :xml => @locales }
19
+ end
20
+ end
21
+
22
+ # GET /locales/1
23
+ # GET /locales/1.xml
24
+ def show
25
+ @locale = Locale.first_or_get!(params[:id])
26
+
27
+ respond_to do |format|
28
+ format.html # show.html.erb
29
+ format.xml { render :xml => @locale }
30
+ end
31
+ end
32
+
33
+ # GET /locales/new
34
+ # GET /locales/new.xml
35
+ def new
36
+ @locale = Locale.new
37
+
38
+ respond_to do |format|
39
+ format.html # new.html.erb
40
+ format.xml { render :xml => @locale }
41
+ end
42
+ end
43
+
44
+ # GET /locales/1/edit
45
+ def edit
46
+ @locale = Locale.first_or_get!(params[:id])
47
+ end
48
+
49
+ # POST /locales
50
+ # POST /locales.xml
51
+ def create
52
+ @locale = Locale.new(params[:locale])
53
+ @locale.current_user = current_user
54
+
55
+ respond_to do |format|
56
+ if @locale.save
57
+ flash[:notice] = 'Locale was successfully created.'
58
+ format.html { redirect_to(locale_url(@locale.id)) }
59
+ format.xml { render :xml => @locale, :status => :created, :location => locale_url(@locale.id) + ".xml" }
60
+ else
61
+ format.html { render :action => "new" }
62
+ format.xml { render :xml => @locale.errors, :status => :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # PUT /locales/1
68
+ # PUT /locales/1.xml
69
+ def update
70
+ @locale = Locale.first_or_get!(params[:id])
71
+ @locale.current_user = current_user
72
+
73
+ respond_to do |format|
74
+ if @locale.update(params[:locale]) or not @locale.dirty?
75
+ flash[:notice] = 'Locale was successfully updated.'
76
+ format.html { redirect_to(locale_url(@locale.id)) }
77
+ format.xml { render :xml => @locale }
78
+ else
79
+ format.html { render :action => "edit" }
80
+ format.xml { render :xml => @locale.errors, :status => :unprocessable_entity }
81
+ end
82
+ end
83
+ end
84
+
85
+ # DELETE /locales/1
86
+ # DELETE /locales/1.xml
87
+ def destroy
88
+ @locale = Locale.first_or_get(params[:id])
89
+ @locale.destroy if @locale
90
+
91
+ respond_to do |format|
92
+ flash[:notice] = 'Locale was successfully deleted.'
93
+ format.html { redirect_to(locales_url) }
94
+ format.xml { head :ok }
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -2,6 +2,11 @@ module Ixtlan
2
2
  module Controllers
3
3
  module PermissionsController
4
4
 
5
+ def self.included(base)
6
+ # TODO the authenticate should NOT be there, i.e. it leaks too much info
7
+ base.skip_before_filter :authenticate, :guard
8
+ end
9
+
5
10
  def index
6
11
  render :xml => Ixtlan::Guard.export_xml
7
12
  end
@@ -1,15 +1,19 @@
1
1
  module Ixtlan
2
2
  module Controllers
3
3
  module PhrasesController
4
-
4
+
5
+ private
6
+
5
7
  LOCALE = Object.full_const_get(::Ixtlan::Models::LOCALE)
6
8
  TEXT = Object.full_const_get(::Ixtlan::Models::TEXT)
7
-
9
+
10
+ public
11
+
8
12
  def index
9
13
  version = params[:version]
10
-
11
- locale = if params[:locale]
12
- LOCALE.get!(params[:locale])
14
+
15
+ locale = if params[:locale]
16
+ LOCALE.get!(params[:locale])
13
17
  else
14
18
  LOCALE.default
15
19
  end
@@ -31,46 +35,46 @@ module Ixtlan
31
35
  render :xml => phrases.to_xml
32
36
  end
33
37
 
34
-
38
+
35
39
  def show
36
40
  word = Ixtlan::Models::Word.not_approved(:locale => Locale.default, :code => params[:id]).first
37
41
  if word
38
- phrase = word_to_phrase(word, :text)
42
+ phrase = word_to_phrase(word, :text)
39
43
  word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
40
44
  merge_word_into_phrase(word, phrase) if word
41
45
  else
42
46
  word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
43
- phrase = word_to_phrase(word, :current_text)
47
+ phrase = word_to_phrase(word, :current_text)
44
48
  end
45
49
  render :xml => phrase.to_xml
46
50
  end
47
51
 
48
52
  def create
49
53
  phrase = params[:phrase]
50
-
54
+
51
55
  # load the locale and delete the locale parameter array
52
56
  locale = LOCALE.get!(phrase.delete(:locale)[:code])
53
-
57
+
54
58
  if(TEXT.count(:version => nil, :code => phrase[:code], :locale => locale) == 1)
55
59
  logger.warn "precondition failed: " + phrase.inspect
56
60
  # mimic created action by just loading it
57
61
  render :xml => TEXT.first(:version => nil, :code => phrase[:code], :locale => locale).to_xml, :status => :created
58
62
  return
59
63
  end
60
-
64
+
61
65
  phrase[:text] ||= phrase.delete(:current_text)
62
-
66
+
63
67
  @text = TEXT.new(phrase)
64
68
  if(TEXT.count(:code => phrase[:code], :locale => locale) == 0)
65
69
  approve_it = true
66
70
  end
67
-
71
+
68
72
  # set the missing attributes
69
73
  @text.locale = locale
70
74
  @text.current_user = current_user
71
-
75
+
72
76
  respond_to do |format|
73
- success = @text.save
77
+ success = @text.save
74
78
  if success && approve_it
75
79
  @text.current_user = current_user
76
80
  success = @text.approve
@@ -85,19 +89,19 @@ module Ixtlan
85
89
  end
86
90
  end
87
91
  end
88
-
92
+
89
93
  def update
90
94
  new_text = params[:phrase][:text]
91
95
  word = TEXT.not_approved(:locale => Locale.default, :code => params[:id]).first
92
96
  if word
93
- phrase = word_to_phrase(word, :text)
97
+ phrase = word_to_phrase(word, :text)
94
98
  word_approved = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
95
99
  merge_word_into_phrase(word_approved, phrase) if word_approved
96
100
  else
97
101
  # take the latest approved text for the given code and create a new
98
102
  # text without version (!= not_approved text) for the given code
99
103
  word = TEXT.latest_approved(:locale => Locale.default, :code => params[:id]).first
100
- phrase = word_to_phrase(word, :current_text)
104
+ phrase = word_to_phrase(word, :current_text)
101
105
  word = TEXT.new(:code => params[:id], :locale => Locale.default)
102
106
  end
103
107
 
@@ -110,7 +114,7 @@ module Ixtlan
110
114
  else
111
115
  render :xml => word.errors, :status => :unprocessable_entity
112
116
  end
113
-
117
+
114
118
  end
115
119
 
116
120
  def approve
@@ -123,12 +127,12 @@ module Ixtlan
123
127
  render :xml => word.errors, :status => :unprocessable_entity
124
128
  end
125
129
  end
126
-
127
- # if there was no unapproved word or approval succeeded render
130
+
131
+ # if there was no unapproved word or approval succeeded render
128
132
  # the latest approved word
129
133
  unless word
130
134
  word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
131
- phrase = word_to_phrase(word, :current_text)
135
+ phrase = word_to_phrase(word, :current_text)
132
136
  render :xml => phrase.to_xml, :status => :ok
133
137
  end
134
138
  end
@@ -0,0 +1,24 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module SearchQuery
4
+
5
+ private
6
+
7
+ def simple_query(search_parameter)
8
+ args = {}
9
+ args[:limit] = params[:limit].to_i + 1 if params[:limit]
10
+ args[:offset] = params[:offset].to_i if params[:offset]
11
+
12
+ if login = params[search_parameter]
13
+ if "false" == params[:fuzzy]
14
+ args[search_parameter] = login
15
+ else
16
+ args[search_parameter.like] = "%" + login.to_s + "%"
17
+ end
18
+ end
19
+ args
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -2,11 +2,11 @@ module Ixtlan
2
2
  module Controllers
3
3
  module TextsController
4
4
 
5
+ private
6
+
5
7
  LOCALE = Object.full_const_get(::Ixtlan::Models::LOCALE)
6
8
  TEXT = Object.full_const_get(::Ixtlan::Models::TEXT)
7
-
8
- private
9
-
9
+
10
10
  def locale_guard
11
11
  # TODO
12
12
  end
@@ -44,7 +44,7 @@ module Ixtlan
44
44
  @text.current_user = current_user
45
45
 
46
46
  respond_to do |format|
47
- success = @text.save
47
+ success = @text.save
48
48
  if success && approve_it
49
49
  @text.current_user = current_user
50
50
  success = @text.approve
@@ -63,7 +63,7 @@ module Ixtlan
63
63
  def update
64
64
  phrase = params[:phrase]
65
65
  phrase[:text] ||= phrase.delete(:current_text)
66
-
66
+
67
67
  respond_to do |format|
68
68
  if @text.update(phrase)
69
69
  flash[:notice] = phrase[:text].nil? ? 'Text was successfully approved.' : 'Text was successfully updated.'
@@ -0,0 +1,117 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module UsersController
4
+
5
+ include SearchQuery
6
+
7
+ private
8
+
9
+ USER = Object.full_const_get(::Ixtlan::Models::USER)
10
+
11
+ def adjust_params(user_params)
12
+ lang = user_params.delete(:preferred_language)
13
+ user_params[:language] = lang.nil? ? nil : lang[:code][0..1]
14
+ user_params.delete(:groups)
15
+ end
16
+
17
+ public
18
+
19
+ # GET /users
20
+ # GET /users.xml
21
+ def index
22
+ @users = USER.all(simple_query(:login))
23
+
24
+ respond_to do |format|
25
+ format.html
26
+ format.xml { render :xml => @users }
27
+ end
28
+ end
29
+
30
+ # GET /users/1
31
+ # GET /users/1.xml
32
+ def show
33
+ @user = USER.first_or_get!(params[:id])
34
+
35
+ respond_to do |format|
36
+ format.html # show.html.erb
37
+ format.xml { render :xml => @user }
38
+ end
39
+ end
40
+
41
+ # GET /users/new
42
+ # GET /users/new.xml
43
+ def new
44
+ @user = USER.new
45
+
46
+ respond_to do |format|
47
+ format.html # new.html.erb
48
+ format.xml { render :xml => @user }
49
+ end
50
+ end
51
+
52
+ # GET /users/1/edit
53
+ def edit
54
+ @user = USER.first_or_get!(params[:id])
55
+ end
56
+
57
+ # POST /users
58
+ # POST /users.xml
59
+ def create
60
+ user_params = params[:user]
61
+ groups = adjust_params(user_params)
62
+ @user = USER.new(user_params)
63
+ @user.current_user = current_user
64
+ @user.reset_password
65
+ @user.update_all_children(groups)
66
+
67
+ respond_to do |format|
68
+ if @user.save
69
+ flash[:notice] = 'User was successfully created.'
70
+ format.html { redirect_to(user_url(@user.id)) }
71
+ format.xml { render :xml => @user, :status => :created, :location => user_url(@user.id) + ".xml" }
72
+
73
+ Mailer.deliver_password(@user.email, "Configuration.instance.password_sender_email", @user.password)
74
+ else
75
+ format.html { render :action => "new" }
76
+ format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
77
+ end
78
+ end
79
+ end
80
+
81
+ # PUT /users/1
82
+ # PUT /users/1.xml
83
+ def update
84
+ @user = USER.first_or_get!(params[:id])
85
+ @user.current_user = current_user
86
+ user_params = params[:user]
87
+ @user.update_all_children(adjust_params(user_params))
88
+ @user.attributes = user_params
89
+
90
+ respond_to do |format|
91
+ if @user.save() or not @user.dirty?
92
+ flash[:notice] = 'User was successfully updated.'
93
+ format.html { redirect_to(user_url(@user.id)) }
94
+ format.xml { render :xml => @user }
95
+ else
96
+ format.html { render :action => "edit" }
97
+ format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
98
+ end
99
+ end
100
+ end
101
+
102
+ # DELETE /users/1
103
+ # DELETE /users/1.xml
104
+ def destroy
105
+ @user = USER.first_or_get(params[:id])
106
+ # @user.current_user = current_user
107
+ @user.destroy if @user
108
+
109
+ respond_to do |format|
110
+ flash[:notice] = 'User was successfully deleted.'
111
+ format.html { redirect_to(users_url) }
112
+ format.xml { head :ok }
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -2,24 +2,29 @@ module Ixtlan
2
2
  module Controllers
3
3
  module WordBundlesController
4
4
 
5
- def show
6
- locale = params[:id]
5
+ def self.included(base)
6
+ # no guard since everyone needs to load the bundles
7
+ base.skip_before_filter :guard
8
+ end
9
+
10
+ def index
11
+ locale = params[:code]
7
12
  # TODO load in following order and allow to replace findings in the
8
13
  # intermediate result set
9
14
  # * DEFAULT not_approved
10
15
  # * DEFAULT latest_approved
11
16
  # * locale-parent latest_approved
12
17
  # * locale latest_approved
13
- l = Locale.get!(locale)
14
- wordMap = {}
18
+ l = Locale.first(:code => locale) || Locale.get!(locale)
19
+ word_bundle = {}
15
20
  Ixtlan::Models::Word.not_approved(:locale => Locale.default).each do |word|
16
- wordMap[word.code] = word
21
+ word_bundle[word.code] = word
17
22
  end
18
23
  Ixtlan::Models::Word.approved(:locale => Locale.default).each do |word|
19
- wordMap[word.code] = word
24
+ word_bundle[word.code] = word
20
25
  end
21
-
22
- render :xml => "<word_bundle><locale>#{locale}</locale><words>" + wordMap.values.collect { |w| w.to_xml }.join + "</words></word_bundle>"
26
+
27
+ render :xml => "<word_bundle><locale>#{locale}</locale><words>" + word_bundle.values.collect { |w| w.to_xml }.join + "</words></word_bundle>"
23
28
  end
24
29
  end
25
30
  end
data/lib/ixtlan/digest.rb CHANGED
@@ -6,9 +6,9 @@ module Ixtlan
6
6
  # @param salt String the salt for the password digester
7
7
  # @return the encoded password/salt
8
8
  def self.ssha(secret, salt)
9
- require 'sha1'
10
- require 'base64'
11
- (salt.empty? ? "{SHA}": "{SSHA}") +
9
+ require 'sha1'
10
+ require 'base64'
11
+ (salt.empty? ? "{SHA}": "{SSHA}") +
12
12
  Base64.encode64(::Digest::SHA1.digest(secret + salt) + salt).gsub(/\n/, '')
13
13
  end
14
14
  end