parlement 0.14 → 0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. data/CHANGES +41 -1
  2. data/MEMORY +66 -5
  3. data/README +10 -5
  4. data/Rakefile +15 -23
  5. data/app/controllers/account_controller.rb +48 -43
  6. data/app/controllers/{application.rb → application_controller.rb} +15 -12
  7. data/app/controllers/elt_controller.rb +77 -32
  8. data/app/controllers/subscriber_controller.rb +11 -10
  9. data/app/helpers/application_helper.rb +14 -1
  10. data/app/helpers/elt_helper.rb +9 -7
  11. data/app/models/elt.rb +25 -24
  12. data/app/models/mail.rb +44 -47
  13. data/app/models/person_notify.rb +2 -2
  14. data/app/models/user.rb +128 -2
  15. data/app/models/user_notify.rb +15 -15
  16. data/app/views/account/_login.rhtml +39 -39
  17. data/app/views/account/_show.rhtml +22 -30
  18. data/app/views/account/signup.rhtml +2 -2
  19. data/app/views/elt/_choice.rhtml +6 -6
  20. data/app/views/elt/_elt.rhtml +27 -32
  21. data/app/views/elt/choices.rhtml +16 -18
  22. data/app/views/elt/list/_byDate.rhtml +14 -14
  23. data/app/views/elt/list/_byVote.rhtml +15 -15
  24. data/app/views/elt/list/_children.rhtml +48 -40
  25. data/app/views/elt/list/_subscribers.rhtml +1 -1
  26. data/app/views/elt/new.rhtml +22 -21
  27. data/app/views/elt/rss.rxml +4 -11
  28. data/app/views/elt/show.rhtml +65 -61
  29. data/app/views/elt/vote_rss.rxml +4 -11
  30. data/app/views/layouts/top.rhtml +39 -50
  31. data/app/views/person/_listElts.rhtml +1 -1
  32. data/app/views/person/show.rhtml +1 -1
  33. data/{vendor/plugins/login_engine/app → app}/views/user_notify/change_password.rhtml +0 -0
  34. data/{vendor/plugins/login_engine/app → app}/views/user_notify/delete.rhtml +0 -0
  35. data/{vendor/plugins/login_engine/app → app}/views/user_notify/forgot_password.rhtml +0 -0
  36. data/{vendor/plugins/login_engine/app → app}/views/user_notify/pending_delete.rhtml +0 -0
  37. data/{vendor/plugins/login_engine/app → app}/views/user_notify/signup.rhtml +0 -0
  38. data/config/boot.rb +97 -32
  39. data/config/environment.rb +37 -35
  40. data/config/environments/development.rb +2 -3
  41. data/config/environments/production.rb +3 -0
  42. data/config/initializers/string_ruby_1.8.rb +10 -0
  43. data/config/routes.rb +17 -22
  44. data/db/schema.rb +102 -74
  45. data/lib/tasks/rspec.rake +167 -0
  46. data/public/404.html +25 -7
  47. data/public/500.html +26 -7
  48. data/public/dispatch.cgi +0 -0
  49. data/public/dispatch.fcgi +0 -0
  50. data/public/dispatch.rb +0 -0
  51. data/public/images/live_tree_branch_collapsed_icon.gif +0 -0
  52. data/public/images/live_tree_branch_expanded_icon.gif +0 -0
  53. data/public/images/live_tree_leaf_icon.gif +0 -0
  54. data/public/javascripts/application.js +258 -0
  55. data/public/javascripts/controls.js +544 -414
  56. data/public/javascripts/dragdrop.js +229 -198
  57. data/public/javascripts/effects.js +499 -459
  58. data/public/javascripts/prototype.js +2926 -1121
  59. data/public/javascripts/shadedborder.js +68 -50
  60. data/public/stylesheets/default.css +34 -34
  61. data/public/stylesheets/live_tree.css +0 -0
  62. data/public/stylesheets/scaffold.css +6 -6
  63. data/script/about +0 -0
  64. data/script/autospec +6 -0
  65. data/script/benchmarker +0 -0
  66. data/script/breakpointer +0 -0
  67. data/script/console +0 -0
  68. data/script/dbconsole +3 -0
  69. data/script/destroy +0 -0
  70. data/script/generate +0 -0
  71. data/script/plugin +0 -0
  72. data/script/profiler +0 -0
  73. data/script/runner +0 -0
  74. data/script/server +0 -0
  75. data/script/spec +10 -0
  76. data/script/spec_server +9 -0
  77. data/test/unit/attachment_test.rb +4 -4
  78. data/test/unit/choice_test.rb +1 -1
  79. data/test/unit/elt_test.rb +9 -9
  80. data/test/unit/mail_notify_test.rb +2 -2
  81. data/test/unit/mail_test.rb +18 -11
  82. data/test/unit/person_notify_test.rb +1 -1
  83. data/test/unit/person_test.rb +1 -1
  84. data/test/unit/subscriber_test.rb +1 -1
  85. data/test/unit/user_test.rb +81 -0
  86. data/test/unit/visit_test.rb +6 -6
  87. data/vendor/plugins/activerecord_foreign_key_extensions/init.rb +2 -0
  88. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +182 -0
  89. data/vendor/plugins/activerecord_text_id_extensions/init.rb +2 -0
  90. data/vendor/plugins/activerecord_text_id_extensions/lib/active_record_extensions.rb +24 -0
  91. data/vendor/plugins/acts_as_nested_set/README +15 -0
  92. data/vendor/plugins/acts_as_nested_set/init.rb +1 -0
  93. data/vendor/plugins/acts_as_nested_set/lib/active_record/acts/nested_set.rb +210 -0
  94. data/vendor/plugins/acts_as_nested_set/test/nested_set_test.rb +269 -0
  95. data/vendor/plugins/acts_as_tree/README +26 -0
  96. data/vendor/plugins/acts_as_tree/Rakefile +22 -0
  97. data/vendor/plugins/acts_as_tree/init.rb +1 -0
  98. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +96 -0
  99. data/vendor/plugins/{output_compression/CHANGELOG → acts_as_tree/test/abstract_unit.rb} +0 -0
  100. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +219 -0
  101. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  102. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  103. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  104. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  105. data/vendor/plugins/classic_pagination/CHANGELOG +152 -0
  106. data/vendor/plugins/classic_pagination/README +18 -0
  107. data/vendor/plugins/{output_compression/rakefile → classic_pagination/Rakefile} +22 -22
  108. data/vendor/plugins/classic_pagination/init.rb +33 -0
  109. data/vendor/plugins/classic_pagination/install.rb +1 -0
  110. data/vendor/plugins/classic_pagination/lib/pagination.rb +405 -0
  111. data/vendor/plugins/classic_pagination/lib/pagination_helper.rb +135 -0
  112. data/vendor/plugins/classic_pagination/test/fixtures/companies.yml +24 -0
  113. data/vendor/plugins/classic_pagination/test/fixtures/company.rb +9 -0
  114. data/vendor/plugins/classic_pagination/test/fixtures/developer.rb +7 -0
  115. data/vendor/plugins/classic_pagination/test/fixtures/developers.yml +21 -0
  116. data/vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml +13 -0
  117. data/vendor/plugins/classic_pagination/test/fixtures/project.rb +3 -0
  118. data/vendor/plugins/classic_pagination/test/fixtures/projects.yml +7 -0
  119. data/vendor/plugins/classic_pagination/test/fixtures/replies.yml +13 -0
  120. data/vendor/plugins/classic_pagination/test/fixtures/reply.rb +5 -0
  121. data/vendor/plugins/classic_pagination/test/fixtures/schema.sql +42 -0
  122. data/vendor/plugins/classic_pagination/test/fixtures/topic.rb +3 -0
  123. data/vendor/plugins/classic_pagination/test/fixtures/topics.yml +22 -0
  124. data/vendor/plugins/classic_pagination/test/helper.rb +117 -0
  125. data/vendor/plugins/classic_pagination/test/pagination_helper_test.rb +38 -0
  126. data/vendor/plugins/classic_pagination/test/pagination_test.rb +177 -0
  127. data/vendor/plugins/file_column/lib/file_column.rb +1 -1
  128. data/vendor/plugins/file_column/test/file_column_test.rb +0 -0
  129. metadata +151 -197
  130. data/app/helpers/live_tree.rb +0 -238
  131. data/app/views/elt/_form.rhtml +0 -31
  132. data/app/views/elt/show_tree.rhtml +0 -8
  133. data/config/environments/user_environment.rb +0 -1
  134. data/db/ROOT/Titemagli.txt +0 -3
  135. data/db/ROOT/titemagli.txt +0 -9
  136. data/public/javascripts/behaviour.js +0 -254
  137. data/public/javascripts/ie7-load.htc +0 -1
  138. data/public/javascripts/ie7.js +0 -6
  139. data/public/javascripts/live_tree.js +0 -749
  140. data/public/javascripts/mybehaviour.js +0 -225
  141. data/public/javascripts/scriptaculous.js +0 -47
  142. data/public/javascripts/slider.js +0 -283
  143. data/public/stylesheets/blue.css +0 -471
  144. data/vendor/plugins/engines/CHANGELOG +0 -241
  145. data/vendor/plugins/engines/MIT-LICENSE +0 -21
  146. data/vendor/plugins/engines/README +0 -64
  147. data/vendor/plugins/engines/Rakefile +0 -32
  148. data/vendor/plugins/engines/UPGRADING +0 -93
  149. data/vendor/plugins/engines/about.yml +0 -7
  150. data/vendor/plugins/engines/generators/plugin_migration/USAGE +0 -45
  151. data/vendor/plugins/engines/generators/plugin_migration/plugin_migration_generator.rb +0 -79
  152. data/vendor/plugins/engines/generators/plugin_migration/templates/plugin_migration.erb +0 -13
  153. data/vendor/plugins/engines/init.rb +0 -40
  154. data/vendor/plugins/engines/install.rb +0 -32
  155. data/vendor/plugins/engines/lib/engines.rb +0 -323
  156. data/vendor/plugins/engines/lib/engines/deprecated_config_support.rb +0 -135
  157. data/vendor/plugins/engines/lib/engines/plugin.rb +0 -214
  158. data/vendor/plugins/engines/lib/engines/plugin_list.rb +0 -31
  159. data/vendor/plugins/engines/lib/engines/plugin_migrator.rb +0 -60
  160. data/vendor/plugins/engines/lib/engines/rails_extensions.rb +0 -6
  161. data/vendor/plugins/engines/lib/engines/rails_extensions/active_record.rb +0 -19
  162. data/vendor/plugins/engines/lib/engines/rails_extensions/dependencies.rb +0 -143
  163. data/vendor/plugins/engines/lib/engines/rails_extensions/migrations.rb +0 -155
  164. data/vendor/plugins/engines/lib/engines/rails_extensions/public_asset_helpers.rb +0 -116
  165. data/vendor/plugins/engines/lib/engines/rails_extensions/rails.rb +0 -20
  166. data/vendor/plugins/engines/lib/engines/rails_extensions/rails_initializer.rb +0 -86
  167. data/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb +0 -77
  168. data/vendor/plugins/engines/lib/engines/rails_extensions/templates.rb +0 -140
  169. data/vendor/plugins/engines/lib/engines/testing.rb +0 -87
  170. data/vendor/plugins/engines/tasks/engines.rake +0 -149
  171. data/vendor/plugins/login_engine/CHANGELOG +0 -22
  172. data/vendor/plugins/login_engine/README +0 -344
  173. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +0 -262
  174. data/vendor/plugins/login_engine/app/helpers/user_helper.rb +0 -88
  175. data/vendor/plugins/login_engine/app/models/user.rb +0 -7
  176. data/vendor/plugins/login_engine/app/models/user_notify.rb +0 -75
  177. data/vendor/plugins/login_engine/app/views/user/_edit.rhtml +0 -11
  178. data/vendor/plugins/login_engine/app/views/user/_password.rhtml +0 -9
  179. data/vendor/plugins/login_engine/app/views/user/change_password.rhtml +0 -17
  180. data/vendor/plugins/login_engine/app/views/user/edit.rhtml +0 -23
  181. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +0 -18
  182. data/vendor/plugins/login_engine/app/views/user/home.rhtml +0 -7
  183. data/vendor/plugins/login_engine/app/views/user/login.rhtml +0 -17
  184. data/vendor/plugins/login_engine/app/views/user/logout.rhtml +0 -8
  185. data/vendor/plugins/login_engine/app/views/user/signup.rhtml +0 -17
  186. data/vendor/plugins/login_engine/db/migrate/001_initial_schema.rb +0 -25
  187. data/vendor/plugins/login_engine/init_engine.rb +0 -11
  188. data/vendor/plugins/login_engine/install.rb +0 -4
  189. data/vendor/plugins/login_engine/lib/login_engine.rb +0 -62
  190. data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +0 -113
  191. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +0 -155
  192. data/vendor/plugins/login_engine/public/stylesheets/login_engine.css +0 -81
  193. data/vendor/plugins/login_engine/test/fixtures/users.yml +0 -41
  194. data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +0 -536
  195. data/vendor/plugins/login_engine/test/mocks/mail.rb +0 -14
  196. data/vendor/plugins/login_engine/test/mocks/time.rb +0 -19
  197. data/vendor/plugins/login_engine/test/test_helper.rb +0 -11
  198. data/vendor/plugins/login_engine/test/unit/user_test.rb +0 -114
  199. data/vendor/plugins/output_compression/MIT-LICENSE +0 -20
  200. data/vendor/plugins/output_compression/README +0 -4
  201. data/vendor/plugins/output_compression/init.rb +0 -1
  202. data/vendor/plugins/output_compression/lib/output_compression.rb +0 -84
  203. data/vendor/plugins/output_compression/test/output_test.rb +0 -11
  204. data/vendor/plugins/output_compression/test/test_controller.rb +0 -3
  205. data/vendor/plugins/output_compression/test/test_helper.rb +0 -14
