parlement 0.2 → 0.3

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 (125) hide show
  1. data/CHANGES +14 -4
  2. data/README +25 -5
  3. data/Rakefile +21 -21
  4. data/app/controllers/account_controller.rb +5 -1
  5. data/app/controllers/elt_controller.rb +7 -10
  6. data/app/controllers/person_controller.rb +9 -0
  7. data/app/controllers/subscriber_controller.rb +21 -0
  8. data/app/helpers/elt_helper.rb +25 -13
  9. data/app/helpers/mailman.rb +9 -92
  10. data/app/helpers/subscriber_helper.rb +2 -0
  11. data/app/models/attachment.rb +2 -0
  12. data/app/models/elt.rb +64 -2
  13. data/app/models/mail.rb +198 -0
  14. data/app/models/mail_notify.rb +63 -0
  15. data/app/models/person.rb +8 -1
  16. data/app/views/account/_login.rhtml +31 -28
  17. data/app/views/account/_show.rhtml +4 -4
  18. data/app/views/elt/_elt.rhtml +23 -28
  19. data/app/views/elt/_list.rhtml +6 -2
  20. data/app/views/elt/new.rhtml +1 -1
  21. data/app/views/elt/show.rhtml +32 -10
  22. data/app/views/layouts/top.rhtml +16 -10
  23. data/app/views/mail_notify/publish.text.html.rhtml +46 -0
  24. data/app/views/mail_notify/publish.text.plain.rhtml +2 -0
  25. data/app/views/person/_listElts.rhtml +33 -0
  26. data/app/views/person/show.rhtml +21 -19
  27. data/config/boot.rb +2 -0
  28. data/config/environment.rb +19 -13
  29. data/config/environments/development.rb +3 -1
  30. data/config/environments/production.rb +2 -0
  31. data/config/environments/test.rb +2 -0
  32. data/config/routes.rb +5 -2
  33. data/db/ROOT/mail.txt +2 -0
  34. data/db/ROOT/parlement/news/release0.2.txt +8 -0
  35. data/db/ROOT/parlement/news/release0.3.txt +11 -0
  36. data/db/ROOT/parlement/test.txt +6 -1
  37. data/db/ROOT/parlement.txt +23 -30
  38. data/db/ROOT/perso.txt +17 -18
  39. data/db/development_structure.sql +133 -217
  40. data/db/schema.rb +83 -0
  41. data/db/schema.sql +11 -15
  42. data/lib/data_import.rb +3 -1
  43. data/public/attachment/file/architecture.png +0 -0
  44. data/public/attachment/file/architecture.svg +8972 -0
  45. data/public/attachment/file/security.svg +8960 -0
  46. data/public/images/Sleep-Deprivation-5.JPG +0 -0
  47. data/public/images/eltBackground.png +0 -0
  48. data/public/images/eltBackground.svg +89 -0
  49. data/public/images/orange_by_darren_Hester_350o.jpg +0 -0
  50. data/public/images/rails.png +0 -0
  51. data/public/images/smile.png +0 -0
  52. data/public/images/smile.svg +257 -0
  53. data/public/images/world.png +0 -0
  54. data/public/images/world.svg +170 -0
  55. data/public/javascripts/controls.js +30 -1
  56. data/public/javascripts/dragdrop.js +210 -145
  57. data/public/javascripts/effects.js +261 -399
  58. data/public/javascripts/ie7.js +6 -0
  59. data/public/javascripts/prototype.js +131 -72
  60. data/public/oldindex.html +270 -71
  61. data/public/stylesheets/default.css +189 -215
  62. data/script/about +1 -1
  63. data/script/breakpointer +1 -1
  64. data/script/console +1 -1
  65. data/script/destroy +1 -1
  66. data/script/generate +1 -1
  67. data/script/performance/benchmarker +1 -1
  68. data/script/performance/profiler +1 -1
  69. data/script/plugin +1 -1
  70. data/script/process/reaper +1 -1
  71. data/script/process/spawner +1 -1
  72. data/script/process/spinner +1 -1
  73. data/script/runner +1 -1
  74. data/script/server +1 -1
  75. data/test/fixtures/elts.yml +2 -0
  76. data/test/fixtures/mail/mail_ruby +27 -0
  77. data/test/fixtures/mail/mail_rubyChild +28 -0
  78. data/test/fixtures/mail/mail_rubyWithAttachment +7932 -0
  79. data/test/fixtures/mail/mail_rubyWithSubject +27 -0
  80. data/test/fixtures/mails.yml +7 -1
  81. data/test/fixtures/people.yml +5 -0
  82. data/test/fixtures/subscribers.yml +11 -0
  83. data/test/functional/account_controller_test.rb +38 -37
  84. data/test/functional/subscriber_controller_test.rb +128 -0
  85. data/test/test_helper.rb +44 -0
  86. data/test/unit/attachment_test.rb +1 -1
  87. data/test/unit/elt_test.rb +3 -2
  88. data/test/unit/mail_notify_test.rb +37 -0
  89. data/test/unit/mail_test.rb +124 -1
  90. data/test/unit/notifier_test.rb +0 -14
  91. data/test/unit/person_test.rb +2 -1
  92. data/test/unit/subscriber_test.rb +35 -0
  93. data/test/unit/user_test.rb +3 -3
  94. data/vendor/plugins/file_column/CHANGELOG +64 -0
  95. data/vendor/plugins/file_column/README +54 -0
  96. data/vendor/plugins/file_column/Rakefile +36 -0
  97. data/vendor/plugins/file_column/TODO +6 -0
  98. data/vendor/plugins/file_column/init.rb +12 -0
  99. data/vendor/plugins/file_column/lib/file_column.rb +719 -0
  100. data/vendor/plugins/file_column/lib/file_column_helper.rb +145 -0
  101. data/vendor/plugins/file_column/lib/file_compat.rb +28 -0
  102. data/vendor/plugins/file_column/lib/magick_file_column.rb +188 -0
  103. data/vendor/plugins/file_column/lib/validations.rb +112 -0
  104. data/vendor/plugins/file_column/test/abstract_unit.rb +90 -0
  105. data/vendor/plugins/file_column/test/connection.rb +17 -0
  106. data/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
  107. data/vendor/plugins/file_column/test/file_column_test.rb +630 -0
  108. data/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
  109. data/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
  110. data/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
  111. data/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
  112. data/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
  113. data/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
  114. data/vendor/plugins/file_column/test/magick_test.rb +251 -0
  115. data/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
  116. data/vendor/plugins/guid/README.TXT +19 -0
  117. data/vendor/plugins/guid/init.rb +23 -0
  118. data/vendor/plugins/guid/lib/usesguid.rb +37 -0
  119. data/vendor/plugins/guid/lib/uuid22.rb +43 -0
  120. data/vendor/plugins/guid/lib/uuidtools.rb +565 -0
  121. metadata +83 -15
  122. data/db/ROOT/CV.txt +0 -166
  123. data/lib/file_column.rb +0 -263
  124. data/lib/file_column_helper.rb +0 -45
  125. /data/{lib → vendor/plugins/file_column/lib}/rails_file_column.rb +0 -0
