parlement 0.6 → 0.7

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 (76) hide show
  1. data/CHANGES +13 -0
  2. data/README +51 -38
  3. data/app/controllers/account_controller.rb +65 -37
  4. data/app/controllers/application.rb +1 -1
  5. data/app/controllers/elt_controller.rb +1 -0
  6. data/app/models/elt.rb +25 -14
  7. data/app/models/mail.rb +36 -35
  8. data/app/models/mail_notify.rb +23 -0
  9. data/app/views/account/_login.rhtml +1 -1
  10. data/app/views/account/_show.rhtml +22 -5
  11. data/app/views/elt/_elt.rhtml +44 -47
  12. data/app/views/elt/_listByDate.rhtml +7 -7
  13. data/app/views/elt/show.rhtml +3 -3
  14. data/app/views/layouts/top.rhtml +1 -0
  15. data/app/views/person/show.rhtml +5 -0
  16. data/config/environment.rb +1 -1
  17. data/db/ROOT/parlement/Parlement_fr.txt +46 -0
  18. data/db/ROOT/parlement/news/Version_06.txt +25 -0
  19. data/db/ROOT/parlement/news/Version_07.txt +12 -0
  20. data/db/ROOT/parlement/test.txt +14 -5
  21. data/db/ROOT/parlement.txt +2 -0
  22. data/db/development_structure.sql +119 -44
  23. data/db/migrate/004_people_image.rb +9 -0
  24. data/lib/data_import.rb +9 -13
  25. data/public/javascripts/mybehaviour.js +41 -0
  26. data/test/fixtures/img.png +0 -0
  27. data/test/fixtures/mail/avatar +249 -0
  28. data/test/fixtures/people.yml +1 -1
  29. data/test/functional/account_controller_test.rb +108 -56
  30. data/test/functional/elt_controller_test.rb +6 -6
  31. data/test/unit/elt_test.rb +1 -1
  32. data/test/unit/mail_test.rb +17 -0
  33. data/vendor/plugins/engines/CHANGELOG +91 -53
  34. data/vendor/plugins/engines/README +1 -1
  35. data/vendor/plugins/engines/generators/engine/templates/init_engine.erb +6 -4
  36. data/vendor/plugins/engines/generators/engine/templates/test/test_helper.erb +5 -1
  37. data/vendor/plugins/engines/init.rb +8 -3
  38. data/vendor/plugins/engines/lib/engines/action_mailer_extensions.rb +6 -5
  39. data/vendor/plugins/engines/lib/engines/action_view_extensions.rb +10 -6
  40. data/vendor/plugins/engines/lib/engines/active_record_extensions.rb +3 -1
  41. data/vendor/plugins/engines/lib/engines/dependencies_extensions.rb +27 -16
  42. data/vendor/plugins/engines/lib/engines/routing_extensions.rb +28 -0
  43. data/vendor/plugins/engines/lib/engines/testing_extensions.rb +6 -2
  44. data/vendor/plugins/engines/lib/engines.rb +77 -12
  45. data/vendor/plugins/engines/tasks/deprecated_engines.rake +7 -0
  46. data/vendor/plugins/engines/tasks/engines.rake +25 -10
  47. data/vendor/plugins/login_engine/CHANGELOG +8 -0
  48. data/vendor/plugins/login_engine/README +2 -2
  49. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +4 -1
  50. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +1 -1
  51. data/vendor/plugins/login_engine/init_engine.rb +6 -5
  52. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +1 -1
  53. data/vendor/plugins/output_compression/CHANGELOG +0 -0
  54. data/vendor/plugins/output_compression/MIT-LICENSE +20 -0
  55. data/vendor/plugins/output_compression/README +4 -4
  56. data/vendor/plugins/output_compression/init.rb +1 -2
  57. data/vendor/plugins/output_compression/lib/output_compression.rb +84 -66
  58. data/vendor/plugins/output_compression/{Rakefile → rakefile} +22 -22
  59. data/vendor/plugins/output_compression/test/output_test.rb +11 -0
  60. data/vendor/plugins/output_compression/test/test_controller.rb +3 -0
  61. data/vendor/plugins/output_compression/test/test_helper.rb +14 -0
  62. data/vendor/plugins/responds_to_parent/MIT-LICENSE +20 -0
  63. data/vendor/plugins/responds_to_parent/README +42 -0
  64. data/vendor/plugins/responds_to_parent/Rakefile +22 -0
  65. data/vendor/plugins/responds_to_parent/init.rb +1 -0
  66. data/vendor/plugins/responds_to_parent/lib/responds_to_parent.rb +45 -0
  67. data/vendor/plugins/responds_to_parent/test/responds_to_parent_test.rb +115 -0
  68. metadata +33 -16
  69. data/vendor/plugins/login_engine/tasks/tasks.rake +0 -4
  70. data/vendor/plugins/output_compression/tasks/output_compression_tasks.rake +0 -4
  71. data/vendor/plugins/output_compression/test/output_compression_test.rb +0 -8
  72. /data/db/ROOT/parlement/news/{release0.1.txt → Version_01.txt} +0 -0
  73. /data/db/ROOT/parlement/news/{release0.2.txt → Version_02.txt} +0 -0
  74. /data/db/ROOT/parlement/news/{release0.3.txt → Version_03.txt} +0 -0
  75. /data/db/ROOT/parlement/news/{release0.4.txt → Version_04.txt} +0 -0
  76. /data/db/ROOT/parlement/news/{release0.5.txt → Version_05.txt} +0 -0