@@ -1,20 +1,23 @@
1
1
  # The filters added to this controller will be run for all controllers in the application.
2
2
  # Likewese will all the methods added be available for all controllers.
3
3
 
4
- require 'login_engine'
5
- require 'term/ansicolor'
4
+ # Added temporarily, until gettext has evolved to invlude it
5
+ ## See http://zargony.com/2008/02/12/edge-rails-and-gettext-undefined-method-file_exists-nomethoderror
6
+ module ActionView
7
+ class Base
8
+ delegate :file_exists?, :to => :finder unless respond_to?(:file_exists?)
9
+ end
10
+ end
6
11
 
7
12
  class ApplicationController < ActionController::Base
8
- helper_method :filter
9
-
10
- include LoginEngine
11
13
  include Term::ANSIColor
12
14
 
13
15
  init_gettext "parlement"
14
16
 
17
+ helper_method :filter
18
+
15
19
  before_filter :set_login_from_cookie
16
20
  #after_filter :fix_unicode_for_safari
17
- after_filter OutputCompressionFilter
18
21
 
19
22
  # automatically and transparently fixes utf-8 bug
20
23
  # with Safari when using xmlhttp
@@ -26,15 +29,15 @@ class ApplicationController < ActionController::Base
26
29
  end
27
30
 