data/CHANGES CHANGED
@@ -1,13 +1,23 @@
1
1
  - parlement changelog
2
2
 
3
+ == Version 0.3
4
+
5
+ Major version, adding the possibility to use not only the web forums, but mails
6
+
7
+ * mailing list functionality!!!
8
+ * new look
9
+ * tests all pass
10
+ * rails 1.0
11
+ * plugin guid
12
+ * W3C xhtml 1.0 compliant
13
+
14
+
3
15
  == Version 0.2
4
16
 
5
17
  Evolutions
6
18
 
7
- * Anonymous users doing a quick post (where the subject is not modified) will
8
- be marked as "anon"
9
- * Each person has a public page listing its posts (this page can also be used
10
- to post...)
19
+ * Anonymous users doing a quick post (where the subject is not modified) will be marked as "anon"
20
+ * Each person has a public page listing its posts (this page can also be used to post...)
11
21
  * Display the creation time for the most important posts
12
22
 
13
23
 
data/README CHANGED
@@ -1,9 +1,31 @@
1
1
  I am using debian, so here are a few commands I use:
2
- # apt-get install ruby
3
2
  # apt-get install postgresql
4
- # apt-get install libpgsql-ruby1.6
5
- # apt-get install libredcloth-ruby
3
+ # sudo su - postgres
4
+ # createuser /your_login/
5
+ # apt-get install ruby
6
+ # apt-get install libpgsql-ruby
6
7
  # apt-get install irb
