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