28
31
  def set_login_from_cookie
29
- unless session[:lastUpdatedView] or session[:person]
32
+ unless session[:lastUpdatedView] or session[:person_id]
30
33
  if (cookies[:person_name] and \
31
34
  person = Person.find_by_name(cookies[:person_name])) and \
32
35
  ((!person.user and !cookies[:salted_password]) \
33
36
  or (person.user \
34
37
  and person.user.salted_password == cookies[:salted_password]))
35
38
  logger.info yellow { bold { "#{person.name} is back" } }
36
- session[:person] = person
37
- session[:user] = person.user
39
+ session[:person_id] = person.id
40
+ session[:user_id] = person.user.id if person.user
38
41
 
39
42
  person.last_login = Time.now
40
43
  person.save!
@@ -43,11 +46,11 @@ class ApplicationController < ActionController::Base
43
46
  end
44
47
 
45
48
  def filter
46
- if request.cookies['filter'] && request.cookies['filter'][0]
47
- filter = request.cookies['filter'][0].to_i - 1
49
+ if request.cookies['filter'] && request.cookies['filter']
50
+ filter = request.cookies['filter'].to_i - 1
48
51
  filter = nil unless filter >= 0
49
52
  else
50
- filter = 0
53
+ filter = 1
51
54
  end