8
+ # apt-get install libredcloth-ruby
9
+ # apt-get install rdoc
10
+
11
+ -> why???
12
+ # ln -s /sbin/ifconfig /bin/
13
+
14
+ # gem install -r rails
15
+ Only if you expect to develop and release:
16
+ # gem install -r meta_project
17
+
18
+
19
+ The database is setup for user "manu", you may need to change the file
20
+ config/database.yml for your own settings.
21
+
22
+ Change config/environment.rb to set the domain, default is something like
23
+ 'leparlement.org', define it as your web site or email domain.
24
+
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'
7
29
 
8
30
 
9
31
  Once you have everything set up (ruby, postgresql, redcloth, irb), you can
@@ -13,8 +35,6 @@ launch parlement thus:
13
35
  ~ ruby lib/data_import.rb
14
36
  ~ ruby ./script/server
15
37
 
16
- The database is setup for user "manu", you may need to change the file
17
- config/database.yml for your own settings.
18
38
 
19
39
  Now you can go to localhost:3000
20
40
 
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
35
35
  PKG_FILES = FileList[
36
36
  '[A-Z]*', 'app/**/*', 'components/**/*', 'config/**/*', 'db/**/*',
37
37
  'lib/**/*', 'public/**/*', 'script/**/*', 'test/**/*', 'vendor/**/*'
38
- ].exclude(/\bCVS\b|~$/)
38
+ ].exclude(/\bsvn\b|~$/)
39
39
 
40
40
  spec = Gem::Specification.new do |s|
41
41
  ## Basic information.
@@ -54,7 +54,7 @@ spec = Gem::Specification.new do |s|
54
54
  EOF
55
55
  s.files = PKG_FILES
56
56
  s.require_path = 'lib'
57
- s.autorequire = 'rails, meta_project'
57
+ s.autorequire = 'rails'
58
58
  s.has_rdoc = false
59
59
  s.requirements << 'none'
60
60
  s.test_files = Dir.glob('test/unit/*')
@@ -73,11 +73,10 @@ EOF
73
73
  s.add_dependency('rails')
74
74
  end
75
75
 
76
+ desc "Build Gem"
76
77
  Rake::GemPackageTask.new(spec) do |pkg|
77
- #pkg.gem_spec = spec
78
78
  pkg.need_zip = true
79
79
  pkg.need_tar = true
80
- #pkg.package_files.include("*")
81
80
  end
82
81
 
83
82
 
@@ -90,8 +89,8 @@ task :todo do
90
89
  end
91
90
  end
92
91
 
93
- #task :release => [:verify_env_vars, :release_files, :publish_doc, :publish_news, :tag]
94
- task :release => [:verify_env_vars, :release_files, :publish_news]
92
+ #task :release => [:verify_env_vars, :release_files, :publish_doc, :publish_news]
93
+ task :release => [:release_files, :publish_news]
95
94
 
96
95
  task :verify_env_vars do
97
96
  if not ENV["RUBYFORGE_USER"]
@@ -122,7 +121,6 @@ task :verify_env_vars do
122
121
  print "freshmeat's password: "