data/CHANGES CHANGED
@@ -1,5 +1,18 @@
1
1
  - parlement changelog
2
2
 
3
+ == Version 0.7
4
+
5
+ Avatars
6
+
7
+ * avatar initial upload
8
+ * correcting an automatic elt id generation, now removing all non characters
9
+ * avatar upload, reception and emission by mail
10
+ * addition of a "people" page listing all current and past avatars
11
+ * logout now possible in text based browsers
12
+ * attachments now derive their id from their element's subject
13
+ * >> for one liners now better placed as floats
14
+ * going from pluging output_compress to output_compression
15
+
3
16
  == Version 0.6
4
17
 
5
18
  Voting using V and Λ buttons (picturing -1 and +1 values, down and up).
data/README CHANGED
@@ -1,4 +1,11 @@
1
- I am using debian, so here are a few commands I use:
1
+ _ _
2
+ _ __ __ _ _ __| | ___ _ __ ___ ___ _ __ | |_
3
+ | '_ \ / _` | '__| |/ _ \ '_ ` _ \ / _ \ '_ \| __|
4
+ | |_) | (_| | | | | __/ | | | | | __/ | | | |_
5
+ | .__/ \__,_|_| |_|\___|_| |_| |_|\___|_| |_|\__|
6
+ |_|
7
+
8
+ I use debian, here are the commands I use to setup my machine for parlement:
2
9
  # apt-get install postgresql
3
10
  # sudo su - postgres
4
11
  # createuser /your_login/
@@ -7,12 +14,16 @@ I am using debian, so here are a few commands I use:
7
14
  # apt-get install irb
8
15
  # apt-get install rdoc
9
16
 
10
- -> why???
11
- # ln -s /sbin/ifconfig /bin/
17
+ Basically this install postgresql, ruby and the ruby driver to psql. Ruby on
18
+ Rails is database agnostic, parlement will be sometimes in the near future.
12
19
 
20
+ You need to install "ruby gems":http://docs.rubygems.org
21
+
22
+ And then:
13
23
  # gem install rails
14
24
  # gem install redcloth
15
- Only if you expect to develop and release:
25
+
26
+ Only if you expect to develop and do any release:
16
27
  # gem install meta_project
17
28
 
18
29
 
@@ -20,49 +31,51 @@ The database is setup for user "manu", you may need to change the file
20
31
  config/database.yml for your own settings.
21
32
 
22
33
  Change config/environment.rb to set the domain, default is something like
23
- 'leparlement.org', define it as your web site or email domain.
34
+ 'leparlement.org', use your web site or email domain.
24
35
 
25
- In procmail, define a rule to redirect the relevant mail to parlement, I use:
26
- :0 c
27
- * ^TO parlement|leparlement.org
28
- | /home/manu/parlement/trunk/script/runner 'Mailman.receive STDIN.read'
36
+ When you want to setup your server as a node in the graph of servers, redirect
37
+ your incoming mails to *your* parlement. In procmail (or any other mail
38
+ filtering tool), define this kind of rule:
39
+ :0 c
40
+ * ^TO parlement|leparlement.org
41
+ | /home/manu/parlement/trunk/script/runner 'Mailman.receive STDIN.read'
29
42
 
30
43
 
31
44
  Once you have everything set up (ruby, postgresql, redcloth, irb), you can
32
- launch parlement thus:
33
- ~ cd parlement
45
+ initialise and launch parlement this way:
46
+
47
+ Go into the right folder
48
+ ~ cd parlement/trunk
49
+
50
+ Create the db
34
51
  ~ psql -q template1 -f db/schema.sql
52
+
53
+ Populate the db
35
54
  ~ ruby lib/data_import.rb
55
+
56
+ Migrate the db to its last version
57
+ ~ rake migrate
58
+
59
+ Launch the developement web server
36
60
  ~ ruby ./script/server
37
61
 
62
+ Now you can go to http://localhost:3000 with your browser.
63
+
64
+ You can check that everything works all right on your machine with the testing suite:
65
+ ~ rake
66
+
67
+
68
+ __ __ _
69
+ \ \ / /__| | ___ ___ _ __ ___ ___
70
+ \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \
71
+ \ V V / __/ | (_| (_) | | | | | | __/
72
+ \_/\_/ \___|_|\___\___/|_| |_| |_|\___|
73
+
74
+
75
+
76
+
38
77
 
39
- Now you can go to localhost:3000
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
78
+ What is below is just for future personal reference...
66
79
 
67
80
 
68
81
  # Here is my console code to reset threads from their original mails:
@@ -5,7 +5,7 @@ class AccountController < UserController
5
5
  model :person
6
6
  model :user
7
7
 
8
- def login
8
+ def login
9
9
  # Cleaning up
10
10
  session[:person] = session[:user] = nil
11
11
 
@@ -21,11 +21,9 @@ class AccountController < UserController
21
21
  # Create the pseudo
22
22
  begin
23
23
  Person.transaction(@person) do
24
- @person = Person.new
25
- @person.name = login
24
+ @person = Person.new :id => login.gsub(/\s/, '_'), :name => login
26
25
  if @person.save
27
- logger.info "person: "+@person.to_s
28
- logger.info "person.id: "+@person.id.to_s
26
+ logger.info "person.id: #{@person.id}, name: #{@person.name}"
29
27
  flash.now[:notice] = "Pseudo created"
30
28
  session[:person] = @person
31
29
  else
@@ -105,7 +103,7 @@ class AccountController < UserController
105
103
 
106
104
  elsif email == @person.email
107
105
  # User protected by password and with the same email as entered
108
- key = @user.generate_security_token
106
+ key = @user.generate_security_token
109
107
  url = url_for(:action => 'check_key')
110
108
  url += "?user[id]=#{@user.id}&key=#{key}"
111
109
  UserNotify::deliver_forgot_password(@user, url)
@@ -116,17 +114,17 @@ class AccountController < UserController
116
114
 
117
115
  render :partial => 'show', :locals => {
118
116
  :divId => params[:divId], :choices => getAllVotes }
119
- end
117
+ end
120
118
 
121
119
 
122
- def logout
123
- session[:person] = @person = nil
124
- session[:user] = @user = nil
120
+ def logout
121
+ session[:person] = @person = nil
122
+ session[:user] = @user = nil
125
123
  render :partial => 'show', :locals => {
126
124
  :divId => params[:divId], :choices => getAllVotes }
127
- end
125
+ end
128
126
 
129
- def check_key
127
+ def check_key
130
128
  if @user = User.authenticate_by_token(@params[:user][:id], @params[:key])
131
129
  #@user = User.find(:first, :conditions => "security_token = '#{params[:key]}'")
132
130
  @person = Person.find_by_name(@user.login) if @user
@@ -139,7 +137,7 @@ class AccountController < UserController
139
137
  <br/> \
140
138
  <a href='#{url_for :controller => 'elt', :action => 'show', :id => nil }'>\
141
139
  Back</a>",
142
- :layout => 'top'
140
+ :layout => 'top'
143
141
  else
144
142
  render :text => "<h3>Sorry, no corresponding check key :-(</h3> \
145
143
  <br/> \
@@ -149,41 +147,71 @@ class AccountController < UserController
149
147
  end
150
148
  end
151
149
 
150
+ def setAvatar
151
+ logger.info "Setting up an avatar for person #{session[:person].name}"
152
+
153
+ @elt = Elt.find_by_id 'people'
154
+ if !@elt
155
+ @elt = Elt.new :parent_id => 'ROOT', :subject => 'people', :body => ''
156
+ @elt.save!
157
+ @elt.publish
158
+ @elt.parent.add_child @elt
159
+ end
160
+ avatar = @elt.children.build :person => session[:person], :body => ""
161
+ att = avatar.attachments.build :file => params[:person][:image],
162
+ :content_type => params[:person][:image].content_type
163
+
164
+ avatar.subject = att.file.gsub /^.*public.*\//, ''
165
+ avatar.publish
166
+ @elt.add_child avatar
167
+
168
+ @person = session[:person]
169
+ @person.image = "/attachment/file/#{att.file_relative_path}"
170
+ @person.save!
171
+
172
+ responds_to_parent do
173
+ render :update do |page|
174
+ page << "$('person_avatar').src = '#{@person.image}';"
175
+ end
176
+ end
177
+ end
178
+
152
179
 
153
- # Mostly copied from the login engine
154
180
  protected
155
- def signup
181
+
182
+ # Mostly copied from the login engine
183
+ def signup
156
184
  if @person and not @user
157
185
  @user = User.new
158
186
  @user.login = @person.name
159
187
  end
160
188
 
161
189
  @user.email = @params[:person][:email]
162
- begin
163
- User.transaction(@user) do
164
- unless LoginEngine.config(:use_email_notification)
165
- @user.verified = 1
166
- end
167
- if @user.save
168
- key = @user.generate_security_token
169
- #url = url_for(:action => 'home', 'user[id]' => @user.id, :key => key)
190
+ begin
191
+ User.transaction(@user) do
192
+ unless LoginEngine.config(:use_email_notification)
193
+ @user.verified = 1
194
+ end
195
+ if @user.save
196
+ key = @user.generate_security_token
197
+ #url = url_for(:action => 'home', 'user[id]' => @user.id, :key => key)
170
198
  url = url_for(:action => 'check_key')
171
199
  url += "?user[id]=#{@user.id}&key=#{key}"
172
- #flash[:notice] = 'Signup successful!'
200
+ #flash[:notice] = 'Signup successful!'
173
201
  flash.now['notice 3'] = 'Confirmation email sent to '+@user.email
174
- if LoginEngine.config(:use_email_notification)
175
- UserNotify.deliver_signup(@user, params[:user][:password], url)
176
- flash['notice 4'] = ' Please check your registered email account to verify your account registration.'
177
- end
178
- #redirect_to :action => 'login'
179
- end
180
- end
181
- rescue Exception => e
182
- flash.now[:notice] = nil
183
- flash.now[:warning] = 'Error creating account: confirmation email not sent'
184
- logger.error e
185
- end
186
- end
202
+ if LoginEngine.config(:use_email_notification)
203
+ UserNotify.deliver_signup(@user, params[:user][:password], url)
204
+ flash['notice 4'] = ' Please check your registered email account to verify your account registration.'
205
+ end
206
+ #redirect_to :action => 'login'
207
+ end
208
+ end
209
+ rescue Exception => e
210
+ flash.now[:notice] = nil
211
+ flash.now[:warning] = 'Error creating account: confirmation email not sent'
212
+ logger.error e
213
+ end
214
+ end
187
215
 
188
216
  def getAllVotes
189
217
  return if !params[:divId]
@@ -9,7 +9,7 @@ class ApplicationController < ActionController::Base
9
9
 
10
10
  before_filter :set_charset
11
11
  after_filter :fix_unicode_for_safari
12
- after_filter :compress_output
12
+ after_filter OutputCompressionFilter
13
13
 
14
14
  # automatically and transparently fixes utf-8 bug
15
15
  # with Safari when using xmlhttp
@@ -115,6 +115,7 @@ class EltController < ApplicationController
115
115
 
116
116
  vote.publish
117
117
  @elt.add_child vote
118
+ expire_fragment :action => 'show', :id => @elt.id
118
119
 
119
120
  render :partial => '/elt/choice', :locals => { :elt => @elt }
120
121
  end
data/app/models/elt.rb CHANGED
@@ -4,21 +4,27 @@
4
4
  # It holds all posts, that's mostly a subject and a body, plus their
5
5
  # relationships in a tree of elements
6
6
  #
7
+ # An element is linked to:
8
+ # - mail
9
+ # - person
10
+ # - voters
11
+ # - choices
12
+ # - attachments
13
+ # - subscribers
14
+ #
15
+ # The element id is generated from the subject for better readability (but only
16
+ # normal characters are used)
17
+ #
7
18
  class Elt < ActiveRecord::Base
8
- usesguid
9
-
10
- acts_as_nested_set :order => "position is not null, position, created_on"
11
- acts_as_tree :order => "position is not null, position, created_on", :counter_cache => true
12
-
13
19
  has_one :mail, :dependent => true
14
- has_many :attachments, :dependent => true
15
-
16
20
  belongs_to :person
17
-
21
+ has_many :voters, :through => :choices, :source => :person
22
+ has_many :choices, :dependent => true, :order => "choices.created_on"
23
+ has_many :attachments, :dependent => true
18
24
  has_and_belongs_to_many :subscribers, :class_name => "Person", :join_table => "subscribers"
19
25
 
20
- has_many :choices, :dependent => true, :order => "choices.created_on"
21
- has_many :voters, :through => :choices, :source => :person
26
+ acts_as_nested_set :order => "position is not null, position, created_on"
27
+ acts_as_tree :order => "position is not null, position, created_on", :counter_cache => true
22
28
 
23
29
  # Just a quick method to get all subscribers as a simple list
24
30
  def all_recipients
@@ -53,7 +59,7 @@ class Elt < ActiveRecord::Base
53
59
  save!
54
60
 
55
61
  parent.vote Regexp.last_match(1), person if body =~ /^\s*(-1|0|\+1)(\s|$)/
56
- if self.body.gsub(/(-1|0|\+1)/, '').strip.empty?
62
+ if Regexp.last_match(1) and self.body.gsub(/(-1|0|\+1)/, '').strip.empty?
57
63
  # Hide simple votes
58
64
  vote -1
59
65
  else
@@ -63,12 +69,17 @@ class Elt < ActiveRecord::Base
63
69
  end
64
70
 
65
71
  def save
66
- if new_record? and subject and not subject.empty?
72
+ if new_record?
67
73
  # Let's generate a nice looking id
68
- self.id = new_id = subject.gsub(/\[[\w-]*\]/, '').strip.gsub(/[\s\?\&\#\\\/:]+/, '_')
74
+ self.id = new_id = subject.gsub(/\[[\w-]*\]/, '').strip \
75
+ .gsub(/\s/, '_').gsub(/[^\w]+/, '').gsub(/_+/, '_') \
76
+ .gsub(/(^_|_$)/, '') \
77
+ if subject
78
+ self.id ||= "elt"
69
79
 
70
80
  discrim = 0
71
- self.id = "#{new_id}_#{discrim}" while discrim += 1 and self.class.find_by_id self.id
81
+ self.id = "#{new_id}_#{discrim}" \
82
+ while discrim += 1 and self.class.find_by_id self.id
72
83
  end
73
84
 
74
85
  super
data/app/models/mail.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # Receive a mail from which an elt is created.
3
3
  #
4
4
  # An associated mail is kept to make sure we don't lose any data. Attachments
5
- # are also created in an associated table
5
+ # are also managed in an associated table
6
6
  #
7
7
  class Mail < ActiveRecord::Base
8
8
  usesguid
@@ -24,9 +24,7 @@ class Mail < ActiveRecord::Base
24
24
  logger.info "Already received (id: #{mail.message_id})...\n"
25
25
 
26
26
  else
27
- m = Mail.new
28
- m.receive mail
29
- m
27
+ Mail.new.receive mail
30
28
  end
31
29
  end
32
30
 
@@ -46,24 +44,10 @@ class Mail < ActiveRecord::Base
46
44
  #
47
45
  def receive(mail)
48
46
  logger.info "Receive mail #{mail.message_id}"
49
- if mail['X-Leparlement-Elt-Id'] then
50
- build_elt :id => mail['X-Leparlement-Elt-Id'].to_s,
51
- :created_on => mail.date,
52
- :subject => unquote(mail.subject),
53
- :body => '',
54
- :mail => self
55
- else
56
- build_elt :created_on => mail.date,
57
- :subject => unquote(mail.subject),
58
- :body => '',
59
- :mail => self
60
- end
61
-
62
- elt.person = Person.find_by_email(mail.from) \
63
- || Person.find_by_name(unquote(mail.friendly_from)) \
64
- || elt.build_person
65
- elt.person.name = unquote mail.friendly_from
66
- elt.person.email = mail.from.first
47
+ build_elt :created_on => mail.date,
48
+ :subject => unquote(mail.subject),
49
+ :body => '',
50
+ :mail => self
67
51
 
68
52
  # Try to find its mail parent in the db
69
53
  if mail.in_reply_to and Mail.find_by_message mail.in_reply_to
@@ -110,11 +94,24 @@ class Mail < ActiveRecord::Base
110
94
 
111
95
  mngAttachment(mail) if mail
112
96
 
113
- self.message = mail.message_id
97
+ elt.person = Person.find_by_email(mail.from) \
98
+ || Person.find_by_name(unquote(mail.friendly_from)) \
99
+ || elt.build_person(:id => unquote(mail.friendly_from).gsub(/\s/, '_'),
100
+ :name => unquote(mail.friendly_from),
101
+ :email => mail.from.first)
102
+
114
103
  self.mail_parents = mail.references
104
+ self.message = mail.message_id
115
105
  self.file = mail.encoded
116
106
  elt.publish
107
+
108
+ if mail.to.to_s.match(/people@#{ActionMailer::Base.server_settings[:domain]}/)
109
+ elt.person.image = "/attachment/file/#{elt.attachments.first.file_relative_path}"
110
+ elt.person.save
111
+ end
112
+
117
113
  elt.parent.add_child elt
114
+ self
118
115
  end
119
116
 
120
117
  """ _ _ _ _
@@ -172,7 +169,6 @@ class Mail < ActiveRecord::Base
172
169
 
173
170
  # Added to make sure it is not lost, but not modified if already existant
174
171
  mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
175
- mail['X-leparlement-elt-Id'] = elt.id
176
172
 
177
173
  MailNotify::deliver(mail) if mail.destinations and not mail.destinations.empty?
178
174
 
@@ -194,7 +190,20 @@ class Mail < ActiveRecord::Base
194
190
 
195
191
  # Get and store the attachments
196
192
  def mngAttachment(attachment)
197
- if attachment.content_type == 'text/plain'
193
+ if attachment.multipart?
194
+ attachment.parts.each { |part| mngAttachment part }
195
+ elsif attachment.disposition_param 'filename'
196
+ File.open("/tmp/#{attachment.disposition_param('filename')}", 'w') { |file|
197
+ file << attachment.body
198
+ elt.attachments.build :file => file, :content_type => attachment.content_type
199
+ }
200
+ elsif attachment.type_param 'name'
201
+ File.open("/tmp/#{attachment.type_param('name')}", 'w') { |file|
202
+ file << attachment.body
203
+ elt.attachments.build :file => file, :content_type => attachment.content_type
204
+ }
205
+ elsif attachment.content_type.match(/text\/plain/) \
206
+ or (!attachment.content_type and attachment.parts.size == 0)
198
207
  charset = attachment.type_param 'charset'
199
208
  if charset and !charset.empty?
200
209
  if attachment.transfer_encoding == 'quoted-printable'
@@ -206,17 +215,9 @@ class Mail < ActiveRecord::Base
206
215
  elt.body += Iconv.new(charset, 'utf-8').iconv(attachment.body)
207
216
  end
208
217
  else
209
- elt.body += attachment.body
218
+ # Here too have to remove any eventual null character!
219
+ elt.body += attachment.body.gsub(/\0/, '')
210
220
  end
211
-
212
- elsif attachment.multipart?
213
- attachment.parts.each { |part| mngAttachment part }
214
-
215
- elsif attachment.type_param 'name'
216
- File.open('/tmp/'+attachment.type_param('name'), 'w') { |file|
217
- file << attachment.body
218
- elt.attachments.build :file => file
219
- }
220
221
  end
221
222
  end
222
223
  end
@@ -23,6 +23,29 @@ class MailNotify < ActionMailer::Base
23
23
  # Try to render the element as html
24
24
  body :elt => elt
25
25
 
26
+ templates = Dir.glob("#{template_path}/#{@template}.*")
27
+ templates.each do |path|
28
+ # TODO: don't hardcode rhtml|rxml
29
+ basename = File.basename(path)
30
+ next unless md = /^([^\.]+)\.([^\.]+\.[^\+]+)\.(rhtml|rxml)$/.match(basename)
31
+ template_name = basename
32
+ content_type = md.captures[1].gsub('.', '/')
33
+ @parts << ActionMailer::Part.new(:content_type => content_type,
34
+ :disposition => "inline", :charset => charset,
35
+ :body => render_message(template_name, @body))
36
+ end
37
+ unless @parts.empty?
38
+ @content_type = "multipart/alternative"
39
+ @parts = sort_parts(@parts, @implicit_parts_order)
40
+ end
41
+
42
+ elt.attachments.each { |att|
43
+ attachment(att.content_type ? att.content_type : "") { |a|
44
+ a.filename = att.file.gsub /^.*public.*\//, ''
45
+ a.body = File.read(att.file)
46
+ }
47
+ }
48
+
26
49
  # This is the essential of a mailing list, you reply to the mailing list,
27
50
  # where every body sends their mail.
28
51
  # This very mail can be a mailing list all by itself...
@@ -2,7 +2,7 @@
2
2
  :update => divId,
3
3
  :url => { :controller => 'account', :action => 'login', :divId => divId },
4
4
  :before => visual_effect(:SwitchOff, divId)+";resetChoices();",
5
- :complete => visual_effect(:BlindDown, divId)) %>
5
+ :loaded => visual_effect(:BlindDown, divId)) %>
6
6
 
7
7
  <%= hidden_field 'elt', 'id' if @elt %>
8
8
 
@@ -18,13 +18,14 @@
18
18
  </div>
19
19
  <% end %>
20
20
 
21
- <% if session[:person] %>
21
+ <% if @person = session[:person] %>
22
22
  <span class="logout">
23
23
  <%= link_to_remote('[X]',
24
- :update => divId,
25
- :url => { :controller => 'account', :action => 'logout', :divId => divId },
26
- :before => visual_effect(:SwitchOff, divId)+";resetChoices();",
27
- :complete => visual_effect(:BlindDown, divId)) %>
24
+ { :update => divId,
25
+ :url => { :controller => 'account', :action => 'logout', :divId => divId },
26
+ :before => visual_effect(:SwitchOff, divId)+";resetChoices();",
27
+ :complete => visual_effect(:BlindDown, divId) },
28
+ { :href => url_for(:controller => 'account', :action => 'logout') }) %>
28
29
  </span>
29
30
 
30
31
  <% if session[:person].name and session[:person].name != '' %>
@@ -35,6 +36,22 @@
35
36
  :id => session[:person] %>&gt;
36
37
  </span>
37
38
  <% end %>
39
+
40
+ <div>
41
+ <%= image_tag (@person.image ? @person.image : "/javascripts/blank.gif"),
42
+ :id => "person_avatar", :class => "avatar" %>
43
+ </div>
44
+
45
+ <%= form_tag( { :controller => "account", :action => "setAvatar"},
46
+ :multipart => true, :target => "avatar", :class => "setAvatar") %>
47
+ <label>
48
+ Avatar:
49
+ <%= file_field "person", "image", :onchange => "submit()" %>
50
+ </label>
51
+ <%= submit_tag 'Ok' %>
52
+ <%= end_form_tag %>
53
+
54
+ <iframe id="avatar" name="avatar" style="display: none"></iframe>
38
55
  <% else %>
39
56
 
40
57
  <%= render :partial => '/account/login', :locals => { :divId => divId } %>