52
55
  filter
53
56
  end
@@ -1,26 +1,43 @@
1
1
  #
2
- # This is the central component to parlement
2
+ # This is the central element to parlement
3
3
  #
4
4
  # An element is just the name for a poll/message/issue
5
5
  #
6
6
  class EltController < ApplicationController
7
7
  def index
8
- params[:id] = params[:id].gsub(/.html/, '')
9
8
  show
10
9
  end
11
10
 
12
11
  def show
12
+ params[:id] = request.subdomains[0] unless params[:id]
13
+ params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id]
13
14
  params[:id] = params[:id].gsub(/.html/, '')
15
+
14
16
  @elt = Elt.find(params[:id])
15
17
  @title = @elt.subject
16
18
  @title += " (parlement)" if !@title.downcase.include? "parlement"
17
19
 
18
- render :layout => 'top'
20
+ render :layout => 'top', :template => 'elt/show'
21
+
22
+ #rescue ActiveRecord::StatementInvalid => e
23
+ # load 'db/schema.rb'
24
+ # redirect_to '/'
19
25
 
20
26
  rescue ActiveRecord::RecordNotFound => e
21
- flash[:error] = _("Element %s does not exist") % params[:id]
22
- headers["Status"] = "301 Moved Permanently"
23
- redirect_to '/'
27
+ root = Elt.find_by_id('ROOT')
28
+ if root and root.children.size > 0
29
+ render :status => 404, :file => "#{RAILS_ROOT}/public/404.html"
30
+ else
31
+ if root
32
+ @elt = root
33
+ else
34
+ @elt = Elt.new :subject => '', :lft => 0, :rgt => 1, :last_activity => Time.now
35
+ @elt.id = 'ROOT'
36
+ @elt.save
37
+ end
38
+ flash[:notice] = _("You need to create a top object (click on the new icon below)")
39
+ render :layout => 'top'
40
+ end
24
41
  end
25
42
 
26
43
  def list
@@ -49,14 +66,7 @@ class EltController < ApplicationController
49
66
  end
50
67
 
51
68
  def updateView
52
- if session[:lastUpdatedView] && session[:lastUpdatedView] > Time.now - 9 then
53
- # Protection against some browsers updating too fast
54
- logger.info "Too soon"
55
- render :inline => ""
56
- return
57
- end
58
-
59
- session[:lastUpdatedView] ||= Time.now - 10
69
+ session[:lastUpdatedView] ||= Time.now - UPDATE_VIEW_PERIOD
60
70
 
61
71
  @elt = Elt.find(params[:id])
62
72
  acts = ""
@@ -69,7 +79,7 @@ class EltController < ApplicationController
69
79
  </script> \
70
80
  " if @elt.last_activity > session[:lastUpdatedView]
71
81
 
72
- if person = session[:person]
82
+ if person = Person.find_by_id(session[:person_id])
73
83
  visits = Visit.count \
74
84
  :joins => "JOIN elts e1 ON e1.id = '#{params[:id]}' \
75
85
  JOIN elts e2 ON visits.elt_id = e2.id \
@@ -98,14 +108,14 @@ class EltController < ApplicationController
98
108
 
99
109
  visit = Visit.find_by_person_id_and_elt_id(person, params[:id])
100
110
  if visit and person.last_login and person.last_login > visit.created_on then
101
- logger.info "New visit"
111
+ logger.info yellow { "New visit" }
102
112
  visit.destroy
103
113
  visit = nil
104
114
  end
105
115
  visit = Visit.new(:person => person, :elt_id => params[:id]) unless visit
106
116
  visit.filter = filter
107
117
  visit.save!
108
- logger.info "#{visits} visit(s), #{subscribers} subscriber(s)"
118
+ logger.info magenta { "#{visits} visit(s), #{subscribers} subscriber(s)" }
109
119
  end
110
120
 
111
121
  session[:lastUpdatedView] = Time.now
@@ -113,37 +123,61 @@ class EltController < ApplicationController
113
123
  end
114
124
 
115
125
  def rss
126
+ params[:id] = nil if params[:id].size == 0
127
+ params[:id] = request.subdomains[0] unless params[:id]
128
+ params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id]
116
129
  params[:id] = params[:id].gsub(/.rss/, '')