123
122
  ENV["FRESHMEAT_PASSWORD"] = STDIN.gets.chomp
124
123
  end
125
-
126
124
  end
127
125
 
128
126
  task :publish_doc do
@@ -131,7 +129,7 @@ task :publish_doc do
131
129
  end
132
130
 
133
131
  desc "Release files on RubyForge"
134
- task :release_files => [:gem] do
132
+ task :release_files => [:verify_env_vars, :package] do
135
133
  release_files = FileList[ "pkg/#{PKG_FILE_NAME}.gem",
136
134
  "pkg/#{PKG_FILE_NAME}.tgz",
137
135
  "pkg/#{PKG_FILE_NAME}.zip" ]
@@ -140,6 +138,8 @@ task :release_files => [:gem] do
140
138
  # Never hardcode user name and password in the Rakefile!
141
139
  release.user_name = ENV['RUBYFORGE_USER']
142
140
  release.password = ENV['RUBYFORGE_PASSWORD']
141
+ #puts "login: ", ENV['RUBYFORGE_USER']
142
+ #puts "password: ", ENV['RUBYFORGE_PASSWORD']
143
143
  release.files = release_files.to_a
144
144
  release.release_name = "#{PKG_NAME} #{PKG_VERSION}"
145
145
  # The rest of the options are defaults (among others, release_notes and release_changes, parsed from CHANGES)
@@ -148,24 +148,31 @@ end
148
148
 
149
149
 
150
150
  desc "Publish news"
151
- task :publish_news => [:gem] do
152
- Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
151
+ task :publish_news => [:verify_env_vars] do
152
+ #release_files = FileList[ "pkg/#{PKG_FILE_NAME}.gem",
153
+ # "pkg/#{PKG_FILE_NAME}.tgz",
154
+ # "pkg/#{PKG_FILE_NAME}.zip" ]
155
+
156
+ Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
153
157
  # Never hardcode user name and password in the Rakefile!
154
158
  news.user_name = ENV['RUBYFORGE_USER']
155
159
  news.password = ENV['RUBYFORGE_PASSWORD']
156
160
  end
157
161
 
162
+ """
158
163
  fm = DevTools::Freshmeat::FreshmeatService.new(ENV['FRESHMEAT_USER'], ENV['FRESHMEAT_PASSWORD'])
159
164
  fm.get_project_list.each do |p|
160
- puts p
161
165
  branches = fm.get_branch_list( p.shortName )
162
- puts branches.inspect
163
166
  release = fm.get_release( p.shortName, branches[0], p.version )
164
- puts release
167
+ if PKG_NAME == p.shortName
168
+ puts p
169
+ release.version = PKG_VERSION
170
+ release.changes = PKG_VERSION
171
+ end
165
172
  end
166
173
  puts fm.logout
167
174
 
168
- """
175
+
169
176
  Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::Fresh.new(PKG_NAME)) do |news|
170
177
  # Never hardcode user name and password in the Rakefile!
171
178
  news.user_name = ENV['RUBYFORGE_USER']
