parlement 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/CHANGES +16 -0
  2. data/README +36 -3
  3. data/Rakefile +8 -12
  4. data/app/controllers/account_controller.rb +2 -0
  5. data/app/controllers/elt_controller.rb +1 -5
  6. data/app/controllers/subscriber_controller.rb +1 -1
  7. data/app/helpers/elt_helper.rb +30 -10
  8. data/app/models/elt.rb +2 -1
  9. data/app/models/mail.rb +41 -41
  10. data/app/models/mail_notify.rb +27 -10
  11. data/app/views/account/_login.rhtml +9 -7
  12. data/app/views/account/_show.rhtml +4 -4
  13. data/app/views/elt/_elt.rhtml +52 -51
  14. data/app/views/elt/_list.rhtml +22 -14
  15. data/app/views/elt/new.rhtml +1 -1
  16. data/app/views/elt/show.rhtml +15 -16
  17. data/app/views/layouts/top.rhtml +13 -1
  18. data/app/views/person/show.rhtml +1 -7
  19. data/config/boot.rb +32 -7
  20. data/config/database.yml +3 -0
  21. data/config/environment.rb +3 -1
  22. data/config/environments/development.rb +1 -1
  23. data/db/ROOT/parlement/ddRing.txt +14 -0
  24. data/db/ROOT/parlement/top-politics.txt +12 -0
  25. data/db/ROOT/perso.txt +1 -1
  26. data/db/development_structure.sql +30 -16
  27. data/db/schema.rb +18 -10
  28. data/db/schema.sql +34 -34
  29. data/public/javascripts/application.js +2 -0
  30. data/public/javascripts/blank.gif +0 -0
  31. data/public/javascripts/borders.js +687 -0
  32. data/public/javascripts/controls.js +95 -30
  33. data/public/javascripts/dragdrop.js +161 -21
  34. data/public/javascripts/effects.js +310 -211
  35. data/public/javascripts/ie7-load.htc +1 -0
  36. data/public/javascripts/prototype.js +228 -28
  37. data/test/fixtures/attachments.yml +3 -0
  38. data/test/fixtures/mail/mail_ruby +1 -0
  39. data/test/fixtures/people.yml +14 -0
  40. data/test/functional/account_controller_test.rb +3 -2
  41. data/test/unit/mail_notify_test.rb +2 -0
  42. data/test/unit/mail_test.rb +59 -6
  43. data/test/unit/person_test.rb +1 -1
  44. data/vendor/plugins/engines/CHANGELOG +92 -0
  45. data/vendor/plugins/engines/MIT-LICENSE +21 -0
  46. data/vendor/plugins/engines/README +325 -39
  47. data/vendor/plugins/engines/generators/engine/USAGE +26 -0
  48. data/vendor/plugins/engines/generators/engine/engine_generator.rb +199 -0
  49. data/vendor/plugins/engines/generators/engine/templates/README +85 -0
  50. data/vendor/plugins/engines/generators/engine/templates/init_engine.erb +13 -0
  51. data/vendor/plugins/engines/generators/engine/templates/install.erb +4 -0
  52. data/vendor/plugins/engines/generators/engine/templates/lib/engine.erb +6 -0
  53. data/vendor/plugins/engines/generators/engine/templates/licenses/GPL +18 -0
  54. data/vendor/plugins/engines/generators/engine/templates/licenses/LGPL +19 -0
  55. data/vendor/plugins/engines/generators/engine/templates/licenses/MIT +22 -0
  56. data/vendor/plugins/engines/generators/engine/templates/licenses/None +1 -0
  57. data/vendor/plugins/engines/generators/engine/templates/public/javascripts/engine.js +0 -0
  58. data/vendor/plugins/engines/generators/engine/templates/public/stylesheets/engine.css +0 -0
  59. data/vendor/plugins/engines/generators/engine/templates/tasks/engine.rake +0 -0
  60. data/vendor/plugins/engines/generators/engine/templates/test/test_helper.erb +13 -0
  61. data/vendor/plugins/engines/init.rb +18 -3
  62. data/vendor/plugins/engines/lib/bundles/require_resource.rb +124 -0
  63. data/vendor/plugins/engines/lib/bundles.rb +77 -0
  64. data/vendor/plugins/engines/lib/{action_mailer_extensions.rb → engines/action_mailer_extensions.rb} +15 -36
  65. data/vendor/plugins/engines/lib/{action_view_extensions.rb → engines/action_view_extensions.rb} +40 -33
  66. data/vendor/plugins/engines/lib/engines/active_record_extensions.rb +19 -0
  67. data/vendor/plugins/engines/lib/engines/dependencies_extensions.rb +118 -0
  68. data/vendor/plugins/engines/lib/engines/migration_extensions.rb +53 -0
  69. data/vendor/plugins/engines/lib/{ruby_extensions.rb → engines/ruby_extensions.rb} +14 -28
  70. data/vendor/plugins/engines/lib/engines/testing_extensions.rb +323 -0
  71. data/vendor/plugins/engines/lib/engines.rb +258 -148
  72. data/vendor/plugins/engines/tasks/engines.rake +161 -0
  73. data/vendor/plugins/engines/test/action_view_extensions_test.rb +9 -0
  74. data/vendor/plugins/engines/test/ruby_extensions_test.rb +24 -3
  75. data/vendor/plugins/guid/README.TXT +14 -4
  76. data/vendor/plugins/guid/init.rb +9 -2
  77. data/vendor/plugins/guid/lib/uuidtools.rb +22 -15
  78. data/vendor/plugins/login_engine/CHANGELOG +14 -0
  79. data/vendor/plugins/login_engine/README +93 -7
  80. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +30 -20
  81. data/vendor/plugins/login_engine/app/helpers/user_helper.rb +1 -1
  82. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +2 -2
  83. data/vendor/plugins/login_engine/db/migrate/001_initial_schema.rb +25 -0
  84. data/vendor/plugins/login_engine/install.rb +4 -0
  85. data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +11 -5
  86. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +15 -9
  87. data/vendor/plugins/login_engine/lib/login_engine.rb +7 -3
  88. data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +22 -19
  89. data/vendor/plugins/login_engine/test/test_helper.rb +4 -8
  90. data/vendor/plugins/login_engine/test/unit/user_test.rb +31 -11
  91. metadata +60 -57
  92. data/app/models/attachment.rb +0 -6
  93. data/public/attachment/file/architecture.png +0 -0
  94. data/public/attachment/file/architecture.svg +0 -8972
  95. data/public/attachment/file/security.svg +0 -8960
  96. data/public/engine_files/login_engine/stylesheets/login_engine.css +0 -81
  97. data/public/oldREADME +0 -190
  98. data/public/stylesheets/default.css +0 -235
  99. data/public/stylesheets/live_tree.css +0 -62
  100. data/public/stylesheets/scaffold.css +0 -74
  101. data/script/about +0 -3
  102. data/script/benchmarker +0 -19
  103. data/script/breakpointer +0 -3
  104. data/script/console +0 -3
  105. data/script/create_db +0 -7
  106. data/script/destroy +0 -3
  107. data/script/generate +0 -3
  108. data/script/performance/benchmarker +0 -3
  109. data/script/performance/profiler +0 -3
  110. data/script/plugin +0 -3
  111. data/script/process/reaper +0 -3
  112. data/script/process/spawner +0 -3
  113. data/script/process/spinner +0 -3
  114. data/script/profiler +0 -34
  115. data/script/runner +0 -3
  116. data/script/server +0 -3
  117. data/test/unit/user_test.rb +0 -94
  118. data/vendor/plugins/engines/lib/dependencies_extensions.rb +0 -56
  119. data/vendor/plugins/engines/lib/testing_extensions.rb +0 -33
  120. data/vendor/plugins/login_engine/db/schema.rb +0 -25
  121. data/vendor/plugins/login_engine/test/fixtures/templates/users.yml +0 -41
  122. /data/public/images/{eltBackground.png → eltBackground.jng} +0 -0
