ixtlan 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/History.txt +49 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Manifest.txt +73 -48
  4. data/Rakefile +1 -1
  5. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +3 -3
  6. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +1 -1
  7. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +1 -1
  8. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +2 -2
  9. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +2 -2
  10. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +2 -2
  11. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +2 -2
  12. data/generators/ixtlan_datamapper_rspec_model/ixtlan_datamapper_rspec_model_generator.rb +1 -1
  13. data/generators/ixtlan_datamapper_rspec_scaffold/ixtlan_datamapper_rspec_scaffold_generator.rb +4 -4
  14. data/generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb +7 -7
  15. data/generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb +1 -1
  16. data/generators/ixtlan_datamapper_rspec_scaffold/templates/layout.html.erb +20 -0
  17. data/ixtlan_rails_templates.rb +537 -0
  18. data/lib/ixtlan/audit_config.rb +5 -5
  19. data/lib/ixtlan/child_path.rb +2 -2
  20. data/lib/ixtlan/cms_script.rb +4 -4
  21. data/lib/ixtlan/controllers/authentications_controller.rb +7 -2
  22. data/lib/ixtlan/controllers/configurations_controller.rb +15 -6
  23. data/lib/ixtlan/controllers/domains_controller.rb +99 -0
  24. data/lib/ixtlan/controllers/groups_controller.rb +105 -0
  25. data/lib/ixtlan/controllers/locales_controller.rb +99 -0
  26. data/lib/ixtlan/controllers/permissions_controller.rb +5 -0
  27. data/lib/ixtlan/controllers/phrases_controller.rb +26 -22
  28. data/lib/ixtlan/controllers/search_query.rb +24 -0
  29. data/lib/ixtlan/controllers/texts_controller.rb +5 -5
  30. data/lib/ixtlan/controllers/users_controller.rb +117 -0
  31. data/lib/ixtlan/controllers/word_bundles_controller.rb +13 -8
  32. data/lib/ixtlan/digest.rb +3 -3
  33. data/lib/ixtlan/guard.rb +11 -12
  34. data/lib/ixtlan/logger_config.rb +11 -11
  35. data/lib/ixtlan/mailer/error_notification.erb +1 -0
  36. data/lib/ixtlan/mailer/password.erb +1 -0
  37. data/lib/ixtlan/mailer.rb +27 -0
  38. data/lib/ixtlan/models/authentication.rb +9 -6
  39. data/lib/ixtlan/models/configuration.rb +21 -37
  40. data/lib/ixtlan/models/configuration_locale.rb +3 -3
  41. data/lib/ixtlan/models/domain.rb +44 -0
  42. data/lib/ixtlan/models/domain_group_user.rb +22 -0
  43. data/lib/ixtlan/models/group.rb +82 -16
  44. data/lib/ixtlan/models/group_locale_user.rb +4 -4
  45. data/lib/ixtlan/models/group_user.rb +7 -7
  46. data/lib/ixtlan/models/i18n_text.rb +26 -26
  47. data/lib/ixtlan/models/locale.rb +17 -5
  48. data/lib/ixtlan/models/permission.rb +3 -2
  49. data/lib/ixtlan/models/phrase.rb +15 -15
  50. data/lib/ixtlan/models/role.rb +5 -5
  51. data/lib/ixtlan/models/translation.rb +9 -9
  52. data/lib/ixtlan/models/update_children.rb +74 -0
  53. data/lib/ixtlan/models/user.rb +108 -16
  54. data/lib/ixtlan/models/word.rb +2 -1
  55. data/lib/ixtlan/models.rb +1 -0
  56. data/lib/ixtlan/modified_by.rb +9 -7
  57. data/lib/ixtlan/monkey_patches.rb +5 -5
  58. data/lib/ixtlan/optimistic_persistence.rb +2 -2
  59. data/lib/ixtlan/optimistic_persistence_module.rb +3 -3
  60. data/lib/ixtlan/optimistic_persistence_validation.rb +2 -2
  61. data/lib/ixtlan/passwords.rb +15 -13
  62. data/lib/ixtlan/rails/error_handling.rb +41 -40
  63. data/lib/ixtlan/rails/guard.rb +0 -1
  64. data/lib/ixtlan/rails/migrations.rb +75 -0
  65. data/lib/ixtlan/rails/session_timeout.rb +16 -14
  66. data/lib/ixtlan/rails/timestamps_modified_by_filter.rb +1 -1
  67. data/lib/ixtlan/rails/unrestful_authentication.rb +4 -4
  68. data/lib/ixtlan/rolling_file.rb +3 -3
  69. data/lib/ixtlan/session.rb +4 -3
  70. data/lib/ixtlan/user_logger.rb +13 -9
  71. data/lib/ixtlan/version.rb +1 -1
  72. data/spec/authentication_spec.rb +1 -1
  73. data/spec/guard_spec.rb +4 -4
  74. data/spec/guards/samples.rb +7 -7
  75. data/spec/modified_by_spec.rb +82 -0
  76. data/spec/optimistic_persistence_spec.rb +58 -0
  77. data/spec/phrase_spec.rb +119 -0
  78. data/spec/session_timeout_spec.rb +59 -0
  79. data/spec/spec_helper.rb +6 -5
  80. data/spec/text_collection_spec.rb +88 -0
  81. data/spec/text_spec.rb +105 -0
  82. data/spec/unrestful_authentication_spec.rb +142 -0
  83. data/spec/user_logger_spec.rb +105 -0
  84. data/spec/user_spec.rb +249 -0
  85. data/whitespace.rb +31 -0
  86. metadata +76 -50
  87. 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
-
@@ -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 :login, String,:format => /^[a-zA-Z0-9\-!=+$%^&*\(\){}|\[\]<>_.]*$/, :key => true
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, :nullable => false
15
-
16
- property :keep_audit_logs, Integer, :nullable => false
17
-
18
- property :notification_sender_email, String, :format => :email, :nullable => true, :length => 64
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
- def locales
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.merge!({:methods => [:updated_by, :locales], :exclude => [:updated_by_id, :id]})
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 :locale_code, String, :key => true
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
@@ -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, :nullable => false , :format => /^[^<'&">]*$/, :length => 32, :field => "cn", :unique_index => true
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, Models::Locale), [])
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, :locale_code => locale.code)
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, :locale_code => locale.code)
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 :locale_code, String, :key => true
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, :nullable => false, :length => 64
13
-
14
- property :text, String, :nullable => false, :length => 256
15
-
16
- property :version, Integer, :nullable => true
17
-
18
- property :current, Boolean, :nullable => false, :auto_validation => false
19
-
20
- property :previous, Boolean, :nullable => false, :auto_validation => false
21
-
22
- property :updated_at, DateTime, :nullable => false, :auto_validation => false
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, :nullable => true
27
-
28
- belongs_to :approved_by, :model => Models::USER, :nullable => true
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.get(locale.code[0,1])).size
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
-