ixtlan 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +49 -0
- data/MIT-LICENSE +20 -0
- data/Manifest.txt +73 -48
- data/Rakefile +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +3 -3
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +1 -1
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +2 -2
- data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +2 -2
- data/generators/ixtlan_datamapper_rspec_model/ixtlan_datamapper_rspec_model_generator.rb +1 -1
- data/generators/ixtlan_datamapper_rspec_scaffold/ixtlan_datamapper_rspec_scaffold_generator.rb +4 -4
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb +7 -7
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb +1 -1
- data/generators/ixtlan_datamapper_rspec_scaffold/templates/layout.html.erb +20 -0
- data/ixtlan_rails_templates.rb +537 -0
- data/lib/ixtlan/audit_config.rb +5 -5
- data/lib/ixtlan/child_path.rb +2 -2
- data/lib/ixtlan/cms_script.rb +4 -4
- data/lib/ixtlan/controllers/authentications_controller.rb +7 -2
- data/lib/ixtlan/controllers/configurations_controller.rb +15 -6
- data/lib/ixtlan/controllers/domains_controller.rb +99 -0
- data/lib/ixtlan/controllers/groups_controller.rb +105 -0
- data/lib/ixtlan/controllers/locales_controller.rb +99 -0
- data/lib/ixtlan/controllers/permissions_controller.rb +5 -0
- data/lib/ixtlan/controllers/phrases_controller.rb +26 -22
- data/lib/ixtlan/controllers/search_query.rb +24 -0
- data/lib/ixtlan/controllers/texts_controller.rb +5 -5
- data/lib/ixtlan/controllers/users_controller.rb +117 -0
- data/lib/ixtlan/controllers/word_bundles_controller.rb +13 -8
- data/lib/ixtlan/digest.rb +3 -3
- data/lib/ixtlan/guard.rb +11 -12
- data/lib/ixtlan/logger_config.rb +11 -11
- data/lib/ixtlan/mailer/error_notification.erb +1 -0
- data/lib/ixtlan/mailer/password.erb +1 -0
- data/lib/ixtlan/mailer.rb +27 -0
- data/lib/ixtlan/models/authentication.rb +9 -6
- data/lib/ixtlan/models/configuration.rb +21 -37
- data/lib/ixtlan/models/configuration_locale.rb +3 -3
- data/lib/ixtlan/models/domain.rb +44 -0
- data/lib/ixtlan/models/domain_group_user.rb +22 -0
- data/lib/ixtlan/models/group.rb +82 -16
- data/lib/ixtlan/models/group_locale_user.rb +4 -4
- data/lib/ixtlan/models/group_user.rb +7 -7
- data/lib/ixtlan/models/i18n_text.rb +26 -26
- data/lib/ixtlan/models/locale.rb +17 -5
- data/lib/ixtlan/models/permission.rb +3 -2
- data/lib/ixtlan/models/phrase.rb +15 -15
- data/lib/ixtlan/models/role.rb +5 -5
- data/lib/ixtlan/models/translation.rb +9 -9
- data/lib/ixtlan/models/update_children.rb +74 -0
- data/lib/ixtlan/models/user.rb +108 -16
- data/lib/ixtlan/models/word.rb +2 -1
- data/lib/ixtlan/models.rb +1 -0
- data/lib/ixtlan/modified_by.rb +9 -7
- data/lib/ixtlan/monkey_patches.rb +5 -5
- data/lib/ixtlan/optimistic_persistence.rb +2 -2
- data/lib/ixtlan/optimistic_persistence_module.rb +3 -3
- data/lib/ixtlan/optimistic_persistence_validation.rb +2 -2
- data/lib/ixtlan/passwords.rb +15 -13
- data/lib/ixtlan/rails/error_handling.rb +41 -40
- data/lib/ixtlan/rails/guard.rb +0 -1
- data/lib/ixtlan/rails/migrations.rb +75 -0
- data/lib/ixtlan/rails/session_timeout.rb +16 -14
- data/lib/ixtlan/rails/timestamps_modified_by_filter.rb +1 -1
- data/lib/ixtlan/rails/unrestful_authentication.rb +4 -4
- data/lib/ixtlan/rolling_file.rb +3 -3
- data/lib/ixtlan/session.rb +4 -3
- data/lib/ixtlan/user_logger.rb +13 -9
- data/lib/ixtlan/version.rb +1 -1
- data/spec/authentication_spec.rb +1 -1
- data/spec/guard_spec.rb +4 -4
- data/spec/guards/samples.rb +7 -7
- data/spec/modified_by_spec.rb +82 -0
- data/spec/optimistic_persistence_spec.rb +58 -0
- data/spec/phrase_spec.rb +119 -0
- data/spec/session_timeout_spec.rb +59 -0
- data/spec/spec_helper.rb +6 -5
- data/spec/text_collection_spec.rb +88 -0
- data/spec/text_spec.rb +105 -0
- data/spec/unrestful_authentication_spec.rb +142 -0
- data/spec/user_logger_spec.rb +105 -0
- data/spec/user_spec.rb +249 -0
- data/whitespace.rb +31 -0
- metadata +76 -50
- data/lib/ixtlan/error_notifier/error_notification.rhtml +0 -1
data/lib/ixtlan/guard.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Ixtlan
|
2
2
|
module ActionController #:nodoc:
|
3
3
|
module Guard #:nodoc:
|
4
|
-
def self.included(base)
|
4
|
+
def self.included(base)
|
5
5
|
base.send(:include, InstanceMethods)
|
6
6
|
end
|
7
7
|
module InstanceMethods #:nodoc:
|
8
|
-
|
8
|
+
|
9
9
|
protected
|
10
|
-
|
10
|
+
|
11
11
|
def guard(locale = nil)
|
12
12
|
guard!(params[:controller], params[:action], locale)
|
13
13
|
end
|
@@ -27,7 +27,7 @@ module Ixtlan
|
|
27
27
|
def self.included(base)
|
28
28
|
base.send(:include, InstanceMethods)
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
module InstanceMethods #:nodoc:
|
32
32
|
def allowed(resource, action, locale = nil)
|
33
33
|
::Ixtlan::Guard.check(helpers.controller, resource, action, locale)
|
@@ -36,11 +36,11 @@ module Ixtlan
|
|
36
36
|
end
|
37
37
|
|
38
38
|
class Guard
|
39
|
-
|
39
|
+
|
40
40
|
@@map = {}
|
41
41
|
|
42
42
|
def self.load(logger = Logger.new(STDOUT), superuser = :root, guard_dir = "#{RAILS_ROOT}/app/guards", &block)
|
43
|
-
@@block =
|
43
|
+
@@block =
|
44
44
|
if block
|
45
45
|
block
|
46
46
|
else
|
@@ -52,7 +52,7 @@ module Ixtlan
|
|
52
52
|
DataMapper.setup(:guard_memory, :adapter => :in_memory)
|
53
53
|
@@logger = logger
|
54
54
|
@@superuser = superuser
|
55
|
-
if File.exists?(guard_dir)
|
55
|
+
if File.exists?(guard_dir)
|
56
56
|
Dir.new(guard_dir).to_a.each do |f|
|
57
57
|
if f.match(".rb$")
|
58
58
|
require(File.join(guard_dir, f))
|
@@ -66,7 +66,7 @@ module Ixtlan
|
|
66
66
|
|
67
67
|
def self.symbolize(h)
|
68
68
|
result = {}
|
69
|
-
|
69
|
+
|
70
70
|
h.each do |k, v|
|
71
71
|
if v.is_a?(Hash)
|
72
72
|
result[k.to_sym] = symbolize_keys(v) unless v.size == 0
|
@@ -76,10 +76,10 @@ module Ixtlan
|
|
76
76
|
result[k.to_sym] = val
|
77
77
|
end
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
result
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def self.initialize(controller, map)
|
84
84
|
msg = map.collect{ |k,v| "\n\t#{k} => [#{v.join(',')}]"}
|
85
85
|
@@logger.debug("#{controller} guard: #{msg}")
|
@@ -106,7 +106,7 @@ module Ixtlan
|
|
106
106
|
permission_const.all.destroy!
|
107
107
|
role_const.all.destroy!
|
108
108
|
xml
|
109
|
-
end
|
109
|
+
end
|
110
110
|
end
|
111
111
|
|
112
112
|
def self.check(controller, resource, action, locale = nil)
|
@@ -138,4 +138,3 @@ module Ixtlan
|
|
138
138
|
class GuardException < Exception; end
|
139
139
|
class PermissionDenied < GuardException; end
|
140
140
|
end
|
141
|
-
|
data/lib/ixtlan/logger_config.rb
CHANGED
@@ -7,9 +7,9 @@ require 'ixtlan/audit_config'
|
|
7
7
|
module Ixtlan
|
8
8
|
class LoggerConfig
|
9
9
|
def self.rolling_appender(name)
|
10
|
-
appender = Ixtlan::RollingFile.new(name,
|
11
|
-
:filename_base => log_filebase(name),
|
12
|
-
:keep => 2,
|
10
|
+
appender = Ixtlan::RollingFile.new(name,
|
11
|
+
:filename_base => log_filebase(name),
|
12
|
+
:keep => 2,
|
13
13
|
:date_pattern => '%Y-%m')
|
14
14
|
appender.layout = Logging::Layouts::Pattern.new(:pattern => "%d [%-l] (%c) %m\n")
|
15
15
|
appender
|
@@ -27,30 +27,30 @@ module Ixtlan
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.log_level(level = :warn)
|
30
|
-
ENV['RAILS_ENV'] == 'production' ? level : :debug
|
30
|
+
ENV['RAILS_ENV'] == 'production' ? level : :debug
|
31
31
|
end
|
32
32
|
|
33
33
|
Logging.init :debug, :info, :warn, :error, :fatal unless Logging.const_defined? 'MAX_LEVEL_LENGTH'
|
34
34
|
|
35
35
|
# setup rails logger
|
36
|
-
rails_appender = Logging::Appenders::File.new('rails',
|
36
|
+
rails_appender = Logging::Appenders::File.new('rails',
|
37
37
|
:filename => log_filebase(RAILS_ENV) + ".log")
|
38
38
|
rails_appender.layout = Logging::Layouts::Pattern.new(:pattern => "%-20c\t- %m\n")
|
39
|
-
|
39
|
+
|
40
40
|
logger = logger(rails_appender, Rails)
|
41
41
|
logger.info "initialized logger ..."
|
42
|
-
|
42
|
+
|
43
43
|
# datamapper + dataobject logger
|
44
44
|
appender = rolling_appender('sql')
|
45
|
-
|
45
|
+
|
46
46
|
DataMapper.logger = logger([appender,rails_appender], DataMapper)
|
47
|
-
|
47
|
+
|
48
48
|
#TODO better find out which database !!!
|
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,
|
53
|
-
log_filebase('audit'),
|
52
|
+
Ixtlan::AuditConfig.configure(Ixtlan::Models::Configuration.instance.keep_audit_logs,
|
53
|
+
log_filebase('audit'),
|
54
54
|
[
|
55
55
|
Ixtlan::Models::User,
|
56
56
|
Ixtlan::Rails::Audit,
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @text %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @password %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
class Mailer < ActionMailer::Base
|
3
|
+
|
4
|
+
require 'pathname'
|
5
|
+
path = Pathname(__FILE__).parent.dirname.to_s
|
6
|
+
p path
|
7
|
+
view_paths << path unless view_paths.member? path
|
8
|
+
|
9
|
+
def password(email_to, email_from, password)
|
10
|
+
@subject = ''
|
11
|
+
@body = {:password => password}
|
12
|
+
@recipients = email_to
|
13
|
+
@from = email_from
|
14
|
+
@sent_on = Time.now
|
15
|
+
@headers = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def error_notification(email_from, email_to, exception, error_file)
|
19
|
+
@subject = exception.to_s
|
20
|
+
@body = {:text => "#{error_file}"}
|
21
|
+
@recipients = email_to
|
22
|
+
@from = email_from
|
23
|
+
@sent_on = Time.now
|
24
|
+
@headers = {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,22 +1,25 @@
|
|
1
|
+
require 'dm-serializer'
|
1
2
|
module Ixtlan
|
2
3
|
module Models
|
3
|
-
class Authentication
|
4
|
+
class Authentication
|
4
5
|
include DataMapper::Resource
|
5
6
|
|
6
7
|
def self.name
|
7
8
|
"Authentication"
|
8
9
|
end
|
9
10
|
|
10
|
-
property :
|
11
|
-
|
11
|
+
property :id, Serial, :default => 1
|
12
|
+
|
13
|
+
property :login, String,:format => /^[a-zA-Z0-9\-!=+$%^&*\(\){}|\[\]<>_.]*$/
|
14
|
+
|
12
15
|
property :password, String,:format => /^[a-zA-Z0-9_.]*$/
|
13
|
-
|
16
|
+
|
14
17
|
attr_accessor :token
|
15
|
-
|
18
|
+
|
16
19
|
belongs_to :user, :model => ::Ixtlan::Models::USER
|
17
20
|
|
18
21
|
if protected_instance_methods.find {|m| m == 'to_x'}.nil?
|
19
|
-
|
22
|
+
|
20
23
|
protected
|
21
24
|
|
22
25
|
alias :to_x :to_xml_document
|
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'dm-core'
|
2
2
|
require 'ixtlan/modified_by'
|
3
|
+
require 'dm-serializer'
|
4
|
+
require 'ixtlan/models/update_children'
|
3
5
|
module Ixtlan
|
4
6
|
module Models
|
5
7
|
class Configuration
|
6
8
|
include DataMapper::Resource
|
9
|
+
include UpdateChildren
|
10
|
+
|
11
|
+
LOCALE = Object.full_const_get(Models::LOCALE)
|
7
12
|
|
8
13
|
def self.default_storage_name
|
9
14
|
"Configuration"
|
@@ -11,47 +16,24 @@ module Ixtlan
|
|
11
16
|
|
12
17
|
property :id, Serial
|
13
18
|
|
14
|
-
property :session_idle_timeout, Integer, :
|
15
|
-
|
16
|
-
property :keep_audit_logs, Integer, :
|
17
|
-
|
18
|
-
property :
|
19
|
+
property :session_idle_timeout, Integer, :required => true
|
20
|
+
|
21
|
+
property :keep_audit_logs, Integer, :required => true
|
22
|
+
|
23
|
+
property :password_sender_email, String, :format => :email_address, :required => false, :length => 64
|
24
|
+
|
25
|
+
property :notification_sender_email, String, :format => :email_address, :required => false, :length => 64
|
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
|
28
|
+
|
29
|
+
property :errors_dump_directory, String, :required => false, :length => 192
|
30
|
+
property :logfiles_directory, String, :required => false, :length => 192
|
19
31
|
|
20
|
-
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}, :nullable => true, :length => 254 #honour mysql max varchar length
|
21
|
-
|
22
32
|
timestamps :updated_at
|
23
33
|
|
24
34
|
modified_by ::Ixtlan::Models::USER, :updated_by
|
25
35
|
|
26
|
-
|
27
|
-
if @locales.nil?
|
28
|
-
# TODO spec the empty array to make sure new relations are stored
|
29
|
-
# in the database or the locales collection is empty before filling it
|
30
|
-
@locales = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, Object.full_const_get(::Ixtlan::Models::LOCALE)), [])
|
31
|
-
ConfigurationLocale.all(:configuration_id => id).each{ |cl| @locales << cl.locale }
|
32
|
-
def @locales.configuration=(configuration)
|
33
|
-
@configuration = configuration
|
34
|
-
end
|
35
|
-
@locales.configuration = self
|
36
|
-
def @locales.<<(locale)
|
37
|
-
unless member? locale
|
38
|
-
ConfigurationLocale.create(:configuration_id => @configuration.id, :locale_code => locale.code)
|
39
|
-
super
|
40
|
-
end
|
41
|
-
|
42
|
-
self
|
43
|
-
end
|
44
|
-
|
45
|
-
def @locales.delete(locale)
|
46
|
-
cl = ConfigurationLocale.first(:configuration_id => @configuration.id, :user_id => @user.id, :locale_code => locale.code)
|
47
|
-
if cl
|
48
|
-
cl.destroy
|
49
|
-
end
|
50
|
-
super
|
51
|
-
end
|
52
|
-
end
|
53
|
-
@locales
|
54
|
-
end
|
36
|
+
has n, :locales, :model => ::Ixtlan::Models::LOCALE, :through => Resource
|
55
37
|
|
56
38
|
def self.instance
|
57
39
|
# HACK: return a new object in case there is none in the database
|
@@ -66,7 +48,9 @@ module Ixtlan
|
|
66
48
|
|
67
49
|
alias :to_x :to_xml_document
|
68
50
|
def to_xml_document(opts, doc = nil)
|
69
|
-
opts
|
51
|
+
unless(opts[:methods] || opts[:exclude])
|
52
|
+
opts.merge!({:methods => [:updated_by, :locales], :exclude => [:updated_by_id, :id]})
|
53
|
+
end
|
70
54
|
to_x(opts, doc)
|
71
55
|
end
|
72
56
|
end
|
@@ -3,14 +3,14 @@ module Ixtlan
|
|
3
3
|
class ConfigurationLocale
|
4
4
|
|
5
5
|
include DataMapper::Resource
|
6
|
-
|
6
|
+
|
7
7
|
def self.default_storage_name
|
8
8
|
"ConfigurationLocale"
|
9
9
|
end
|
10
10
|
|
11
11
|
property :configuration_id, Integer, :key => true
|
12
|
-
|
13
|
-
property :
|
12
|
+
|
13
|
+
property :locale_id, Integer, :key => true
|
14
14
|
|
15
15
|
belongs_to :configuration, :model => Models::CONFIGURATION
|
16
16
|
belongs_to :locale, :model => Models::LOCALE
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'dm-serializer'
|
2
|
+
module Ixtlan
|
3
|
+
module Models
|
4
|
+
class Domain
|
5
|
+
include DataMapper::Resource
|
6
|
+
|
7
|
+
def self.default_storage_name
|
8
|
+
"Domain"
|
9
|
+
end
|
10
|
+
|
11
|
+
unless const_defined? "ALL"
|
12
|
+
ALL = "ALL"
|
13
|
+
end
|
14
|
+
|
15
|
+
property :id, Serial
|
16
|
+
property :name, String, :required => true , :format => /^[a-z]+$|^#{ALL}$/, :length => 32, :unique_index => true
|
17
|
+
|
18
|
+
timestamps :created_at
|
19
|
+
|
20
|
+
modified_by Models::USER, :created_by
|
21
|
+
|
22
|
+
def self.every
|
23
|
+
first(:name => ALL)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.first_or_get!(id_or_name)
|
27
|
+
first(:name => id_or_name) || get!(id_or_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.first_or_get(id_or_name)
|
31
|
+
first(:name => id_or_name) || get(id_or_name)
|
32
|
+
end
|
33
|
+
|
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
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Models
|
3
|
+
class DomainGroupUser
|
4
|
+
|
5
|
+
include DataMapper::Resource
|
6
|
+
|
7
|
+
def self.default_storage_name
|
8
|
+
"DomainGroupUser"
|
9
|
+
end
|
10
|
+
|
11
|
+
property :group_id, Integer, :key => true
|
12
|
+
|
13
|
+
property :user_id, Integer, :key => true
|
14
|
+
|
15
|
+
property :domain_id, Integer, :key => true
|
16
|
+
|
17
|
+
belongs_to :group, :model => Models::GROUP
|
18
|
+
belongs_to :user, :model => Models::USER
|
19
|
+
belongs_to :domain, :model => Models::DOMAIN
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/ixtlan/models/group.rb
CHANGED
@@ -1,28 +1,45 @@
|
|
1
|
+
require 'dm-serializer'
|
2
|
+
require 'ixtlan/models/update_children'
|
1
3
|
module Ixtlan
|
2
4
|
module Models
|
3
5
|
class Group
|
4
|
-
|
5
6
|
include DataMapper::Resource
|
6
|
-
|
7
|
+
include UpdateChildren
|
8
|
+
|
9
|
+
#p LOCALE
|
10
|
+
# TODO where is LOCALE defined and remove the double defintion
|
11
|
+
|
12
|
+
unless const_defined? "LOCALE"
|
13
|
+
LOCALE = Object.full_const_get(Models::LOCALE)
|
14
|
+
DOMAIN = Object.full_const_get(Models::DOMAIN)
|
15
|
+
end
|
16
|
+
|
7
17
|
def self.default_storage_name
|
8
18
|
"Group"
|
9
19
|
end
|
10
20
|
|
11
21
|
property :id, Serial, :field => "gidnumber"
|
12
|
-
|
13
|
-
property :name, String, :
|
14
|
-
|
22
|
+
|
23
|
+
property :name, String, :required => true , :format => /^[^<'&">]*$/, :length => 32, :field => "cn", :unique_index => true
|
24
|
+
|
15
25
|
timestamps :created_at
|
16
|
-
|
17
|
-
modified_by Models::USER
|
26
|
+
|
27
|
+
modified_by Ixtlan::Models::USER, :created_by
|
28
|
+
|
29
|
+
def self.first_or_get!(id_or_name)
|
30
|
+
first(:name => id_or_name) || get!(id_or_name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.first_or_get(id_or_name)
|
34
|
+
first(:name => id_or_name) || get(id_or_name)
|
35
|
+
end
|
18
36
|
|
19
37
|
def locales(user = nil)
|
20
|
-
# return ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, Locale), [])
|
21
38
|
if @locales.nil? or not user.nil?
|
22
|
-
|
39
|
+
|
23
40
|
# TODO spec the empty array to make sure new relations are stored
|
24
41
|
# in the database or the locales collection is empty before filling it
|
25
|
-
@locales = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository,
|
42
|
+
@locales = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, LOCALE), [])
|
26
43
|
|
27
44
|
return @locales if user.nil?
|
28
45
|
|
@@ -37,14 +54,14 @@ module Ixtlan
|
|
37
54
|
@locales.user = user
|
38
55
|
def @locales.<<(locale)
|
39
56
|
unless member? locale
|
40
|
-
GroupLocaleUser.create(:group_id => @group.id, :user_id => @user.id, :
|
57
|
+
GroupLocaleUser.create(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
|
41
58
|
super
|
42
59
|
end
|
43
|
-
|
60
|
+
|
44
61
|
self
|
45
62
|
end
|
46
|
-
def @locales.delete(locale)
|
47
|
-
glu = GroupLocaleUser.first(:group_id => @group.id, :user_id => @user.id, :
|
63
|
+
def @locales.delete(locale)
|
64
|
+
glu = GroupLocaleUser.first(:group_id => @group.id, :user_id => @user.id, :locale_id => locale.id)
|
48
65
|
if glu
|
49
66
|
glu.destroy
|
50
67
|
end
|
@@ -54,13 +71,62 @@ module Ixtlan
|
|
54
71
|
@locales
|
55
72
|
end
|
56
73
|
|
74
|
+
def domains(user = nil)
|
75
|
+
if @domains.nil? or not user.nil?
|
76
|
+
|
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), [])
|
80
|
+
|
81
|
+
return @domains if user.nil?
|
82
|
+
|
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
|
105
|
+
super
|
106
|
+
end
|
107
|
+
end
|
108
|
+
@domains
|
109
|
+
end
|
110
|
+
|
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'
|
121
|
+
end
|
122
|
+
|
57
123
|
if protected_instance_methods.find {|m| m == 'to_x'}.nil?
|
58
|
-
|
124
|
+
|
59
125
|
protected
|
60
126
|
|
61
127
|
alias :to_x :to_xml_document
|
62
128
|
def to_xml_document(opts, doc = nil)
|
63
|
-
opts.merge!({:methods => [:locales]})
|
129
|
+
opts.merge!({:methods => [:locales, :domains], :exclude => [:created_by_id]})
|
64
130
|
to_x(opts, doc)
|
65
131
|
end
|
66
132
|
end
|
@@ -3,16 +3,16 @@ module Ixtlan
|
|
3
3
|
class GroupLocaleUser
|
4
4
|
|
5
5
|
include DataMapper::Resource
|
6
|
-
|
6
|
+
|
7
7
|
def self.default_storage_name
|
8
8
|
"GroupLocaleUser"
|
9
9
|
end
|
10
10
|
|
11
11
|
property :group_id, Integer, :key => true
|
12
|
-
|
12
|
+
|
13
13
|
property :user_id, Integer, :key => true
|
14
|
-
|
15
|
-
property :
|
14
|
+
|
15
|
+
property :locale_id, Integer, :key => true
|
16
16
|
|
17
17
|
belongs_to :group, :model => Models::GROUP
|
18
18
|
belongs_to :user, :model => Models::USER
|
@@ -8,29 +8,29 @@ module Ixtlan
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# dn_prefix { |group_user| "cn=#{group_user.group.name}" }
|
11
|
-
|
11
|
+
|
12
12
|
#treebase "ou=groups"
|
13
|
-
|
13
|
+
|
14
14
|
# multivalue_field :memberuid
|
15
|
-
|
15
|
+
|
16
16
|
#ldap_properties do |group_user|
|
17
17
|
# {:cn=>"#{group_user.group.name}", :objectclass => "posixGroup"}
|
18
18
|
# end
|
19
19
|
property :memberuid, String, :key => true
|
20
20
|
property :gidnumber, Integer, :key => true
|
21
|
-
|
21
|
+
|
22
22
|
def group
|
23
23
|
Object.full_const_get(Models::GROUP).get!(gidnumber)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def group=(group)
|
27
27
|
gidnumber = group.id
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def user
|
31
31
|
Object.full_const_get(Models::USER).first(:login => memberuid)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def user=(user)
|
35
35
|
memberuid = user.login
|
36
36
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'dm-serializer'
|
1
2
|
module Ixtlan
|
2
3
|
module Models
|
3
4
|
class I18nText
|
@@ -8,25 +9,25 @@ module Ixtlan
|
|
8
9
|
end
|
9
10
|
|
10
11
|
property :id, Serial
|
11
|
-
|
12
|
-
property :code, String, :
|
13
|
-
|
14
|
-
property :text, String, :
|
15
|
-
|
16
|
-
property :version, Integer, :
|
17
|
-
|
18
|
-
property :current, Boolean, :
|
19
|
-
|
20
|
-
property :previous, Boolean, :
|
21
|
-
|
22
|
-
property :updated_at, DateTime, :
|
23
|
-
|
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
|
+
|
24
25
|
belongs_to :updated_by, :model => Models::USER
|
25
|
-
|
26
|
-
property :approved_at, DateTime, :
|
27
|
-
|
28
|
-
belongs_to :approved_by, :model => Models::USER, :
|
29
|
-
|
26
|
+
|
27
|
+
property :approved_at, DateTime, :required => false
|
28
|
+
|
29
|
+
belongs_to :approved_by, :model => Models::USER, :required => false
|
30
|
+
|
30
31
|
belongs_to :locale, :model => Models::LOCALE
|
31
32
|
|
32
33
|
validates_with_method :invariant
|
@@ -65,12 +66,12 @@ module Ixtlan
|
|
65
66
|
validates_with_method :cascade
|
66
67
|
|
67
68
|
def cascade
|
68
|
-
size =
|
69
|
+
size =
|
69
70
|
case locale.code.size
|
70
71
|
when 2
|
71
|
-
self.model.latest_approved(:code => code, :locale => Locale.default).size
|
72
|
+
self.model.latest_approved(:code => code, :locale => Locale.default).size
|
72
73
|
when 5
|
73
|
-
self.model.latest_approved(:code => code, :locale => Locale.
|
74
|
+
self.model.latest_approved(:code => code, :locale => Locale.first(:code => locale.code[0,1])).size
|
74
75
|
else
|
75
76
|
1
|
76
77
|
end
|
@@ -101,17 +102,17 @@ module Ixtlan
|
|
101
102
|
# TODO approved is not need since after approval the resource is inmutable !!!
|
102
103
|
params[:approved_at] = attribute_get(:updated_at)
|
103
104
|
params[:approved_by] = params[:current_user] || current_user
|
104
|
-
|
105
|
+
|
105
106
|
p = (previous.nil? ? true : previous.update(:previous => false,
|
106
107
|
:current_user => params[:current_user] || current_user))
|
107
|
-
l = (latest.nil? ? true : latest.update(:current => false,
|
108
|
+
l = (latest.nil? ? true : latest.update(:current => false,
|
108
109
|
:previous => true,
|
109
110
|
:current_user => params[:current_user] || current_user))
|
110
111
|
u = update(params)
|
111
|
-
|
112
|
+
|
112
113
|
u && l && p
|
113
114
|
end
|
114
|
-
|
115
|
+
|
115
116
|
def approved?
|
116
117
|
!attribute_get(:version).nil?
|
117
118
|
end
|
@@ -138,4 +139,3 @@ module Ixtlan
|
|
138
139
|
end
|
139
140
|
end
|
140
141
|
end
|
141
|
-
|