ixtlan 0.2.4 → 0.3.0
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/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
|
-
|