data/CHANGES CHANGED
@@ -1,5 +1,21 @@
1
1
  - parlement changelog
2
2
 
3
+ == Version 0.4
4
+
5
+ Evolutions and corrections
6
+
7
+ * bug correction in the regexp managing title display
8
+ * bug managing incoming mails into the "lost+found" folder
9
+ * received mails are resent with the same id
10
+ * no more strange backgrounds in IE
11
+ * short lines (formatted lines in email for exemple), are now wrapped correctly
12
+ * permanent redirect header if an inexistant element is requested
13
+ * rails 1.1
14
+ * plugins now linked to their respective svn
15
+ * elements now in a list (ul/li)
16
+ * simplifications for w3m display
17
+ * yahoo and google footers now hidden
18
+
3
19
  == Version 0.3
4
20
 
5
21
  Major version, adding the possibility to use not only the web forums, but mails
data/README CHANGED
@@ -5,15 +5,15 @@ I am using debian, so here are a few commands I use:
5
5
  # apt-get install ruby
6
6
  # apt-get install libpgsql-ruby
7
7
  # apt-get install irb
8
- # apt-get install libredcloth-ruby
9
8
  # apt-get install rdoc
10
9
 
11
10
  -> why???
12
11
  # ln -s /sbin/ifconfig /bin/
13
12
 
14
- # gem install -r rails
13
+ # gem install rails
14
+ # gem install redcloth
15
15
  Only if you expect to develop and release:
