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.
@@ -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::Configuration.instance.keep_audit_logs,
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
- class Authentication
5
- include DataMapper::Resource
4
+ module Authentication
6
5
 
7
- def self.name
8
- "Authentication"
9
- end
6
+ def self.included(model)
7
+ model.send(:include, DataMapper::Resource)
10
8
 
11
- property :id, Serial, :default => 1
9
+ model.property :id, ::DataMapper::Types::Serial, :default => 1
12
10
 
13
- property :login, String,:format => /^[a-zA-Z0-9\-!=+$%^&*\(\){}|\[\]<>_.]*$/
11
+ model.property :login, String,:format => /^[a-zA-Z0-9\-!=+$%^&*\(\){}|\[\]<>_.]*$/
14
12
 
15
- property :password, String,:format => /^[a-zA-Z0-9_.]*$/
13
+ model.property :password, String,:format => /^[a-zA-Z0-9_.]*$/
16
14
 
17
- attr_accessor :token
15
+ model.send :attr_accessor, :token
18
16
 
19
- belongs_to :user, :model => ::Ixtlan::Models::USER
17
+ model.belongs_to :user, :model => ::Ixtlan::Models::USER
20
18
 
21
- if protected_instance_methods.find {|m| m == 'to_x'}.nil?
19
+ model.class_eval <<-EOS, __FILE__, __LINE__
20
+ if protected_instance_methods.find {|m| m == 'to_x'}.nil?
22
21
 
23
- protected
22
+ protected
24
23
 
25
- alias :to_x :to_xml_document
26
- def to_xml_document(opts, doc = nil)
27
- opts.merge!({:exclude => [:password,:user_id], :methods => [:token, :user]})
28
- to_x(opts, doc)
29
- end
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
- class Configuration
8
- include DataMapper::Resource
9
- include UpdateChildren
7
+ module Configuration
10
8
 
11
- LOCALE = Object.full_const_get(Models::LOCALE)
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
- property :id, Serial
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
- property :session_idle_timeout, Integer, :required => true
19
+ model.property :session_idle_timeout, Integer, :required => true
20
20
 
21
- property :keep_audit_logs, Integer, :required => true
21
+ model.property :keep_audit_logs, Integer, :required => true
22
22
 
23
- property :password_sender_email, String, :format => :email_address, :required => false, :length => 64
23
+ model.property :password_sender_email, String, :format => :email_address, :required => false, :length => 64
24
24
 
25
- property :notification_sender_email, String, :format => :email_address, :required => false, :length => 64
25
+ model.property :notification_sender_email, String, :format => :email_address, :required => false, :length => 64
26
26
 
27
- 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
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
- property :errors_dump_directory, String, :required => false, :length => 192
30
- property :logfiles_directory, String, :required => false, :length => 192
29
+ model.property :errors_dump_directory, String, :required => false, :length => 192
30
+ model.property :logfiles_directory, String, :required => false, :length => 192
31
31
 
32
- timestamps :updated_at
32
+ model.timestamps :updated_at
33
33
 
34
- modified_by ::Ixtlan::Models::USER, :updated_by
34
+ model.modified_by ::Ixtlan::Models::USER, :updated_by
35
35
 
36
- has n, :locales, :model => ::Ixtlan::Models::LOCALE, :through => Resource
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
@@ -1,24 +1,24 @@
1
1
  require 'dm-serializer'
2
2
  module Ixtlan
3
3
  module Models
4
- class Domain
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
- property :id, Serial
16
- property :name, String, :required => true , :format => /^[a-z]+$|^#{ALL}$/, :length => 32, :unique_index => true
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
- timestamps :created_at
17
+ model.timestamps :created_at
19
18
 
20
- modified_by Models::USER, :created_by
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
- def hash
35
- attribute_get(:name).hash
36
- end
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
@@ -2,29 +2,35 @@ require 'dm-serializer'
2
2
  require 'ixtlan/models/update_children'
3
3
  module Ixtlan
4
4
  module Models
5
- class Group
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.default_storage_name
18
- "Group"
19
- end
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
- property :id, Serial, :field => "gidnumber"
17
+ model.property :name, String, :required => true , :format => /^[^<'&">]*$/, :length => 32, :field => "cn", :unique_index => true
22
18
 
23
- property :name, String, :required => true , :format => /^[^<'&">]*$/, :length => 32, :field => "cn", :unique_index => true
19
+ model.timestamps :created_at
24
20
 
25
- timestamps :created_at
21
+ model.modified_by Ixtlan::Models::USER, :created_by
26
22
 
27
- modified_by Ixtlan::Models::USER, :created_by
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
- def locales(user = nil)
38
- if @locales.nil? or not user.nil?
45
+ def locales(user = nil)
46
+ if @locales.nil? or not user.nil?
39
47
 
40
- # TODO spec the empty array to make sure new relations are stored
41
- # in the database or the locales collection is empty before filling it
42
- @locales = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, LOCALE), [])
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
- return @locales if user.nil?
52
+ return @locales if user.nil?
45
53
 
46
- GroupLocaleUser.all(:group_id => id, :user_id => user.id).each{ |glu| @locales << glu.locale }
47
- def @locales.group=(group)
48
- @group = group
49
- end
50
- @locales.group = self
51
- def @locales.user=(user)
52
- @user = user
53
- end
54
- @locales.user = user
55
- def @locales.<<(locale)
56
- unless member? locale
57
- GroupLocaleUser.create(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
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
- def domains(user = nil)
75
- if @domains.nil? or not user.nil?
82
+ def domains(user = nil)
83
+ if @domains.nil? or not user.nil?
76
84
 
77
- # TODO spec the empty array to make sure new relations are stored
78
- # in the database or the domains collection is empty before filling it
79
- @domains = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, DOMAIN), [])
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
- return @domains if user.nil?
89
+ return @domains if user.nil?
82
90
 