117
130
  headers["Content-Type"] = "text/xml; charset=utf-8"
118
131
  @elt = Elt.find(params[:id]) if @elt == nil
132
+
133
+ rescue ActiveRecord::RecordNotFound => e
134
+ redirect_to '/404.html'
119
135
  end
120
136
 
121
137
  def vote_rss
138
+ params[:id] = nil if params[:id].size == 0
139
+ params[:id] = request.subdomains[0] unless params[:id]
140
+ params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id]
122
141
  params[:id] = params[:id].gsub(/.rss/, '')
123
142
  headers["Content-Type"] = "text/xml; charset=utf-8"
124
143
  @elt = Elt.find(params[:id]) if @elt == nil
144
+
145
+ rescue ActiveRecord::RecordNotFound => e
146
+ redirect_to '/404.html'
125
147
  end
126
148
 
127
149
  # Used to initialise the elt, its subject mainly
128
150
  def new
129
151
  @elt = Elt.new(:parent_id => params[:id], :body => "")
130
152
 
131
- if @elt.parent.subject.include? 'Re: '
132
- @elt.subject = @elt.parent.subject
153
+ if @elt.parent then
154
+ if @elt.parent.subject.include? 'Re: '
155
+ @elt.subject = @elt.parent.subject
156
+ else
157
+ @elt.subject = 'Re: '+@elt.parent.subject
158
+ end
133
159
  else
134
- @elt.subject = 'Re: '+@elt.parent.subject
160
+ # Rejected if you are not coming from a valid elt
161
+ render :status => 404, :file => "#{RAILS_ROOT}/public/404.html"
135
162
  end
136
163
  end
137
164
 
138
165
  def create
139
166
  @elt = Elt.new(params[:elt])
140
- @elt.person = session[:person]
167
+ @elt.person = Person.find_by_id(session[:person_id])
141
168
 
142
- if !session[:person] \
143
- and (@elt.subject =~ /([<>\/]|href)/ \
144
- or @elt.body =~ /(.*(http|href)(.*\n)*){3}/ \
145
- or @elt.body =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i \
146
- or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i) then
169
+ if !@elt.parent then
170
+ # Rejected if you are not coming from a valid elt
171
+ render :status => 404, :file => "#{RAILS_ROOT}/public/404.html"
172
+ return
173
+ end
174
+
175
+ if ((!@elt.person \
176
+ and (@elt.subject =~ /([<>\/]|href)/ \
177
+ or @elt.body =~ /(.*(http|href)(.*\n)*)/ \
178
+ or @elt.body =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i \
179
+ or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i)) \
180
+ or ((!@elt.person or @elt.person.elts.size <= 1) and @elt.body =~ /(http|href)/)) then
147
181
  logger.error red { underline { "SPAM! '#{@elt.subject}'" } }
148
182
  logger.error "SPAM! '#{@elt.body}'"
149
183
  flash[:error] = _('Sorry, to fight spam "<" ">" or "href" are forbidden in the subject, and there can not be more than 3 links in the body, you also can\'t input one simple email or more than 3 emails!')
@@ -182,7 +216,13 @@ class EltController < ApplicationController
182
216
 
183
217
  def vote
184
218
  @elt = Elt.find params[:id]
185
- unless params[:choice][:value] =~ /^\s*(-1|0|\+1)(\s|$)/ then
219
+ if !session[:person_id] then
220
+ flash[:error] = 'Sorry, need to be authenticated to vote!'
221
+ render :partial => '/elt/choice', :locals => { :elt => @elt }
222
+ return
223
+ end
224
+
225
+ if !params[:choice][:value] =~ /^\s*(-1|0|\+1)(\s|$)/ then
186
226
  logger.error red { underline { "SPAM! through the vote" } }
187
227
  logger.error params[:choice][:value]
188
228
  flash[:error] = 'Sorry, you can only vote here!'
@@ -191,24 +231,29 @@ class EltController < ApplicationController
191
231
  end
192
232
 
193
233
  vote = @elt.children.build
194
- vote.person = session[:person]
234
+ vote.person = Person.find_by_id(session[:person_id])
195
235
  vote.subject = @elt.subject
196
236
  vote.subject = 'Re: '+vote.subject if vote.subject and !vote.subject.include? 'Re: '
197
237
  vote.body = params[:choice][:value]
198
238
 
199
- choice = Choice.find_by_elt_id_and_person_id @elt.id, (session[:person] ? session[:person].id : nil)
239
+ choice = Choice.find_by_elt_id_and_person_id @elt.id, session[:person_id]
200
240
 
201
241
  if choice and choice.value == vote.body.to_i then
202
- logger.info "#{(session[:person] ? session[:person].name : 'null')} voting 0"
242
+ logger.info "#{session[:person_id]} voting 0"
203
243
  vote.body = "0"
204
244
  else
205
- logger.info "#{(session[:person] ? session[:person].name : 'null')} voting #{params[:choice][:value]}"
245
+ logger.info "#{session[:person_id]} voting #{params[:choice][:value]}"
206
246
  end
207
247
 
208
248
  vote.publish
209
249
  @elt.add_child vote
