parlement 0.6 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
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 } %>