ixtlan 0.3.0 → 0.4.0.pre
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/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
|
|