210
- expire_fragment :action => 'show', :id => @elt.id
211
250
 
212
251
  render :partial => '/elt/choice', :locals => { :elt => @elt }
213
252
  end
253
+
254
+ def choices
255
+ @elt = Elt.find params[:id]
256
+ rescue ActiveRecord::RecordNotFound => e
257
+ render :status => 404, :file => "#{RAILS_ROOT}/public/404.html"
258
+ end
214
259
  end
@@ -6,19 +6,20 @@
6
6
  class SubscriberController < ApplicationController
7
7
  def subscribe
8
8
  @elt = Elt.find params[:id]
9
+ @person = Person.find(session[:person_id])
9
10
 
10
- if session[:person]
11
- if @elt.subscribers.include?(session[:person])
12
- Subscription.find_by_person_id_and_elt_id(session[:person].id, @elt.id).destroy
13
- logger.info yellow { "User #{session[:person].name} unsubscribed from #{@elt.subject}..." }
14
- elsif @elt.all_recipients.include?(session[:person])
11
+ if @person
12
+ if @elt.subscribers.include?(@person)
13
+ Subscription.find_by_person_id_and_elt_id(@person.id, @elt.id).destroy
14
+ logger.info yellow { "User #{@person.name} unsubscribed from #{@elt.subject}..." }
15
+ elsif @elt.all_recipients.include?(@person)
15
16
  elt2 = @elt
16
- elt2 = elt2.parent until elt2.subscribers.include?(session[:person])
17
- Subscription.find_by_person_id_and_elt_id(session[:person].id, elt2.id).destroy
18
- logger.info yellow { "User #{session[:person].name} unsubscribed from #{elt2.subject}..." }
17
+ elt2 = elt2.parent until elt2.subscribers.include?(@person)
18
+ Subscription.find_by_person_id_and_elt_id(@person.id, elt2.id).destroy
19
+ logger.info yellow { "User #{@person.name} unsubscribed from #{elt2.subject}..." }
19
20
  else
20
- @elt.subscriptions.create :person => session[:person], :filter => filter
21
- logger.info yellow { "User #{session[:person].name} subscribed to #{@elt.id} with filter #{filter}..." }
21
+ @elt.subscriptions.create :person => @person, :filter => filter
22
+ logger.info yellow { "User #{@person.name} subscribed to #{@elt.id} with filter #{filter}..." }
22
23
  end
23
24
  else
24
25
  puts "Not logged in!"
@@ -1,4 +1,17 @@
1
1
  # Methods added to this helper will be available to all templates in the application.
2
2
  module ApplicationHelper
3
- include LoginEngine
3
+ def link_to(*args, &block)
4
+ if (request.subdomains[0] \
5
+ and args[1][:id] \
6
+ and (args[1][:id] == request.subdomains[0] \
7
+ or (args[1][:id].class == Elt and args[1][:id].id == request.subdomains[0])))
8
+ args[1][:id] = ''
9
+ elsif ! request.subdomains[0] \
10
+ and args[1][:id].class == Elt \
11
+ and args[1][:id].id == Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id
12
+ args[1][:id] = ''
13
+ end
14
+
15
+ super(*args)
16
+ end
4
17
  end
@@ -61,14 +61,16 @@ module EltHelper
61
61
  '\1\3\3* <a class="readMore" href="#" onclick="Element.hide(this.parentNode.parentNode); Element.removeClassName(this.parentNode.parentNode.nextSibling.nextSibling, \'tooLarge\'); return false;">Read more... / Lire plus...</a>\3\3<div class="tooLarge">\3\3\2</div>') \
