ixtlan 0.3.0 → 0.4.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ixtlan/logger_config.rb +1 -1
- data/lib/ixtlan/models/authentication.rb +18 -17
- data/lib/ixtlan/models/configuration.rb +21 -18
- data/lib/ixtlan/models/domain.rb +19 -18
- data/lib/ixtlan/models/group.rb +89 -92
- data/lib/ixtlan/models/i18n_text.rb +63 -59
- data/lib/ixtlan/models/locale.rb +29 -27
- data/lib/ixtlan/models/user.rb +77 -76
- data/lib/ixtlan/rails/migrations.rb +11 -11
- data/lib/ixtlan/version.rb +1 -1
- metadata +4 -4
data/lib/ixtlan/logger_config.rb
CHANGED
@@ -49,7 +49,7 @@ module Ixtlan
|
|
49
49
|
DataObjects::Sqlite3.logger = logger([appender,rails_appender], DataObjects)
|
50
50
|
|
51
51
|
# configure audit logger
|
52
|
-
Ixtlan::AuditConfig.configure(Ixtlan::Models::
|
52
|
+
Ixtlan::AuditConfig.configure(Object.full_const_get(Ixtlan::Models::CONFIGURATION).instance.keep_audit_logs,
|
53
53
|
log_filebase('audit'),
|
54
54
|
[
|
55
55
|
Ixtlan::Models::User,
|
@@ -1,32 +1,33 @@
|
|
1
1
|
require 'dm-serializer'
|
2
2
|
module Ixtlan
|
3
3
|
module Models
|
4
|
-
|
5
|
-
include DataMapper::Resource
|
4
|
+
module Authentication
|
6
5
|
|
7
|
-
def self.
|
8
|
-
|
9
|
-
end
|
6
|
+
def self.included(model)
|
7
|
+
model.send(:include, DataMapper::Resource)
|
10
8
|
|
11
|
-
|
9
|
+
model.property :id, ::DataMapper::Types::Serial, :default => 1
|
12
10
|
|
13
|
-
|
11
|
+
model.property :login, String,:format => /^[a-zA-Z0-9\-!=+$%^&*\(\){}|\[\]<>_.]*$/
|
14
12
|
|
15
|
-
|
13
|
+
model.property :password, String,:format => /^[a-zA-Z0-9_.]*$/
|
16
14
|
|
17
|
-
|
15
|
+
model.send :attr_accessor, :token
|
18
16
|
|
19
|
-
|
17
|
+
model.belongs_to :user, :model => ::Ixtlan::Models::USER
|
20
18
|
|
21
|
-
|
19
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
20
|
+
if protected_instance_methods.find {|m| m == 'to_x'}.nil?
|
22
21
|
|
23
|
-
|
22
|
+
protected
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
alias :to_x :to_xml_document
|
25
|
+
def to_xml_document(opts, doc = nil)
|
26
|
+
opts.merge!({:exclude => [:password,:user_id], :methods => [:token, :user]})
|
27
|
+
to_x(opts, doc)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
EOS
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
@@ -4,37 +4,38 @@ require 'dm-serializer'
|
|
4
4
|
require 'ixtlan/models/update_children'
|
5
5
|
module Ixtlan
|
6
6
|
module Models
|
7
|
-
|
8
|
-
include DataMapper::Resource
|
9
|
-
include UpdateChildren
|
7
|
+
module Configuration
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
def self.default_storage_name
|
14
|
-
"Configuration"
|
9
|
+
unless const_defined? "LOCALE"
|
10
|
+
LOCALE = Object.full_const_get(Models::LOCALE)
|
15
11
|
end
|
16
12
|
|
17
|
-
|
13
|
+
def self.included(model)
|
14
|
+
model.send(:include, DataMapper::Resource)
|
15
|
+
model.send(:include, UpdateChildren)
|
16
|
+
|
17
|
+
model.property :id, ::DataMapper::Types::Serial
|
18
18
|
|
19
|
-
|
19
|
+
model.property :session_idle_timeout, Integer, :required => true
|
20
20
|
|
21
|
-
|
21
|
+
model.property :keep_audit_logs, Integer, :required => true
|
22
22
|
|
23
|
-
|
23
|
+
model.property :password_sender_email, String, :format => :email_address, :required => false, :length => 64
|
24
24
|
|
25
|
-
|
25
|
+
model.property :notification_sender_email, String, :format => :email_address, :required => false, :length => 64
|
26
26
|
|
27
|
-
|
27
|
+
model.property :notification_recipient_emails, String, :format => Proc.new { |email| emails = email.split(','); emails.find_all { |e| e =~ DataMapper::Validate::Format::Email::EmailAddress }.size == emails.size}, :required => false, :length => 254 #honour mysql max varchar length
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
model.property :errors_dump_directory, String, :required => false, :length => 192
|
30
|
+
model.property :logfiles_directory, String, :required => false, :length => 192
|
31
31
|
|
32
|
-
|
32
|
+
model.timestamps :updated_at
|
33
33
|
|
34
|
-
|
34
|
+
model.modified_by ::Ixtlan::Models::USER, :updated_by
|
35
35
|
|
36
|
-
|
36
|
+
model.has model.n, :locales, :model => ::Ixtlan::Models::LOCALE, :through => DataMapper::Resource
|
37
37
|
|
38
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
38
39
|
def self.instance
|
39
40
|
# HACK: return a new object in case there is none in the database
|
40
41
|
# to allow rails rake tasks to work with an empty database
|
@@ -53,6 +54,8 @@ module Ixtlan
|
|
53
54
|
end
|
54
55
|
to_x(opts, doc)
|
55
56
|
end
|
57
|
+
EOS
|
58
|
+
end
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
data/lib/ixtlan/models/domain.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
require 'dm-serializer'
|
2
2
|
module Ixtlan
|
3
3
|
module Models
|
4
|
-
|
5
|
-
include DataMapper::Resource
|
6
|
-
|
7
|
-
def self.default_storage_name
|
8
|
-
"Domain"
|
9
|
-
end
|
4
|
+
module Domain
|
10
5
|
|
11
6
|
unless const_defined? "ALL"
|
12
7
|
ALL = "ALL"
|
13
8
|
end
|
14
9
|
|
15
|
-
|
16
|
-
|
10
|
+
def self.included(model)
|
11
|
+
model.send(:include, DataMapper::Resource)
|
12
|
+
|
13
|
+
model.property :id, ::DataMapper::Types::Serial
|
14
|
+
|
15
|
+
model.property :name, String, :required => true , :format => /^[a-z]+$|^#{ALL}$/, :length => 32, :unique_index => true
|
17
16
|
|
18
|
-
|
17
|
+
model.timestamps :created_at
|
19
18
|
|
20
|
-
|
19
|
+
model.modified_by Models::USER, :created_by
|
21
20
|
|
21
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
22
22
|
def self.every
|
23
23
|
first(:name => ALL)
|
24
24
|
end
|
@@ -30,15 +30,16 @@ module Ixtlan
|
|
30
30
|
def self.first_or_get(id_or_name)
|
31
31
|
first(:name => id_or_name) || get(id_or_name)
|
32
32
|
end
|
33
|
+
EOS
|
34
|
+
end
|
35
|
+
def hash
|
36
|
+
attribute_get(:name).hash
|
37
|
+
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
alias :eql? :==
|
39
|
-
def ==(other)
|
40
|
-
attribute_get(:name).eql?(other.attribute_get(:name))
|
41
|
-
end
|
39
|
+
alias :eql? :==
|
40
|
+
def ==(other)
|
41
|
+
attribute_get(:name).eql?(other.attribute_get(:name))
|
42
42
|
end
|
43
43
|
end
|
44
|
+
end
|
44
45
|
end
|
data/lib/ixtlan/models/group.rb
CHANGED
@@ -2,29 +2,35 @@ require 'dm-serializer'
|
|
2
2
|
require 'ixtlan/models/update_children'
|
3
3
|
module Ixtlan
|
4
4
|
module Models
|
5
|
-
|
6
|
-
include DataMapper::Resource
|
7
|
-
include UpdateChildren
|
8
|
-
|
9
|
-
#p LOCALE
|
10
|
-
# TODO where is LOCALE defined and remove the double defintion
|
11
|
-
|
5
|
+
module Group
|
12
6
|
unless const_defined? "LOCALE"
|
13
7
|
LOCALE = Object.full_const_get(Models::LOCALE)
|
14
8
|
DOMAIN = Object.full_const_get(Models::DOMAIN)
|
15
9
|
end
|
16
10
|
|
17
|
-
def self.
|
18
|
-
|
19
|
-
|
11
|
+
def self.included(model)
|
12
|
+
model.send(:include, DataMapper::Resource)
|
13
|
+
model.send(:include, UpdateChildren)
|
14
|
+
|
15
|
+
model.property :id, ::DataMapper::Types::Serial, :field => "gidnumber"
|
20
16
|
|
21
|
-
|
17
|
+
model.property :name, String, :required => true , :format => /^[^<'&">]*$/, :length => 32, :field => "cn", :unique_index => true
|
22
18
|
|
23
|
-
|
19
|
+
model.timestamps :created_at
|
24
20
|
|
25
|
-
|
21
|
+
model.modified_by Ixtlan::Models::USER, :created_by
|
26
22
|
|
27
|
-
|
23
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
24
|
+
if protected_instance_methods.find {|m| m == 'to_x'}.nil?
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
alias :to_x :to_xml_document
|
29
|
+
def to_xml_document(opts, doc = nil)
|
30
|
+
opts.merge!({:methods => [:locales, :domains], :exclude => [:created_by_id]})
|
31
|
+
to_x(opts, doc)
|
32
|
+
end
|
33
|
+
end
|
28
34
|
|
29
35
|
def self.first_or_get!(id_or_name)
|
30
36
|
first(:name => id_or_name) || get!(id_or_name)
|
@@ -33,103 +39,94 @@ module Ixtlan
|
|
33
39
|
def self.first_or_get(id_or_name)
|
34
40
|
first(:name => id_or_name) || get(id_or_name)
|
35
41
|
end
|
42
|
+
EOS
|
43
|
+
end
|
36
44
|
|
37
|
-
|
38
|
-
|
45
|
+
def locales(user = nil)
|
46
|
+
if @locales.nil? or not user.nil?
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
# TODO spec the empty array to make sure new relations are stored
|
49
|
+
# in the database or the locales collection is empty before filling it
|
50
|
+
@locales = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, LOCALE), [])
|
43
51
|
|
44
|
-
|
52
|
+
return @locales if user.nil?
|
45
53
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
super
|
59
|
-
end
|
60
|
-
|
61
|
-
self
|
62
|
-
end
|
63
|
-
def @locales.delete(locale)
|
64
|
-
glu = GroupLocaleUser.first(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
|
65
|
-
if glu
|
66
|
-
glu.destroy
|
67
|
-
end
|
54
|
+
GroupLocaleUser.all(:group_id => id, :user_id => user.id).each{ |glu| @locales << glu.locale }
|
55
|
+
def @locales.group=(group)
|
56
|
+
@group = group
|
57
|
+
end
|
58
|
+
@locales.group = self
|
59
|
+
def @locales.user=(user)
|
60
|
+
@user = user
|
61
|
+
end
|
62
|
+
@locales.user = user
|
63
|
+
def @locales.<<(locale)
|
64
|
+
unless member? locale
|
65
|
+
GroupLocaleUser.create(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
|
68
66
|
super
|
69
67
|
end
|
68
|
+
|
69
|
+
self
|
70
|
+
end
|
71
|
+
def @locales.delete(locale)
|
72
|
+
glu = GroupLocaleUser.first(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
|
73
|
+
if glu
|
74
|
+
glu.destroy
|
75
|
+
end
|
76
|
+
super
|
70
77
|
end
|
71
|
-
@locales
|
72
78
|
end
|
79
|
+
@locales
|
80
|
+
end
|
73
81
|
|
74
|
-
|
75
|
-
|
82
|
+
def domains(user = nil)
|
83
|
+
if @domains.nil? or not user.nil?
|
76
84
|
|
77
|
-
|
78
|
-
|
79
|
-
|
85
|
+
# TODO spec the empty array to make sure new relations are stored
|
86
|
+
# in the database or the domains collection is empty before filling it
|
87
|
+
@domains = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, DOMAIN), [])
|
80
88
|
|
81
|
-
|
89
|
+
return @domains if user.nil?
|
82
90
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
super
|
96
|
-
end
|
97
|
-
|
98
|
-
self
|
99
|
-
end
|
100
|
-
def @domains.delete(domain)
|
101
|
-
glu = DomainGroupUser.first(:group_id => @group.id, :user_id => @user.id, :domain_id => domain.id)
|
102
|
-
if glu
|
103
|
-
glu.destroy
|
104
|
-
end
|
91
|
+
DomainGroupUser.all(:group_id => id, :user_id => user.id).each{ |glu| @domains << glu.domain }
|
92
|
+
def @domains.group=(group)
|
93
|
+
@group = group
|
94
|
+
end
|
95
|
+
@domains.group = self
|
96
|
+
def @domains.user=(user)
|
97
|
+
@user = user
|
98
|
+
end
|
99
|
+
@domains.user = user
|
100
|
+
def @domains.<<(domain)
|
101
|
+
unless member? domain
|
102
|
+
DomainGroupUser.create(:group_id => @group.id, :user_id => @user.id, :domain_id => domain.id)
|
105
103
|
super
|
106
104
|
end
|
107
|
-
end
|
108
|
-
@domains
|
109
|
-
end
|
110
105
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
attribute_get(:name) == 'domains'
|
106
|
+
self
|
107
|
+
end
|
108
|
+
def @domains.delete(domain)
|
109
|
+
glu = DomainGroupUser.first(:group_id => @group.id, :user_id => @user.id, :domain_id => domain.id)
|
110
|
+
if glu
|
111
|
+
glu.destroy
|
112
|
+
end
|
113
|
+
super
|
114
|
+
end
|
121
115
|
end
|
116
|
+
@domains
|
117
|
+
end
|
122
118
|
|
123
|
-
|
119
|
+
def root?
|
120
|
+
attribute_get(:name) == 'root'
|
121
|
+
end
|
124
122
|
|
125
|
-
|
123
|
+
def locales_admin?
|
124
|
+
attribute_get(:name) == 'locales'
|
125
|
+
end
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
opts.merge!({:methods => [:locales, :domains], :exclude => [:created_by_id]})
|
130
|
-
to_x(opts, doc)
|
131
|
-
end
|
132
|
-
end
|
127
|
+
def domains_admin?
|
128
|
+
attribute_get(:name) == 'domains'
|
133
129
|
end
|
134
130
|
end
|
135
131
|
end
|
132
|
+
end
|
@@ -1,36 +1,7 @@
|
|
1
1
|
require 'dm-serializer'
|
2
2
|
module Ixtlan
|
3
3
|
module Models
|
4
|
-
|
5
|
-
include DataMapper::Resource
|
6
|
-
|
7
|
-
def self.default_storage_name
|
8
|
-
"Text"
|
9
|
-
end
|
10
|
-
|
11
|
-
property :id, Serial
|
12
|
-
|
13
|
-
property :code, String, :required => true, :length => 64
|
14
|
-
|
15
|
-
property :text, String, :required => true, :length => 256
|
16
|
-
|
17
|
-
property :version, Integer, :required => false
|
18
|
-
|
19
|
-
property :current, Boolean, :required => true, :auto_validation => false
|
20
|
-
|
21
|
-
property :previous, Boolean, :required => true, :auto_validation => false
|
22
|
-
|
23
|
-
property :updated_at, DateTime, :required => true, :auto_validation => false
|
24
|
-
|
25
|
-
belongs_to :updated_by, :model => Models::USER
|
26
|
-
|
27
|
-
property :approved_at, DateTime, :required => false
|
28
|
-
|
29
|
-
belongs_to :approved_by, :model => Models::USER, :required => false
|
30
|
-
|
31
|
-
belongs_to :locale, :model => Models::LOCALE
|
32
|
-
|
33
|
-
validates_with_method :invariant
|
4
|
+
module I18nText
|
34
5
|
|
35
6
|
def invariant
|
36
7
|
no_version = original_attributes[:version].nil? && attribute_get(:version).nil?
|
@@ -63,8 +34,6 @@ module Ixtlan
|
|
63
34
|
end
|
64
35
|
end
|
65
36
|
|
66
|
-
validates_with_method :cascade
|
67
|
-
|
68
37
|
def cascade
|
69
38
|
size =
|
70
39
|
case locale.code.size
|
@@ -82,16 +51,6 @@ module Ixtlan
|
|
82
51
|
end
|
83
52
|
end
|
84
53
|
|
85
|
-
before :save do
|
86
|
-
if(new? or attribute_get(:version).nil?)
|
87
|
-
attribute_set(:version, nil)
|
88
|
-
attribute_set(:current, false)
|
89
|
-
attribute_set(:previous, false)
|
90
|
-
attribute_set(:approved_at, nil)
|
91
|
-
approved_by = nil
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
54
|
def approve(params = {})
|
96
55
|
latest = self.class.latest_approved(:code => attribute_get(:code),
|
97
56
|
:locale => locale).first
|
@@ -99,7 +58,7 @@ module Ixtlan
|
|
99
58
|
:locale => locale).first
|
100
59
|
params[:version] = latest.nil? ? 1 : latest.version + 1
|
101
60
|
params[:current] = true
|
102
|
-
# TODO approved is not need since after approval the resource is inmutable !!!
|
61
|
+
# TODO approved is not need since after approval the resource is inmutable !!!
|
103
62
|
params[:approved_at] = attribute_get(:updated_at)
|
104
63
|
params[:approved_by] = params[:current_user] || current_user
|
105
64
|
|
@@ -117,25 +76,70 @@ module Ixtlan
|
|
117
76
|
!attribute_get(:version).nil?
|
118
77
|
end
|
119
78
|
|
120
|
-
def self.
|
121
|
-
|
122
|
-
|
123
|
-
end
|
79
|
+
def self.included(model)
|
80
|
+
model.send(:include, DataMapper::Resource)
|
81
|
+
model.send(:include, UpdateChildren)
|
124
82
|
|
125
|
-
|
126
|
-
args[:previous] = true
|
127
|
-
all(args)
|
128
|
-
end
|
83
|
+
model.property :id, ::DataMapper::Types::Serial
|
129
84
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
end
|
85
|
+
model.property :code, String, :required => true, :length => 64
|
86
|
+
|
87
|
+
model.property :text, String, :required => true, :length => 256
|
134
88
|
|
135
|
-
|
136
|
-
|
137
|
-
|
89
|
+
model.property :version, Integer, :required => false
|
90
|
+
|
91
|
+
model.property :current, Boolean, :required => true, :auto_validation => false
|
92
|
+
|
93
|
+
model.property :previous, Boolean, :required => true, :auto_validation => false
|
94
|
+
|
95
|
+
model.property :updated_at, DateTime, :required => true, :auto_validation => false
|
96
|
+
|
97
|
+
model.belongs_to :updated_by, :model => Models::USER
|
98
|
+
|
99
|
+
model.property :approved_at, DateTime, :required => false
|
100
|
+
|
101
|
+
model.belongs_to :approved_by, :model => Models::USER, :required => false
|
102
|
+
|
103
|
+
model.belongs_to :locale, :model => Models::LOCALE
|
104
|
+
|
105
|
+
model.validates_with_method :invariant
|
106
|
+
|
107
|
+
model.validates_with_method :cascade
|
108
|
+
model.before :save do
|
109
|
+
if(new? or attribute_get(:version).nil?)
|
110
|
+
attribute_set(:version, nil)
|
111
|
+
attribute_set(:current, false)
|
112
|
+
attribute_set(:previous, false)
|
113
|
+
attribute_set(:approved_at, nil)
|
114
|
+
approved_by = nil
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
119
|
+
def self.default_storage_name
|
120
|
+
"Text"
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.latest_approved(args = {})
|
124
|
+
args[:current] = true
|
125
|
+
all(args)
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.second_latest_approved(args = {})
|
129
|
+
args[:previous] = true
|
130
|
+
all(args)
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.approved(args = {})
|
134
|
+
args[:version.not] = nil
|
135
|
+
all(args)
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.not_approved(args = {})
|
139
|
+
args[:version] = nil
|
140
|
+
all(args)
|
141
|
+
end
|
142
|
+
EOS
|
138
143
|
end
|
139
144
|
end
|
140
145
|
end
|
141
|
-
end
|
data/lib/ixtlan/models/locale.rb
CHANGED
@@ -1,37 +1,25 @@
|
|
1
1
|
require 'dm-serializer'
|
2
2
|
module Ixtlan
|
3
3
|
module Models
|
4
|
-
|
5
|
-
include DataMapper::Resource
|
6
|
-
|
7
|
-
def self.default_storage_name
|
8
|
-
"Locale"
|
9
|
-
end
|
4
|
+
module Locale
|
10
5
|
|
11
6
|
unless const_defined? "DEFAULT"
|
12
7
|
DEFAULT = "DEFAULT"
|
13
8
|
ALL = "ALL"
|
14
9
|
end
|
15
10
|
|
16
|
-
|
17
|
-
|
11
|
+
def self.included(model)
|
12
|
+
model.send(:include, DataMapper::Resource)
|
18
13
|
|
19
|
-
|
14
|
+
model.property :id, ::DataMapper::Types::Serial
|
20
15
|
|
21
|
-
|
16
|
+
model.property :code, String, :required => true , :format => /^[a-z][a-z](_[A-Z][A-Z])?$|^#{DEFAULT}$|^#{ALL}$/, :length => 7, :unique_index => true
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
when 2
|
27
|
-
self.model.default
|
28
|
-
when 5
|
29
|
-
self.model.get!(code[0,2])
|
30
|
-
else
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
end
|
18
|
+
model.timestamps :created_at
|
19
|
+
|
20
|
+
model.modified_by Models::USER, :created_by
|
34
21
|
|
22
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
35
23
|
def self.default
|
36
24
|
first(:code => DEFAULT)
|
37
25
|
end
|
@@ -47,15 +35,29 @@ module Ixtlan
|
|
47
35
|
def self.first_or_get(id_or_code)
|
48
36
|
first(:code => id_or_code) || get(id_or_code)
|
49
37
|
end
|
38
|
+
EOS
|
39
|
+
end
|
50
40
|
|
51
|
-
|
52
|
-
|
41
|
+
def parent
|
42
|
+
c = attribute_get(:code)
|
43
|
+
case c.size
|
44
|
+
when 2
|
45
|
+
self.model.default
|
46
|
+
when 5
|
47
|
+
self.model.get!(code[0,2])
|
48
|
+
else
|
49
|
+
nil
|
53
50
|
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def hash
|
54
|
+
attribute_get(:code).hash
|
55
|
+
end
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
57
|
+
alias :eql? :==
|
58
|
+
def ==(other)
|
59
|
+
attribute_get(:code).eql?(other.attribute_get(:code))
|
59
60
|
end
|
60
61
|
end
|
62
|
+
end
|
61
63
|
end
|
data/lib/ixtlan/models/user.rb
CHANGED
@@ -5,37 +5,25 @@ require 'dm-serializer'
|
|
5
5
|
require 'ixtlan/models/update_children'
|
6
6
|
module Ixtlan
|
7
7
|
module Models
|
8
|
-
|
9
|
-
include DataMapper::Resource
|
10
|
-
include UpdateChildren
|
8
|
+
module User
|
11
9
|
|
12
10
|
GROUP = Object.full_const_get(Models::GROUP)
|
13
11
|
|
14
|
-
def
|
15
|
-
|
12
|
+
def root?
|
13
|
+
groups.detect { |g| g.root? } || false
|
16
14
|
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
property :name, String, :required => true, :format => /^[^<">]*$/, :length => 2..64, :field => "cn"
|
23
|
-
|
24
|
-
property :email, String, :required => true, :format => :email_address, :required => true, :length => 8..64, :unique_index => true, :field => "mail"
|
25
|
-
|
26
|
-
property :language, String, :required => false, :format => /[a-z][a-z]/, :length => 2, :field => "preferredlanguage"
|
27
|
-
|
28
|
-
property :hashed_password, String, :required => false, :length => 128, :accessor => :private, :field => "userpassword"
|
29
|
-
|
30
|
-
timestamps :at
|
31
|
-
|
32
|
-
modified_by ::Ixtlan::Models::USER
|
16
|
+
def locales_admin?
|
17
|
+
groups.detect { |g| g.locales_admin? } || false
|
18
|
+
end
|
33
19
|
|
34
|
-
|
35
|
-
|
20
|
+
def domains_admin?
|
21
|
+
groups.detect { |g| g.domains_admin? } || false
|
22
|
+
end
|
36
23
|
|
37
|
-
|
38
|
-
|
24
|
+
def password
|
25
|
+
@password
|
26
|
+
end
|
39
27
|
|
40
28
|
def reset_password(len = 12)
|
41
29
|
@password = Ixtlan::Passwords.generate(len)
|
@@ -46,30 +34,6 @@ module Ixtlan
|
|
46
34
|
def digest
|
47
35
|
::Base64.decode64(@hashed_password[6,200])
|
48
36
|
end
|
49
|
-
|
50
|
-
def self.authenticate(login, password)
|
51
|
-
user = first(:login => login) # need to get the salt
|
52
|
-
if user
|
53
|
-
digest = user.digest
|
54
|
-
salt = digest[20,147]
|
55
|
-
if ::Digest::SHA1.digest("#{password}" + salt) == digest[0,20]
|
56
|
-
user
|
57
|
-
else
|
58
|
-
"wrong password"
|
59
|
-
end
|
60
|
-
else
|
61
|
-
"unknown login"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.first_or_get!(id_or_login)
|
66
|
-
first(:login => id_or_login) || get!(id_or_login)
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.first_or_get(id_or_login)
|
70
|
-
first(:login => id_or_login) || get(id_or_login)
|
71
|
-
end
|
72
|
-
|
73
37
|
def groups
|
74
38
|
if @groups.nil?
|
75
39
|
# TODO spec the empty array to make sure new relations are stored
|
@@ -108,23 +72,6 @@ module Ixtlan
|
|
108
72
|
@groups
|
109
73
|
end
|
110
74
|
|
111
|
-
# make sure login is immutable
|
112
|
-
def login=(new_login)
|
113
|
-
attribute_set(:login, new_login) if login.nil?
|
114
|
-
end
|
115
|
-
|
116
|
-
def root?
|
117
|
-
groups.detect { |g| g.root? } || false
|
118
|
-
end
|
119
|
-
|
120
|
-
def locales_admin?
|
121
|
-
groups.detect { |g| g.locales_admin? } || false
|
122
|
-
end
|
123
|
-
|
124
|
-
def domains_admin?
|
125
|
-
groups.detect { |g| g.domains_admin? } || false
|
126
|
-
end
|
127
|
-
|
128
75
|
def update_all_children(new_groups)
|
129
76
|
if current_user.root?
|
130
77
|
# root has no restrictions
|
@@ -154,10 +101,10 @@ module Ixtlan
|
|
154
101
|
|
155
102
|
# for each new groups update the locales/domains respectively
|
156
103
|
new_groups.each do |group|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
104
|
+
if user_groups_map.key?(group[:id])
|
105
|
+
user_groups_map[group[:id]].update_children(group[:locales], :locales) if current_user.locales_admin? || current_user.root?
|
106
|
+
user_groups_map[group[:id]].update_children(group[:domains], :domains) if current_user.domains_admin? || current_user.root?
|
107
|
+
end
|
161
108
|
end
|
162
109
|
end
|
163
110
|
end
|
@@ -187,17 +134,71 @@ module Ixtlan
|
|
187
134
|
end
|
188
135
|
end
|
189
136
|
|
190
|
-
|
191
|
-
|
137
|
+
def self.included(model)
|
138
|
+
model.send(:include, DataMapper::Resource)
|
139
|
+
model.send(:include, UpdateChildren)
|
140
|
+
|
141
|
+
model.property :id, ::DataMapper::Types::Serial, :field => "uidnumber"
|
142
|
+
|
143
|
+
model.property :login, String, :required => true, :field => "uid", :length => 4..32, :unique_index => true, :format => /^[a-zA-Z0-9]*$/, :writer => :private
|
144
|
+
|
145
|
+
model.property :name, String, :required => true, :format => /^[^<">]*$/, :length => 2..64, :field => "cn"
|
146
|
+
|
147
|
+
model.property :email, String, :required => true, :format => :email_address, :required => true, :length => 8..64, :unique_index => true, :field => "mail"
|
148
|
+
|
149
|
+
model.property :language, String, :required => false, :format => /[a-z][a-z]/, :length => 2, :field => "preferredlanguage"
|
150
|
+
|
151
|
+
model.property :hashed_password, String, :required => false, :length => 128, :accessor => :private, :field => "userpassword"
|
192
152
|
|
193
|
-
|
153
|
+
model.timestamps :at
|
194
154
|
|
195
|
-
|
196
|
-
|
197
|
-
|
155
|
+
model.modified_by ::Ixtlan::Models::USER
|
156
|
+
|
157
|
+
#validates_is_unique :login
|
158
|
+
#validates_is_unique :email
|
159
|
+
|
160
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
161
|
+
# make sure login is immutable
|
162
|
+
def login=(new_login)
|
163
|
+
attribute_set(:login, new_login) if login.nil?
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.authenticate(login, password)
|
167
|
+
user = first(:login => login) # need to get the salt
|
168
|
+
if user
|
169
|
+
digest = user.digest
|
170
|
+
salt = digest[20,147]
|
171
|
+
if ::Digest::SHA1.digest("\#{password}" + salt) == digest[0,20]
|
172
|
+
user
|
173
|
+
else
|
174
|
+
"wrong password"
|
175
|
+
end
|
176
|
+
else
|
177
|
+
"unknown login"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def self.first_or_get!(id_or_login)
|
182
|
+
first(:login => id_or_login) || get!(id_or_login)
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.first_or_get(id_or_login)
|
186
|
+
first(:login => id_or_login) || get(id_or_login)
|
187
|
+
end
|
188
|
+
|
189
|
+
if protected_instance_methods.find {|m| m == 'to_x'}.nil?
|
190
|
+
alias :to_x :to_xml_document
|
191
|
+
|
192
|
+
protected
|
193
|
+
|
194
|
+
def to_xml_document(opts={}, doc = nil)
|
195
|
+
unless(opts[:methods] || opts[:exclude])
|
196
|
+
opts.merge!({:exclude => [:hashed_password], :methods => [:groups]})
|
197
|
+
end
|
198
|
+
to_x(opts, doc)
|
198
199
|
end
|
199
|
-
to_x(opts, doc)
|
200
200
|
end
|
201
|
+
EOS
|
201
202
|
end
|
202
203
|
end
|
203
204
|
end
|
@@ -10,12 +10,12 @@ module Ixtlan
|
|
10
10
|
CONFIGURATION = Object.const_get(Ixtlan::Models::CONFIGURATION)
|
11
11
|
|
12
12
|
def self.create_user
|
13
|
-
USER.
|
14
|
-
LOCALE.
|
15
|
-
GROUP.
|
16
|
-
Ixtlan::Models::GroupUser.
|
17
|
-
Ixtlan::Models::GroupLocaleUser.
|
18
|
-
Ixtlan::Models::DomainGroupUser.
|
13
|
+
USER.auto_upgrade!
|
14
|
+
LOCALE.auto_upgrade!
|
15
|
+
GROUP.auto_upgrade!
|
16
|
+
Ixtlan::Models::GroupUser.auto_upgrade!
|
17
|
+
Ixtlan::Models::GroupLocaleUser.auto_upgrade!
|
18
|
+
Ixtlan::Models::DomainGroupUser.auto_upgrade!
|
19
19
|
|
20
20
|
u = USER.new(:login => 'root', :email => 'root@example.com', :name => 'Superuser', :id => 1)
|
21
21
|
u.created_at = DateTime.now
|
@@ -43,13 +43,13 @@ module Ixtlan
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def self.create_configuration
|
46
|
-
Ixtlan::Models::ConfigurationLocale.
|
47
|
-
CONFIGURATION.
|
46
|
+
Ixtlan::Models::ConfigurationLocale.auto_upgrade!
|
47
|
+
CONFIGURATION.auto_upgrade!
|
48
48
|
CONFIGURATION.create(:session_idle_timeout => 10, :keep_audit_logs => 3, :current_user => USER.first)
|
49
49
|
end
|
50
50
|
|
51
51
|
def self.create_locale
|
52
|
-
LOCALE.
|
52
|
+
LOCALE.auto_upgrade!
|
53
53
|
# get/create default locale
|
54
54
|
LOCALE.create(:code => LOCALE::DEFAULT, :current_user => USER.first)
|
55
55
|
# get/create "every" locale
|
@@ -60,7 +60,7 @@ module Ixtlan
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.create_domain
|
63
|
-
DOMAIN.
|
63
|
+
DOMAIN.auto_upgrade!
|
64
64
|
# get/create "every" domain
|
65
65
|
DOMAIN.create(:name => DOMAIN::ALL, :current_user => User.first)
|
66
66
|
|
@@ -68,7 +68,7 @@ module Ixtlan
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def self.create_text
|
71
|
-
I18nText.
|
71
|
+
I18nText.auto_upgrade!
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
data/lib/ixtlan/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ixtlan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mkristian
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-05-
|
12
|
+
date: 2010-05-28 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -235,9 +235,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
235
235
|
version:
|
236
236
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
237
|
requirements:
|
238
|
-
- - "
|
238
|
+
- - ">"
|
239
239
|
- !ruby/object:Gem::Version
|
240
|
-
version:
|
240
|
+
version: 1.3.1
|
241
241
|
version:
|
242
242
|
requirements: []
|
243
243
|
|