83
- DomainGroupUser.all(:group_id => id, :user_id => user.id).each{ |glu| @domains << glu.domain }
84
- def @domains.group=(group)
85
- @group = group
86
- end
87
- @domains.group = self
88
- def @domains.user=(user)
89
- @user = user
90
- end
91
- @domains.user = user
92
- def @domains.<<(domain)
93
- unless member? domain
94
- DomainGroupUser.create(:group_id => @group.id, :user_id => @user.id, :domain_id => domain.id)
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
- def root?
112
- attribute_get(:name) == 'root'
113
- end
114
-
115
- def locales_admin?
116
- attribute_get(:name) == 'locales'
117
- end
118
-
119
- def domains_admin?
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
- if protected_instance_methods.find {|m| m == 'to_x'}.nil?
119
+ def root?
120
+ attribute_get(:name) == 'root'
121
+ end
124
122
 
125
- protected
123
+ def locales_admin?
124
+ attribute_get(:name) == 'locales'
125
+ end
126
126
 
127
- alias :to_x :to_xml_document
128
- def to_xml_document(opts, doc = nil)
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
- class I18nText
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.latest_approved(args = {})
121
- args[:current] = true
122
- all(args)
123
- end
79
+ def self.included(model)
80
+ model.send(:include, DataMapper::Resource)
81
+ model.send(:include, UpdateChildren)
124
82
 
125
- def self.second_latest_approved(args = {})
126
- args[:previous] = true
127
- all(args)
128
- end
83
+ model.property :id, ::DataMapper::Types::Serial
129
84
 
130
- def self.approved(args = {})
131
- args[:version.not] = nil
132
- all(args)
133
- end
85
+ model.property :code, String, :required => true, :length => 64
86
+
87
+ model.property :text, String, :required => true, :length => 256
134
88
 
135
- def self.not_approved(args = {})
136
- args[:version] = nil
137
- all(args)
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
@@ -1,37 +1,25 @@
1
1
  require 'dm-serializer'
2
2
  module Ixtlan
3
3
  module Models
4
- class Locale
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
- property :id, Serial
17
- property :code, String, :required => true , :format => /^[a-z][a-z](_[A-Z][A-Z])?$|^#{DEFAULT}$|^#{ALL}$/, :length => 7, :unique_index => true
11
+ def self.included(model)
12
+ model.send(:include, DataMapper::Resource)
18
13
 
19
- timestamps :created_at
14
+ model.property :id, ::DataMapper::Types::Serial
20
15
 
21
- modified_by Models::USER, :created_by
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
- def parent
24
- c = attribute_get(:code)
25
- case c.size
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
- def hash
52
- attribute_get(:code).hash
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
- alias :eql? :==
56
- def ==(other)
57
- attribute_get(:code).eql?(other.attribute_get(:code))
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
@@ -5,37 +5,25 @@ require 'dm-serializer'
5
5
  require 'ixtlan/models/update_children'
6
6
  module Ixtlan
7
7
  module Models
8
- class User
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 self.default_storage_name
15
- "User"
12
+ def root?
13
+ groups.detect { |g| g.root? } || false
16
14
  end
17
15
 
18
- property :id, Serial, :field => "uidnumber"
19
-
20
- property :login, String, :required => true, :field => "uid", :length => 4..32, :unique_index => true, :format => /^[a-zA-Z0-9]*$/, :writer => :private
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
- # Virtual attribute for the plaintext password
35
- attr_reader :password
20
+ def domains_admin?
21
+ groups.detect { |g| g.domains_admin? } || false
22
+ end
36
23
 
37
- #validates_is_unique :login
38
- #validates_is_unique :email
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
- if user_groups_map.key?(group[:id])
158
- user_groups_map[group[:id]].update_children(group[:locales], :locales) if current_user.locales_admin? || current_user.root?
159
- user_groups_map[group[:id]].update_children(group[:domains], :domains) if current_user.domains_admin? || current_user.root?
160
- end
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
- if protected_instance_methods.find {|m| m == 'to_x'}.nil?
191
- alias :to_x :to_xml_document
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
- protected
153
+ model.timestamps :at
194
154
 
195
- def to_xml_document(opts={}, doc = nil)
196
- unless(opts[:methods] || opts[:exclude])
197
- opts.merge!({:exclude => [:hashed_password], :methods => [:groups]})
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.auto_migrate!
14
- LOCALE.auto_migrate!
15
- GROUP.auto_migrate!
16
- Ixtlan::Models::GroupUser.auto_migrate!
17
- Ixtlan::Models::GroupLocaleUser.auto_migrate!
18
- Ixtlan::Models::DomainGroupUser.auto_migrate!
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.auto_migrate!
47
- CONFIGURATION.auto_migrate!
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.auto_migrate!
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.auto_migrate!
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.auto_migrate!
71
+ I18nText.auto_upgrade!
72
72
  end
73
73
  end
74
74
  end
@@ -1,3 +1,3 @@
1
1
  class Ixtlan
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0.pre'.freeze
3
3
  end
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.3.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-24 00:00:00 +05:30
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: "0"
240
+ version: 1.3.1
241
241
  version:
242
242
  requirements: []
243
243