62
62
  if data and text.strip =~ /(?:(?:^\*\s+.+$\n){#{NB_PARAGRAPH_TO_DISPLAY*2+2}})/
63
63
 
64
- #hard_breaks = true
65
64
  textiled = text.blank? ? "" : RedCloth.new(text)
66
- begin
67
- textiled = textiled.to_html if !textiled.blank?
68
- rescue
69
- # TODO discover why RedCloth fails on this!!!
70
- textiled = textiled.gsub(/[->\[]/, ' ')
71
- textiled = textiled.to_html
65
+ if !textiled.blank?
66
+ begin
67
+ textiled.hard_breaks = false
68
+ textiled = textiled.to_html
69
+ rescue
70
+ # TODO discover why RedCloth fails on this!!!
71
+ textiled = textiled.gsub(/[->\[]/, ' ')
72
+ textiled = textiled.to_html
73
+ end
72
74
  end
73
75
  if ! textiled.match(/[.\s]<p>/) and textiled.size < 200 then
74
76
  # Remove any leading and finishing <p> </p> as they are not required
@@ -17,6 +17,7 @@
17
17
  #
18
18
  class Elt < ActiveRecord::Base
19
19
  belongs_to :person
20
+
20
21
  has_one :mail, :dependent => :destroy
21
22
 
22
23
  has_many :choices, :dependent => :destroy, :order => "choices.created_on"
@@ -44,9 +45,9 @@ class Elt < ActiveRecord::Base
44
45
 
45
46
  def all_subscriptions
46
47
  if parent
47
- (subscriptions + parent.all_subscriptions).uniq
48
+ (subscriptions + parent.all_subscriptions).uniq
48
49
  else
49
- subscriptions
50
+ subscriptions
50
51
  end
51
52
  end
52
53
 
@@ -78,39 +79,39 @@ class Elt < ActiveRecord::Base
78
79
 
79
80
  parent.vote Regexp.last_match(1), person if body =~ /^\s*(-1|0|\+1)(\s|$)/
80
81
  if Regexp.last_match(1) and self.body.gsub(/(-1|0|\+1)/, '').strip.empty?
81
- # Hide simple votes
82
+ # Hide simple votes
82
83
  vote -1
83
84
  else
84
85
  vote if person
85
86
  end
86
87
 
87
- parent.add_child(self) unless lft or rgt
88
+ parent.add_child(self) unless lft or rgt
88
89
  true
89
90
  end
90
91
 
91
- def before_create
92
- # Let's generate a nice looking id
93
- self.id ||= new_id =
94
- subject.gsub(/\[[\w-]*\]/, '').strip \
95
- .gsub(/\s/, '_').gsub(/[^\w]+/, '') \
96
- .gsub(/_+/, '_').gsub(/(^_|_$)/, '') if subject
97
- self.id ||= "elt"
92
+ def before_create
93
+ # Let's generate a nice looking id
94
+ self.id ||= new_id =
95
+ subject.gsub(/\[[\w-]*\]/, '').strip \
96
+ .gsub(/\s/, '_').gsub(/[^\w]+/, '') \
97
+ .gsub(/_+/, '_').gsub(/(^_|_$)/, '') if subject
98
+ self.id ||= "elt"
98
99
 
99
- i = 0
100
- self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
101
- end
100
+ i = 0
101
+ self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
102
+ end
102
103
 
103
104
  def add_child(c)
104
- result = super(c)
105
- p = c
106
- while p
107
- if !p.last_activity or p.last_activity < c.created_on then
108
- p.last_activity = c.created_on
109
- p.save!
110
- end
111
- p = p.parent
112
- end
113
- result
105
+ result = super(c)
106
+ p = c
107
+ while p
108
+ if !p.last_activity or p.last_activity < c.created_on then
109
+ p.last_activity = c.created_on
110
+ p.save!
111
+ end
112
+ p = p.parent
113
+ end
114
+ result
114
115
  end
115
116
 
116
117
  #
@@ -30,17 +30,17 @@ class Mail < ActiveRecord::Base
30
30
  end
31
31
  end
32
32
 
33
- def before_create
34
- # Let's generate a nice looking id
35
- self.id ||= new_id =
36
- message.gsub(/\[[\w-]*\]/, '').strip \
37
- .gsub(/\s/, '_').gsub(/[^\w]+/, '') \
38
- .gsub(/_+/, '_').gsub(/(^_|_$)/, '') if message
39
- self.id ||= "mail"
40
-
41
- i = 0
42
- self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
43
- end
33
+ def before_create
34
+ # Let's generate a nice looking id
35
+ self.id ||= new_id =
36
+ message.gsub(/\[[\w-]*\]/, '').strip \
37
+ .gsub(/\s/, '_').gsub(/[^\w]+/, '') \
38
+ .gsub(/_+/, '_').gsub(/(^_|_$)/, '') if message
39
+ self.id ||= "mail"
40
+
41
+ i = 0
42
+ self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
43
+ end
44
44
 
45
45
  """ _
46
46
  _ __ ___ ___ ___(_)_ _____
@@ -60,7 +60,13 @@ class Mail < ActiveRecord::Base
60
60
  logger.info "Receive mail #{mail.message_id}"
61
61
  self.mail_parents = mail.references
62
62
  self.message = mail.message_id
63
- self.file = mail.encoded
63
+ if mail.encoded.isutf8
64
+ self.file = mail.encoded
65
+ else
66
+ charset = mail.type_param 'charset'
67
+ charset ||= 'iso-8859-1'
68
+ self.file = Iconv.iconv('utf-8', charset, mail.encoded).to_s
69
+ end
64
70
 
65
71
  build_elt :created_on => mail.date,
66
72
  :subject => unquote(mail.subject),
@@ -106,19 +112,18 @@ class Mail < ActiveRecord::Base
106
112
  logger.info "Creating a parent elt with id #{parentId}"
107
113
  #puts "Creating a parent elt with id #{parentId}"
108
114
  elt.build_parent :parent_id => 'mail', :subject => parentId, :body => ''
109
- elt.parent.id = parentId
110
115
  elt.parent.publish
111
- elt.save
112
116
  end
113
117
 
118
+ elt.save!
114
119
  mngAttachment mail if mail
115
120
 
116
121
  elt.person = Person.find_by_email(mail.from) \
117
122
  || Person.find_by_name(unquote(mail.friendly_from)) \
118
123
  || elt.build_person(:id => unquote(mail.friendly_from).gsub(/\s/, '_'),
119
124
  :name => unquote(mail.friendly_from),
120
- :email => mail.from.first) \
121
- if not mail.from.first.match(/#{ANONYMOUS_POSTER}@#{ActionMailer::Base.smtp_settings[:domain]}/)
125
+ :email => mail.from.first
126
+ ) unless mail.from.first.match(/#{ANONYMOUS_POSTER}@#{ActionMailer::Base.smtp_settings[:domain]}/)
122
127
 
123
128
  elt.publish
124
129
 
@@ -139,8 +144,8 @@ class Mail < ActiveRecord::Base
139
144
  # An elt needs to be published as a mail
140
145
  #
141
146
  def publish
142
- logger.info "Publish mail for elt #{elt.subject} [#{elt.id}]"
143
- #puts "Publish mail for elt #{elt.subject} [#{elt.id}]"
147
+ logger.info "Publish mail for elt '#{elt.subject}' [#{elt.id}]"
148
+ #puts "Publish mail for elt '#{elt.subject}' [#{elt.id}]"
144
149
 
145
150
  if message and not message.blank? and file
146
151
  mail = TMail::Mail.parse file
@@ -153,25 +158,18 @@ class Mail < ActiveRecord::Base
153
158
  self.file = mail.encoded
154
159
  end
155
160
 
156
- mail['Precedence'] = 'list'
157
- mail['X-Loop'] = ActionMailer::Base.smtp_settings[:domain]
158
- mail['List-Archive'] = "http://"+ActionMailer::Base.smtp_settings[:domain]
159
- mail['Errors-To'] = "errors@"+ActionMailer::Base.smtp_settings[:domain]
160
-
161
- subscriptions = elt.all_subscriptions \
161
+ # Record all people to whom it was sent
162
+ mail.bcc = elt.all_subscriptions \
162
163
  .select { |s| s.person.email and not s.person.email.blank? } \
163
164
  .select { |s| #puts "Person: #{s.person.name}, elt: #{s.elt.id}, filter: #{s.filter}";
164
165
  not s.filter or (elt.result and elt.result >= s.filter) } \
165
166
  .reject { |s| recipients.include? s.person } \
167
+ .uniq \
168
+ .each { |r| person_mails.build :person => r.person } \
169
+ .collect { |i| i.person.email } \
166
170
  .uniq
167
171
 
168
- # Record all people to whom it was sent
169
- subscriptions.each { |r| person_mails.create :person => r.person }
170
- # mostly because otherwise the tests don't see it
171
- person_mails.reload
172
- recipients.reload
173
-
174
- mail.bcc = subscriptions.collect { |i| i.person.email }.uniq.join(', ')
172
+ logger.info "Recipients: #{recipients}"
175
173
  #puts "mail.bcc: #{mail.bcc}"
176
174
 
177
175
  #
@@ -192,6 +190,11 @@ class Mail < ActiveRecord::Base
192
190
 
193
191
  # Added to make sure it is not lost, but not modified if already existant
194
192
  mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
193
+ mail['Precedence'] = 'list'
194
+ mail['X-Loop'] = ActionMailer::Base.smtp_settings[:domain]
195
+ mail['Errors-To'] = "errors@"+ActionMailer::Base.smtp_settings[:domain]
196
+ mail['List-Archive'] = "http://"+ActionMailer::Base.smtp_settings[:domain]
197
+ mail['Parlement-elt-id'] = elt.id
195
198
 
196
199
  if mail.message_id
197
200
  # Let's not change the message id
@@ -223,30 +226,24 @@ class Mail < ActiveRecord::Base
223
226
  elsif attachment.disposition_param 'filename'
224
227
  File.open("/tmp/#{attachment.disposition_param('filename')}", 'w') { |file|
225
228
  file << attachment.body
226
- elt.attachments.build :file => file, :content_type => attachment.content_type
229
+ att = elt.attachments.build :file => file, :content_type => attachment.content_type
230
+ att.save!
227
231
  }
228
232
  elsif attachment.type_param 'name'
229
233
  File.open("/tmp/#{attachment.type_param('name')}", 'w') { |file|
230
234
  file << attachment.body
231
- elt.attachments.build :file => file, :content_type => attachment.content_type
235
+ att = elt.attachments.build :file => file, :content_type => attachment.content_type
236
+ att.save!
232
237
  }
233
238
  elsif (attachment.content_type and attachment.content_type.match(/text\/plain/)) \
234
239
  or (!attachment.content_type and attachment.parts.size == 0)
235
- charset = attachment.type_param 'charset'
236
- if charset and !charset.empty?
237
- if attachment.transfer_encoding == 'quoted-printable'
238
- # Here to correct a null character which can occur in some mails
239
- # It looks like ==0 or ^@ !!!
240
- # Otherwise the elt can not be saved in the db :(
241
- elt.body += Iconv.new(charset, 'iso-8859-1').iconv(attachment.body).gsub(/\0/, '')
242
- elsif !charset =~ 'uft-8'
243
- elt.body += Iconv.new(charset, 'iso-8859-1').iconv(attachment.body)
244
- else
245
- elt.body += attachment.body
246
- end
240
+ # Here too have to remove any eventual null character!
241
+ if attachment.body.isutf8
242
+ elt.body += attachment.body
247
243
  else
248
- # Here too have to remove any eventual null character!
249
- elt.body += attachment.body.gsub(/\0/, '')
244
+ charset = attachment.type_param 'charset'
245
+ charset = 'iso-8859-1' unless charset and charset != 'utf-8'
246
+ elt.body += Iconv.iconv('utf-8', charset, attachment.body).to_s
250
247
  end
251
248
  end
252
249
  end