16
- # gem install -r meta_project
16
+ # gem install meta_project
17
17
 
18
18
 
19
19
  The database is setup for user "manu", you may need to change the file
@@ -38,3 +38,36 @@ launch parlement thus:
38
38
 
39
39
  Now you can go to localhost:3000
40
40
 
41
+
42
+ The problem: "how to display conversations"
43
+ The entities involved:
44
+ - element
45
+ - ancestor
46
+ - children
47
+ - children number
48
+ - author
49
+ - element's size
50
+ - title
51
+ - body
52
+ The possibilities
53
+ - show one element and its children closed
54
+ - show one element opened and its children closed
55
+ - show one element and its children opened, its grand children closed
56
+ - show one element opened, its children and grand children opened
57
+ - when an element is closed, also show its children?
58
+ Limits
59
+ - can not display all elements at once
60
+ - can not display one element and all its direct children at once
61
+ Parameters
62
+ - ordering
63
+ - date
64
+ - number of children displayed
65
+ - votes
66
+
67
+
68
+ Here is my console code to reset threads from their original mails:
69
+
70
+ >> elts=Mail.find_all.select{|m|m.file and mail=TMail::Mail.parse(m.file) and reply=mail.in_reply_to and mailObject=Mail.find_by_message(reply) and mailObject.elt.id!=m.elt.parent_id}.collect{|m| {:elt=>m.elt.id, :parent=>Mail.find_by_message(TMail::Mail.parse(m.file).in_reply_to).elt.id}}; puts elts.size
71
+
72
+ >> elts.each{|e|print e[:elt], ' ', e[:parent], ' '; puts Elt.update_all("parent_id='#{e[:parent]}'", "id='#{e[:elt]}'")}; puts elts.size
73
+
data/Rakefile CHANGED
@@ -34,8 +34,10 @@ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
34
34
 
35
35
  PKG_FILES = FileList[
36
36
  '[A-Z]*', 'app/**/*', 'components/**/*', 'config/**/*', 'db/**/*',
37
- 'lib/**/*', 'public/**/*', 'script/**/*', 'test/**/*', 'vendor/**/*'
38
- ].exclude(/\bsvn\b|~$/)
37
+ 'lib/**/*', 'public/*.*', 'public/dynamic/*', 'public/images/*',
38
+ 'public/engine_files/*', 'public/javascripts/*', 'script/stylesheets/*',
39
+ 'test/**/*', 'vendor/**/*'
40
+ ].exclude(/\b(svn|tmp|attachment)\b|~$/)
39
41
 
40
42
  spec = Gem::Specification.new do |s|
41
43
  ## Basic information.
@@ -54,7 +56,7 @@ spec = Gem::Specification.new do |s|
54
56
  EOF
55
57
  s.files = PKG_FILES
56
58
  s.require_path = 'lib'
57
- s.autorequire = 'rails'
59
+ s.autorequire = 'rails redcloth'
58
60
  s.has_rdoc = false
59
61
  s.requirements << 'none'
60
62
  s.test_files = Dir.glob('test/unit/*')
@@ -163,21 +165,15 @@ task :publish_news => [:verify_env_vars] do
163
165
  fm = DevTools::Freshmeat::FreshmeatService.new(ENV['FRESHMEAT_USER'], ENV['FRESHMEAT_PASSWORD'])
164
166
  fm.get_project_list.each do |p|
165
167
  branches = fm.get_branch_list( p.shortName )
168
+ puts branches.inspect
166
169
  release = fm.get_release( p.shortName, branches[0], p.version )
167
170
  if PKG_NAME == p.shortName
168
171
  puts p
169
- release.version = PKG_VERSION
170
- release.changes = PKG_VERSION
172
+ #release.version = PKG_VERSION
173
+ #release.changes = PKG_VERSION
171
174
  end
172
175
  end
173
176
  puts fm.logout
