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.
@@ -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