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.
- data/History.txt +49 -0
- data/MIT-LICENSE +20 -0
- data/Manifest.txt +73 -48
- data/Rakefile +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +3 -3
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +2 -2
- data/generators/ixtlan_datamapper_rspec_model/ixtlan_datamapper_rspec_model_generator.rb +1 -1
- data/generators/ixtlan_datamapper_rspec_scaffold/ixtlan_datamapper_rspec_scaffold_generator.rb +4 -4
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb +7 -7
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb +1 -1
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/layout.html.erb +20 -0
- data/ixtlan_rails_templates.rb +537 -0
- data/lib/ixtlan/audit_config.rb +5 -5
- data/lib/ixtlan/child_path.rb +2 -2
- data/lib/ixtlan/cms_script.rb +4 -4
- data/lib/ixtlan/controllers/authentications_controller.rb +7 -2
- data/lib/ixtlan/controllers/configurations_controller.rb +15 -6
- data/lib/ixtlan/controllers/domains_controller.rb +99 -0
- data/lib/ixtlan/controllers/groups_controller.rb +105 -0
- data/lib/ixtlan/controllers/locales_controller.rb +99 -0
- data/lib/ixtlan/controllers/permissions_controller.rb +5 -0
- data/lib/ixtlan/controllers/phrases_controller.rb +26 -22
- data/lib/ixtlan/controllers/search_query.rb +24 -0
- data/lib/ixtlan/controllers/texts_controller.rb +5 -5
- data/lib/ixtlan/controllers/users_controller.rb +117 -0
- data/lib/ixtlan/controllers/word_bundles_controller.rb +13 -8
- data/lib/ixtlan/digest.rb +3 -3
- data/lib/ixtlan/guard.rb +11 -12
- data/lib/ixtlan/logger_config.rb +11 -11
- data/lib/ixtlan/mailer/error_notification.erb +1 -0
- data/lib/ixtlan/mailer/password.erb +1 -0
- data/lib/ixtlan/mailer.rb +27 -0
- data/lib/ixtlan/models/authentication.rb +9 -6
- data/lib/ixtlan/models/configuration.rb +21 -37
- data/lib/ixtlan/models/configuration_locale.rb +3 -3
- data/lib/ixtlan/models/domain.rb +44 -0
- data/lib/ixtlan/models/domain_group_user.rb +22 -0
- data/lib/ixtlan/models/group.rb +82 -16
- data/lib/ixtlan/models/group_locale_user.rb +4 -4
- data/lib/ixtlan/models/group_user.rb +7 -7
- data/lib/ixtlan/models/i18n_text.rb +26 -26
- data/lib/ixtlan/models/locale.rb +17 -5
- data/lib/ixtlan/models/permission.rb +3 -2
- data/lib/ixtlan/models/phrase.rb +15 -15
- data/lib/ixtlan/models/role.rb +5 -5
- data/lib/ixtlan/models/translation.rb +9 -9
- data/lib/ixtlan/models/update_children.rb +74 -0
- data/lib/ixtlan/models/user.rb +108 -16
- data/lib/ixtlan/models/word.rb +2 -1
- data/lib/ixtlan/models.rb +1 -0
- data/lib/ixtlan/modified_by.rb +9 -7
- data/lib/ixtlan/monkey_patches.rb +5 -5
- data/lib/ixtlan/optimistic_persistence.rb +2 -2
- data/lib/ixtlan/optimistic_persistence_module.rb +3 -3
- data/lib/ixtlan/optimistic_persistence_validation.rb +2 -2
- data/lib/ixtlan/passwords.rb +15 -13
- data/lib/ixtlan/rails/error_handling.rb +41 -40
- data/lib/ixtlan/rails/guard.rb +0 -1
- data/lib/ixtlan/rails/migrations.rb +75 -0
- data/lib/ixtlan/rails/session_timeout.rb +16 -14
- data/lib/ixtlan/rails/timestamps_modified_by_filter.rb +1 -1
- data/lib/ixtlan/rails/unrestful_authentication.rb +4 -4
- data/lib/ixtlan/rolling_file.rb +3 -3
- data/lib/ixtlan/session.rb +4 -3
- data/lib/ixtlan/user_logger.rb +13 -9
- data/lib/ixtlan/version.rb +1 -1
- data/spec/authentication_spec.rb +1 -1
- data/spec/guard_spec.rb +4 -4
- data/spec/guards/samples.rb +7 -7
- data/spec/modified_by_spec.rb +82 -0
- data/spec/optimistic_persistence_spec.rb +58 -0
- data/spec/phrase_spec.rb +119 -0
- data/spec/session_timeout_spec.rb +59 -0
- data/spec/spec_helper.rb +6 -5
- data/spec/text_collection_spec.rb +88 -0
- data/spec/text_spec.rb +105 -0
- data/spec/unrestful_authentication_spec.rb +142 -0
- data/spec/user_logger_spec.rb +105 -0
- data/spec/user_spec.rb +249 -0
- data/whitespace.rb +31 -0
- metadata +76 -50
- 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
|
6
|
-
|
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
|
-
|
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
|
-
|
21
|
+
word_bundle[word.code] = word
|
17
22
|
end
|
18
23
|
Ixtlan::Models::Word.approved(:locale => Locale.default).each do |word|
|
19
|
-
|
24
|
+
word_bundle[word.code] = word
|
20
25
|
end
|
21
|
-
|
22
|
-
render :xml => "<word_bundle><locale>#{locale}</locale><words>" +
|
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
|