174
-
175
-
176
- Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::Fresh.new(PKG_NAME)) do |news|
177
- # Never hardcode user name and password in the Rakefile!
178
- news.user_name = ENV['RUBYFORGE_USER']
179
- news.password = ENV['RUBYFORGE_PASSWORD']
180
- end
181
177
  """
182
178
  end
183
179
 
@@ -53,6 +53,8 @@ class AccountController < UserController
53
53
  User.transaction(@user) do
54
54
  @user.login = login
55
55
  @user.change_password(password)
56
+ # To make sure even a non email protected user can use a password
57
+ @user.email = login+'@nomailyet'
56
58
  # This is a hack, to make sure this user can login even if he
57
59
  # didn't verify his email
58
60
  @user.verified = true
@@ -18,14 +18,10 @@ class EltController < ApplicationController
18
18
  # TODO
19
19
  rescue ActiveRecord::RecordNotFound => e
20
20
  flash[:error] = "Element '#{params[:id]}' does not exist"
21
+ headers["Status"] = "301 Moved Permanently"
21
22
  redirect_to '/'
22
23
  end
23
24
 
24
- #def show
25
- # @elt = Elt.find(params[:id]) if @elt == nil
26
- # render :partial => 'show'
27
- #end
28
-
29
25
  def list
30
26
  @elt = Elt.find(params[:id]) if @elt == nil
31
27
  render :partial => '/elt/list', :locals => { :elt => @elt }
@@ -15,7 +15,7 @@ class SubscriberController < ApplicationController
15
15
  end
16
16
  else
17
17
  puts "Not logged in!"
18
- render :inline => "First you need to login... it's easy, juste type a pseudo, any pseudo ;-) "
18
+ render :inline => "First you need to login... it's easy, type a pseudo with at least 3 characters. Then ok. Then subscribe"
19
19
  end
20
20
  end
21
21
  end
@@ -3,26 +3,44 @@ module EltHelper
3
3
  # for italics /.../ to _..._ \
4
4
  #.gsub(/(\s+)\/([\w\s�������]*)\//, '\\1_\\2_') \
5
5
 
6
- # ^here: data
6
+ # On Date Time someone wrote: blockquote
7
+ # Yahoo footer
8
+ # Google footer
7
9
  # /italic/
8
10
  # - listElement
9
- # in reply to:\n>
10
11
  # 1. numbered list
12
+ # short lines to which are added a break
11
13
  text = auto_link data \
12
- .gsub(/^(\w*):\s/, ' \\1: ') \
14
+ .gsub(/(wrote:.*)$(\n)^>\s/, '\\1<br/>\\2\\2> ') \
15
+ .gsub(/^Yahoo! Groups Links$(\n{2}^<*.*$\s.*$)*/, '') \
16
+ .gsub(/^[-~]*$\n^You.*$\n^To.*$\n^To.*$\n^For more.*$\n^[-~]*$/, '') \
13
17
  .gsub(/(\s+)\/([\w\s]*)\//, '\\1_\\2_') \
14
18
  .gsub(/^-\s/, '* ') \
15
- .gsub(/(:)(\n)(^>\s)/, '\\1\\2\\2\\3') \
16
19
  .gsub(/^\d+[\.-]\s+/, '# ') \
20
+ .gsub(/^\s*\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
17
21
  if data != nil
18
22
 
19
- # Remove any leading and finishing <p> </p>
20
- textiled = text.blank? ? "" : RedCloth.new(text).to_html
21
- if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end
22
- if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end
23
+ textiled = text.blank? ? "" : RedCloth.new(text)
24
+ begin
25
+ textiled = textiled.to_html if !textiled.blank?
26
+ rescue
27
+ # TODO discover why RedCloth fails on this!!!
28
+ textiled = textiled.gsub(/[->\[]/, ' ')
29
+ textiled = textiled.to_html
30
+ end
31
+ if ! textiled.match(/[.\s]<p>/) then
32
+ # Remove any leading and finishing <p> </p> as they are not required
33
+ if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end
34
+ if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end
35
+ end
23
36
 
24
37
  textiled
25
38
 
39
+ # in reply to:\n>
40
+ # .gsub(/(:)(\n)(^>\s)/, '\\1\\2\\2\\3') \
41
+ # ^here: data
42
+ # .gsub(/^(\w*):\s/, ' \\1: ') \
43
+
26
44
  # hard_breaks = false
27
45
  # auto_link textilize_without_paragraph(data \
28
46
  # .gsub(/\&\#8211\;/, '* ') \
@@ -42,8 +60,10 @@ module EltHelper
42
60
  #
43
61
  def displayTitle? elt
44
62
  #elt.id and elt.subject.reverse.index(elt.parent.subject.reverse) != 0
45
- elt.id and elt.parent and elt.subject != elt.parent.subject \
46
- and not elt.subject =~ /^((\[[\w]*\] )*(r�f|re|sv|aw)*(.)*:[ \t]*)+#{elt.parent.subject}/
63
+ elt.id and elt.parent and !elt.subject.empty? \
64
+ and elt.subject != elt.parent.subject \
65
+ and elt.subject.downcase != elt.parent.subject.downcase \
66
+ and not elt.subject =~ /^((\[[\w]*\] )*(r�f|re|sv|aw)*(.)*:[ \t]*)+(#{Regexp.escape(elt.parent.subject)})/
47
67
  end
48
68
  end
49
69
 
data/app/models/elt.rb CHANGED
@@ -48,6 +48,7 @@ class Elt < ActiveRecord::Base
48
48
  self.mail = Mail.new if not self.mail
49
49
  self.mail.elt = self
50
50
  self.mail.receive(mail)
51
+ self.id = mail['X-Leparlement-Elt-Id'].to_s if mail['X-Leparlement-Elt-Id']
51
52
  save
52
53
  else
53
54
  logger.info "Already received (id: #{mail.message_id})...\n"
@@ -70,7 +71,7 @@ class Elt < ActiveRecord::Base
70
71
  #
71
72
  def publish
72
73
  logger.info "Publish #{subject}"
73
- self.mail = Mail.new if not self.mail
74
+ self.mail ||= Mail.new
74
75
  self.mail.elt = self
75
76
  self.mail.publish
76
77
  self.mail.save
data/app/models/mail.rb CHANGED
@@ -39,62 +39,51 @@ class Mail < ActiveRecord::Base
39
39
  elt.person.email = mail.from.first
40
40
 
41
41
  # Try to find its mail parent in the db
42
- if mail.references
42
+ if mail.in_reply_to
43
+ m = Mail.find_by_message(mail.in_reply_to)
44
+ elt.parent = m.elt if m
45
+ end
46
+
47
+ # Try to find its mail parent in the db
48
+ if not elt.parent and mail.references
43
49
  for parent in mail.references
44
50
  m = Mail.find_by_message(parent.to_s)
45
51
  elt.parent = m.elt if m
46
52
  end
47
53
  end
48
54
 
49
- # No reference matching an existing parent, let's try a mailing list we
50
- # deduce from an eventual [subject]
51
- if not elt.parent and elt.subject.match(/\[\w*\]/)
52
- parentId = elt.subject.match(/\[\w*\]/)
53
- parentId = parentId[0].gsub(/[\[\]]/, '') if parentId
55
+ begin
56
+ # No reference matching an existing parent, let's try a mailing list we
57
+ # deduce from an eventual [subject]
58
+ if not elt.parent and elt.subject.match(/\[[\w-]*\]/)
59
+ parentId = elt.subject.match(/\[[\w-]*\]/)
60
+ parentId = parentId[0].gsub(/[\[\]]/, '') if parentId
54
61
 
55
- begin
56
62
  elt.parent = Elt.find(parentId)
57
-
58
- rescue ActiveRecord::RecordNotFound
59
- elt.parent = elt.build_parent
60
- elt.parent.parent_id = 'mail'
61
- elt.parent.subject = parentId
62
- elt.parent.body = ''
63
- elt.parent.save
64
63
  end
65
- end
66
64
 
67
- # No reference matching an existing parent, let's try the "to" field
68
- if not elt.parent and mail.to.to_s.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)
69
- parentId = mail.to.to_s.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
70
- .gsub(/@#{ActionMailer::Base.server_settings[:domain]}/, '')
65
+ # No reference matching an existing parent, let's try the "to" field
66
+ to = mail["Envelope-to"].to_s + ', ' + mail.to.to_s
67
+ if not elt.parent and to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)
68
+ parentId = to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
69
+ .gsub(/@#{ActionMailer::Base.server_settings[:domain]}/, '')
71
70
 
72
- begin
73
71
  elt.parent = Elt.find(parentId)
74
-
75
- rescue ActiveRecord::RecordNotFound
76
- elt.parent = elt.build_parent
77
- elt.parent.parent_id = 'mail'
78
- elt.parent.subject = parentId
79
- elt.parent.body = ''
80
- elt.parent.save
81
72
  end
82
- end
83
73
 
84
- if not elt.parent
85
- parentId = "lost+found"
74
+ if not elt.parent
75
+ parentId = "lost+found"
86
76
 
87
- begin
88
77
  elt.parent = Elt.find(parentId)
89
-
90
- rescue ActiveRecord::RecordNotFound
91
- elt.id = parentId
92
- elt.parent = elt.build_parent
93
- elt.parent.parent_id = 'mail'
94
- elt.parent.subject = parentId
95
- elt.parent.body = ''
96
- elt.parent.save
97
78
  end
79
+
80
+ rescue ActiveRecord::RecordNotFound
81
+ elt.parent = elt.build_parent
82
+ elt.parent.id = parentId
83
+ elt.parent.parent_id = 'mail'
84
+ elt.parent.subject = parentId
85
+ elt.parent.body = ''
86
+ elt.parent.save
98
87
  end
99
88
 
100
89
  #elt.parent = Elt.find('mail') if not elt.parent
@@ -121,7 +110,9 @@ class Mail < ActiveRecord::Base
121
110
  if message and not message.blank? and file
122
111
  mail = TMail::Mail.parse(file)
123
112
  else
124
- mail = MailNotify::create_publish(elt)
113
+ logger.info "there"
114
+ mail = MailNotify.create_publish(elt)
115
+ logger.info "tehre"
125
116
  self.mail_parents = mail.references
126
117
  self.file = mail.encoded
127
118
  end
@@ -153,11 +144,19 @@ class Mail < ActiveRecord::Base
153
144
  ret.empty? ? default : ret
154
145
  end
155
146
 
147
+ if mail.message_id
148
+ # Let's not change the message id
149
+ def mail.add_message_id
150
+ end
151
+ end
152
+
156
153
  # Added to make sure it is not lost, but not modified if already existant
157
154
  mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
158
155
 
156
+ mail['X-leparlement-elt-Id'] = elt.id
157
+
159
158
 
160
- MailNotify::deliver(mail) if not mail.destinations.empty?
159
+ MailNotify::deliver(mail) if mail.destinations and not mail.destinations.empty?
161
160
 
162
161
  # Do it after sending, to get the actual message id as generated by the MTA
163
162
  # Note that the id of a resent mail is regenerated, but we don't record it,
@@ -185,6 +184,7 @@ class Mail < ActiveRecord::Base
185
184
  def mngAttachment(attachment)
186
185
  if attachment.content_type == 'text/plain'
187
186
  elt.body += attachment.body
187
+ #elt.body += Iconv.new(attachment.type_param('charset'), 'iso-8859-15').iconv(attachment.body)
188
188
 
189
189
  elsif attachment.multipart?
190
190
  attachment.parts.each { |part| mngAttachment(part) }
@@ -6,29 +6,46 @@
6
6
  #
7
7
  class MailNotify < ActionMailer::Base
8
8
  def publish(elt)
9
- @subject = elt.subject
10
- # Try to render the element as html
11
- #@body = elt.body
12
- @body[:elt] = elt
9
+ logger.info "Create a mail for publication"
10
+ subject elt.subject
13
11
 
14
- @recipients = (mailing_list(elt.parent).subject.blank? ? '' : mailing_list(elt.parent).subject ) \
12
+ recipients (mailing_list(elt.parent).subject.blank? ? '' : mailing_list(elt.parent).subject ) \
15
13
  + ' <' \
16
14
  + mailing_list(elt.parent).id + '@' + ActionMailer::Base.server_settings[:domain] \
17
15
  + '>'
18
16
 
19
- @from = ((elt.person and elt.person.name) ? elt.person.name : ANONYMOUS_POSTER) \
17
+ from ((elt.person and elt.person.name) ? elt.person.name : ANONYMOUS_POSTER) \
20
18
  + ' <' \
21
19
  + ((elt.person and elt.person.email) \
22
20
  ? elt.person.email : ANONYMOUS_POSTER + '@' + ActionMailer::Base.server_settings[:domain]) \
23
21
  + '> '
24
22
 
23
+ # Try to render the element as html
24
+ body(:elt => elt)
25
+
26
+ #content_type 'multipart/alternative'
27
+ #part "text/html" do |a|
28
+ # a.body = render(:template => "/home/manu/develop/parlement/trunk/app/views/mail_notify/publish.text.html.rhtml",
29
+ # :locals => { :elt => elt })
30
+ #end
31
+ #part "text/plain" do |a|
32
+ # a.body = render(:template => "mail_notify/publish.text.plain",
33
+ # :locals => { :elt => elt })
34
+ #end
35
+ # :body => email_builder.render(:file => "mail_notify/publish.text.html.rhtml")
36
+ #attachment :content_type => "text/html",
37
+ # :body => email_builder.render(:file => "mail_notify/publish.text.html.rhtml")
38
+ #attachment :content_type => "text/plain",
39
+ # :body => email_builder.render(:file => "mail_notify/publish.text.plain.rhtml")
40
+
41
+
25
42
  # This is the essential of a mailing list, you reply to the mailing list,
26
43
  # where every body sends their mail.
27
44
  # This very mail can be a mailing list all by itself...
28
45
  @headers['Reply-to'] = mailing_list(elt).id + '@' + ActionMailer::Base.server_settings[:domain]
29
46
 
30
- @headers['In-Reply-To'] = elt.parent.mail.message if elt.parent \
31
- and elt.parent.mail and elt.parent.mail.message
47
+ @headers['In-Reply-To'] = elt.parent.mail.message \
48
+ if elt.parent and elt.parent.mail and elt.parent.mail.message
32
49
 
33
50
  @sent_on = elt.created_on
34
51
 
@@ -39,9 +56,9 @@ class MailNotify < ActionMailer::Base
39
56
  @headers['references'] << parentMsg.message if parentMsg.message
40
57
  end
41
58
 
42
- @content_type = 'multipart/alternative'
43
-
44
59
  @headers['X-Mailer'] = ActionMailer::Base.server_settings[:domain] + " v" + PARLEMENT_VERSION
60
+
61
+ logger.info "Mail created"
45
62
  end
46
63
 
47
64
  private
@@ -11,7 +11,8 @@
11
11
  <%= text_field "person", "name", :size => 10 %>
12
12
 
13
13
  <%= link_to_function('+',
14
- "Element.toggle(this);"+visual_effect(:Grow, 'user_password_'+divId.to_s)) %>
14
+ "Element.toggle(this);"+visual_effect(:Grow, 'user_password_'+divId.to_s),
15
+ :class => "subscribeLink") %>
15
16
  </span>
16
17
 
17
18
  <span style="display: none;" id="user_password_<%= divId %>">
@@ -20,7 +21,8 @@
20
21
  <%= password_field "user", "password", :size => 10 %>
21
22
 
22
23
  <%= link_to_function('email? &gt;',
23
- "Element.toggle(this);"+visual_effect(:Grow, 'person_email_'+divId.to_s)) %>
24
+ "Element.toggle(this);"+visual_effect(:Grow, 'person_email_'+divId.to_s),
25
+ :class => "subscribeLink") %>
24
26
  </span>
25
27
 
26
28
  <span style="display: none;" id="person_email_<%= divId %>">
@@ -36,12 +38,12 @@
36
38
 
37
39
  <%= render :partial => '/help',
38
40
  :locals => { :divId => 'login'+divId.to_s, :content => '
39
- <p>You can propose an element</p>
41
+ <p>You can propose an element with</p>
40
42
  <ul>
41
- <li>with no pseudo</li>
42
- <li>with an unprotected pseudo</li>
43
- <li>with a password protected pseudo (click on the "+")</li>
44
- <li>with a password protected and email verified pseudo (TODO)</li>
43
+ <li>no pseudo</li>
44
+ <li>an unprotected pseudo</li>
45
+ <li>a password protected pseudo (click on "+")</li>
46
+ <li>a password protected and email verified pseudo</li>
45
47
  </ul>
46
48
  <p>
47
49
  The last method is the only secure way to protect a nickname on
@@ -7,20 +7,20 @@
7
7
 
8
8
  <% if @session[:person] %>
9
9
  <% if @session[:person].name and @session[:person].name != '' %>
10
- <div class="author">
10
+ <span class="author">
11
11
  <%= link_to(@session[:person].name,
12
12
  :controller => 'person',
13
13
  :action => 'show',
14
14
  :id => @session[:person]) %>
15
- </div>
15
+ </span>
16
16
  <% end %>
17
17
 
18
- <div class="logout">
18
+ <span class="logout">
19
19
  <%= link_to_remote('[X]',
20
20
  :update => divId,
21
21
  :url => { :controller => 'account', :action => 'logout', :divId => divId },
22
22
  :complete => visual_effect(:BlindDown, divId)) %>
23
- </div>
23
+ </span>
24
24
  <% else %>
25
25
 
26
26
  <%= render :partial => '/account/login', :locals => { :divId => divId } %>
@@ -1,35 +1,21 @@
1
1
  <% eltSubsNb = elt.children.count if eltSubsNb == nil %>
2
2
 
3
- <div id="elt_<%= elt.id %>" class="elt">
4
- <% if elt.person %>
5
- <div class="author">
6
- <%= link_to(elt.person.name,
7
- :controller => 'person', :action => 'show', :id => elt.person) %>
8
- </div>
9
- <% elsif not displayTitle? elt %>
10
- <div class="author">
11
- <%= ANONYMOUS_POSTER %>
12
- </div>
13
- <% end %>
14
-
15
- <div class="eltInfo" title="<%= elt.created_on %>">
16
- <!--
17
- <= link_to('@', :action => 'raw_elt', :id => elt) if elt.mail != nil >
18
- -->
19
- <% if elt.id and elt.children.count == 0 %>
20
- <%= link_to_remote('<span class="icon">&gt;&gt;</span>',
21
- :update => 'eltNew_'+elt.id.to_s,
22
- :url => { :controller => 'elt', :action => 'new', :id => elt },
23
- :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
24
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)) %>
25
- <% end %>
26
- </div>
27
-
3
+ <li id="elt_<%= elt.id %>" class="elt <%= displayTitle?(elt) ? 'titled' : '' %>">
28
4
  <% if eltTop or displayTitle? elt %>
29
5
  <span class="created_on">
30
6
  <%= elt.created_on.strftime('%d/%m/%y %H:%M') %>
31
7
  </span>
8
+ <% end %>
9
+
10
+ <% if elt.person %>
11
+ <span class="author">
12
+ <%= link_to(elt.person.name, :controller => 'person', :action => 'show', :id => elt.person) %>
13
+ </span>
14
+ <% elsif not displayTitle? elt %>
15
+ <span class="author" <%= ANONYMOUS_POSTER %>><%= ANONYMOUS_POSTER %></span>
16
+ <% end %>
32
17
 
18
+ <% if eltTop or displayTitle? elt %>
33
19
  <<%= eltTop ? 'h1' : 'h2' %>>
34
20
  <% if elt.id %>
35
21
  <%= link_to(textilize_without_paragraph(elt.subject),
@@ -40,46 +26,60 @@
40
26
  </<%= eltTop ? 'h1' : 'h2' %>>
41
27
  <% end %>
42
28
 
43
- <div class="eltBody">
44
- <p style="margin-top:0px;margin-bottom:0px"><%= format elt.body %></p>
29
+ <%= format elt.body %>
30
+
31
+ <% for att in elt.attachments %>
32
+ <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
33
+ '/attachment/file/'+att.file_relative_path %>
34
+ <% end %>
35
+
36
+ <!-- For IE -->&#160;
45
37
 
46
- <% for att in elt.attachments %>
47
- <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
48
- '/attachment/file/'+att.file_relative_path %>
38
+ <span class="eltQuickAdd" id="eltQuickAdd_<%= elt.id %>" title="<%= elt.created_on %>">
39
+ <% if elt.id and elt.children.count == 0 %>
40
+ <%= link_to_remote('<span class="icon">&gt;&gt;</span>',
41
+ { :update => 'eltNew_'+elt.id.to_s,
42
+ :url => { :controller => 'elt', :action => 'new', :id => elt },
43
+ :loading => visual_effect(:SwitchOff, 'eltQuickAdd_'+elt.id.to_s),
44
+ :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
45
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
46
+ { :href => url_for(:controller => 'elt', :action => 'new', :id => @elt)}) %>
49
47
  <% end %>
50
- </div>
48
+ </span>
51
49
 
52
- <div class="eltSub">
50
+ <span class="eltSub">
53
51
  <!-- Display automatically one element threads -->
54
- <div style="display:<%= (eltTop or eltSubsNb < 2) ? 'none' : '' %>"
52
+ <span <%= (eltTop or eltSubsNb < 2) ? 'style="display: none"' : '' %>
55
53
  class="eltMore" id="eltMore_<%= elt.id %>">
56
54
  <%= link_to_remote(eltSubsNb.to_s+' more',
57
- :update => 'eltSubs_'+elt.id.to_s,
55
+ { :update => 'eltSubs_'+elt.id.to_s,
58
56
  :url => { :controller => 'elt', :action => 'list', :id => elt },
59
- :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s)+
60
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s),
61
- :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)) %>
57
+ :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s),
58
+ :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
59
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
60
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
62
61
 
63
62
  <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
64
- :update => 'eltNew_'+elt.id.to_s,
63
+ { :update => 'eltNew_'+elt.id.to_s,
65
64
  :url => { :controller => 'elt', :action => 'new', :id => elt },
66
65
  :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
67
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)) %>
68
- </div>
66
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
67
+ { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
68
+ </span>
69
69
 
70
- <div style="display:<%= (eltTop or eltSubsNb == 1) ? '' : 'none' %>"
71
- class="eltSubs" id="eltSubs_<%= elt.id %>">
70
+ <span <%= (eltTop or eltSubsNb == 1) ? '' : 'style="display: none"' %>
71
+ id="eltSubs_<%= elt.id %>">
72
72
  <% if eltTop or eltSubsNb == 1 %>
73
73
  <%= render :partial => '/elt/list', :locals => { :elt => elt } %>
74
74
  <% end %>
75
- </div>
75
+ </span>
76
76
 
77
- <div style="display:none" class="eltNew" id="eltNew_<%= elt.id %>">
77
+ <span style="display: none" class="eltNew" id="eltNew_<%= elt.id %>">
78
78
  &nbsp;
79
- </div>
80
- </div>
79
+ </span>
80
+ </span>
81
81
 
82
- <div style="display:<%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'none' %>"
82
+ <span <%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'style="display: none"' %>
83
83
  id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
84
84
  class="eltSubsClose">
85
85
  <%= link_to_function('<span class="icon">&lt;&lt;</span> Close',
@@ -96,10 +96,11 @@
96
96
  <% end %>
97
97
 
98
98
  <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
99
- :update => 'eltNew_'+elt.id.to_s,
99
+ { :update => 'eltNew_'+elt.id.to_s,
100
100
  :url => { :controller => 'elt', :action => 'new', :id => elt },
101
101
  :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
102
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)) %>
103
- </div>
104
- </div>
102
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
103
+ { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
104
+ </span>
105
+ </li>
105
106