@@ -174,10 +181,3 @@ task :publish_news => [:gem] do
174
181
  """
175
182
  end
176
183
 
177
- desc "Tag all the CVS files with the latest release number (REL=x.y.z)"
178
- task :tag do
179
- reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}"
180
- puts "Tagging CVS with [#{reltag}]"
181
- sh %{cvs tag #{reltag}}
182
- end
183
-
@@ -1,3 +1,6 @@
1
+ #
2
+ # This class manages users inscription, login and logout
3
+ #
1
4
  class AccountController < UserController
2
5
  model :person
3
6
  model :user
@@ -116,6 +119,7 @@ class AccountController < UserController
116
119
 
117
120
  def logout
118
121
  @session[:person] = @person = nil
122
+ @session[:user] = @user = nil
119
123
  render :partial => 'login', :locals => { :divId => params[:divId] }
120
124
  end
121
125
 
@@ -143,8 +147,8 @@ class AccountController < UserController
143
147
  end
144
148
 
145
149
 
146
- protected
147
150
  # Mostly copied from the login engine
151
+ protected
148
152
  def signup
149
153
  if @person and not @user
150
154
  @user = User.new
@@ -1,7 +1,8 @@
1
- """
2
- This is the central component to parlement
3
- An element is just the name for a poll/message/issue
4
- """
1
+ #
2
+ # This is the central component to parlement
3
+ #
4
+ # An element is just the name for a poll/message/issue
5
+ #
5
6
  class EltController < ApplicationController
6
7
  def index
7
8
  params[:id] = params[:id].gsub(/.html/, '')
@@ -31,10 +32,12 @@ class EltController < ApplicationController
31
32
  end
32
33
 
33
34
  def rss
35
+ params[:id] = params[:id].gsub(/.rss/, '')
34
36
  @headers["Content-Type"] = "text/xml; charset=utf-8"
35
37
  @elt = Elt.find(params[:id]) if @elt == nil
36
38
  end
37
39
 
40
+ # Used to initialise the elt, its subject mainly
38
41
  def new
39
42
  @elt = Elt.new
40
43
  @elt.parent = Elt.find(params[:id])
@@ -61,12 +64,6 @@ class EltController < ApplicationController
61
64
  @elt.person = @session[:person]
62
65
 
63
66
  if params[:submit] == 'preview' or @elt.save
64
- #cookies[:person] = { :value => @elt.person.name,
65
- # :expires => Time.now + 360000 }
66
- #flash[:notice] = 'Elt was successfully created.'
67
- #redirect_to :action => 'top', :id => @elt.parent_id
68
- #render_component(:action => 'show', :id => @elt.id )
69
-
70
67
  render :partial => '/elt/elt', :locals => { :elt => @elt, :eltTop => false }
71
68
  else
72
69
  flash[:notice] = 'Error'
@@ -1,4 +1,7 @@
1
1
  class PersonController < ApplicationController
2
+ # To make sure we can also display properly this person's elements
3
+ helper :elt
4
+
2
5
  layout 'top'
3
6
  model :person
4
7
 
@@ -10,4 +13,10 @@ class PersonController < ApplicationController
10
13
  flash[:error] = "Person '#{params[:id]}' does not exist"
11
14
  redirect_to '/'
12
15
  end
16
+
17
+ def list
18
+ @person = Person.find(params[:id]) if @person == nil
19
+ render :partial => '/person/listElts', :locals => { :person => @person }
20
+ end
13
21
  end
22
+
@@ -0,0 +1,21 @@
1
+ class SubscriberController < ApplicationController
2
+
3
+ def subscribe
4
+ @elt = Elt.find(params[:id])
5
+
6
+ if @session[:person]
7
+ if @elt.subscribers.include?(@session[:person])
8
+ @elt.subscribers.delete(@session[:person])
9
+ logger.info "Unsubscribed #{@session[:person].name} from #{@elt.subject}..."
10
+ render :inline => "Unsubscribed..."
11
+ else
12
+ @elt.subscribers << @session[:person]
13
+ logger.info "Subscribed #{@session[:person].name} to #{@elt.subject}..."
14
+ render :inline => "Subscribed..."
15
+ end
16
+ else
17
+ puts "Not logged in!"
18
+ render :inline => "First you need to login... it's easy, juste type a pseudo, any pseudo ;-) "
19
+ end
20
+ end
21
+ end
@@ -16,22 +16,34 @@ module EltHelper
16
16
  .gsub(/^\d+[\.-]\s+/, '# ') \
17
17
  if data != nil
18
18
 
19
+ # Remove any leading and finishing <p> </p>
19
20
  textiled = text.blank? ? "" : RedCloth.new(text).to_html
20
21
  if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end
21
22
  if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end
22
- return textiled
23
23
 
24
- """
25
- hard_breaks = false
26
- auto_link textilize_without_paragraph(data \
27
- .gsub(/\&\#8211\;/, '* ') \
28
- .gsub(/^-\s/, '* ') \
29
- .gsub(/(\s+)\/([\w\s�������]*)\//, '\\1_\\2_') \
30
- .gsub(/[^\n]\n^>/, '') \
31
- .gsub(/^\d+[ \.-]+/, '# ') \
32
- # ).gsub(/(.{65,182})<br\s\/>/, \
33
- # ).gsub(/([\r\n\<\>=\w\d\s.\:;,$*?!\-����������\"\&#;()\/]{65,182})<br\s\/>([^>])/,
34
- ) if data != nil
35
- """
24
+ textiled
25
+
26
+ # hard_breaks = false
27
+ # auto_link textilize_without_paragraph(data \
28
+ # .gsub(/\&\#8211\;/, '* ') \
29
+ # .gsub(/^-\s/, '* ') \
30
+ # .gsub(/[^\n]\n^>/, '') \
31
+ # .gsub(/^\d+[ \.-]+/, '# ') \
32
+ # # ).gsub(/(.{65,182})<br\s\/>/, \
33
+ # # ).gsub(/([\r\n\<\>=\w\d\s.\:;,$*?!\-����������\"\&#;()\/]{65,182})<br\s\/>([^>])/,
34
+ # ) if data != nil
35
+ end
36
+
37
+ #
38
+ # Should we display an element's title
39
+ #
40
+ # The algo used is simple, display a title if it is not a simple reply to its
41
+ # parent
42
+ #
43
+ def displayTitle? elt
44
+ #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}/
36
47
  end
37
48
  end
49
+
@@ -1,96 +1,13 @@
1
- """
2
- Receive an email from which an elt is created. An associated mail is kept to
3
- make sure we don't lose any data. Attachments are also created in an associated
4
- table
5
- """
1
+ #
2
+ # Receive an email from which an elt is created.
3
+ #
4
+ # An associated mail is kept to make sure we don't lose any data. Attachments
5
+ # are also created in an associated table
6
+ #
6
7
  class Mailman < ActionMailer::Base
7
- """ This is to make sure we only have utf-8, no iso-8859 """
8
- def unquote(text)
9
- text.gsub(/\=\?.*?\?\=/) do |m|
10
- TMail::Unquoter.unquote_and_convert_to(m, 'utf-8')
11
- end
12
- end
13
-
14
8
  def receive(email)
15
- @elt = Elt.new
16
- @elt.created_on = email.date
17
- @elt.subject = unquote(email.subject)
18
-
19
- @elt.body = ''
20
-
21
- @elt.person = Person.find_by_name(unquote(email.friendly_from))
22
- @elt.person = Person.new if @elt.person == nil
23
- @elt.person.name = unquote(email.friendly_from)
24
- @elt.person.email = email.from.first
25
-
26
- if email.references != nil
27
- # Try to fin its email parent in the db
28
- for parent in email.references
29
- m = Mail.find_by_message(parent.to_s)
30
- @elt.parent = m.elt if m != nil
31
- end
32
- end
33
-
34
- if @elt.parent == nil
35
- parentId = @elt.subject.match(/\[\w*\]/)
36
- logger.info parentId
37
- if parentId != nil
38
- parentId = parentId[0].gsub(/[\[\]]/, '')
39
- parentElt = Elt.find(parentId)
40
- logger.info parentElt
41
- if parentElt != nil
42
- @elt.subject = @elt.subject
43
- @elt.parent_id = parentId
44
- end
45
- logger.info @elt.subject
46
- end
47
- end
48
-
49
- @elt.parent_id = 'mails' if @elt.parent == nil
50
-
51
-
52
- mngAttachment(email) if email != nil
53
-
54
-
55
- logger.info email.from.first
56
- @mail = Mail.new
57
- logger.info email.friendly_from
58
- @mail.message = email.message_id
59
- logger.info email.references
60
- @mail.mail_parents = email.references
61
-
62
- @mail.file = email.encoded
63
-
64
- @elt.save
65
- @mail.elt = @elt
66
- @mail.save
67
- end
68
-
69
- def mngAttachment(attachment)
70
- if attachment.content_type == 'text/plain'
71
- @elt.body += attachment.body
72
- elsif attachment.multipart?
73
- attachment.parts.each do |part|
74
- mngAttachment(part)
75
- end
76
- elsif attachment.content_type != 'text/html'
77
- @attach = @elt.attachments.build
78
- body = attachment.body
79
-
80
- @attach.content_type = attachment.content_type
81
-
82
- def body.original_filename=(orig)
83
- @original_filename = orig
84
- end
85
- body.original_filename = attachment.type_param('name')
86
- def body.original_filename
87
- @original_filename
88
- end
89
- def body.read
90
- self.to_s
91
- end
92
-
93
- @attach.file = body
94
- end
9
+ elt = Elt.new
10
+ elt.receive(email)
95
11
  end
96
12
  end
13
+
@@ -0,0 +1,2 @@
1
+ module SubscriberHelper
2
+ end
@@ -1,4 +1,6 @@
1
1
  class Attachment < ActiveRecord::Base
2
+ usesguid
3
+
2
4
  belongs_to :elt
3
5
  file_column :file
4
6
  end
data/app/models/elt.rb CHANGED
@@ -1,17 +1,79 @@
1
+ #
2
+ # This is, in fact, the main parlement class!
3
+ #
1
4
  class Elt < ActiveRecord::Base
5
+ usesguid
6
+
2
7
  acts_as_tree :order => "position is not null, position, created_on"
3
- belongs_to :person
8
+
4
9
  has_one :mail, :dependent => true
5
10
  has_many :attachments, :dependent => true
6
11
 
12
+ belongs_to :person
13
+
14
+ has_and_belongs_to_many :subscribers,
15
+ :class_name => "Person",
16
+ :join_table => "subscribers"
17
+
7
18
  # for live_tree
8
19
  def name
9
20
  subject
10
21
  end
11
22
 
23
+ # Just a quick method to get all subscribers as a simple list
24
+ def all_recipients
25
+ result = Array.new
26
+ eltRecipient = self
27
+ while eltRecipient
28
+ result.concat eltRecipient.subscribers
29
+ eltRecipient = eltRecipient.parent
30
+ end
31
+ logger.debug "all_recipients result: #{result.to_s}"
32
+ return result
33
+ end
34
+
35
+ #
36
+ # Receive this new elt as an email, sent through app/helpers/mailman.rb
37
+ #
38
+ def receive(mail)
39
+ logger.info "Receive \"#{mail.subject}\""
40
+
41
+ # TODO
42
+ # Loop detection, will need more work
43
+ mail1 = Mail.find_by_message(mail.message_id)
44
+ # The to_s seems necessary
45
+ mail2 = Mail.find_by_message(mail['X-Message-Id'].to_s) if mail['X-Message-Id']
46
+
47
+ if not mail1 and not mail2
48
+ self.mail = Mail.new if not self.mail
49
+ self.mail.elt = self
50
+ self.mail.receive(mail)
51
+ save
52
+ else
53
+ logger.info "Already received (id: #{mail.message_id})...\n"
54
+ end
55
+ end
56
+
57
+ #
58
+ # Save and publish this elt
59
+ #
12
60
  def save
13
61
  super
14
- logger.info 'hello world!!!'
62
+ publish
63
+ logger.info "\n"
64
+ end
65
+
66
+ private
67
+
68
+ #
69
+ # Mail the elt to all subscribers
70
+ #
71
+ def publish
72
+ logger.info "Publish #{subject}"
73
+ self.mail = Mail.new if not self.mail
74
+ self.mail.elt = self
75
+ self.mail.publish
76
+ self.mail.save
15
77
  end
16
78
  end
17
79