parlement 0.10 → 0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +11 -0
- data/MEMORY +9 -1
- data/README +5 -4
- data/app/controllers/account_controller.rb +10 -13
- data/app/controllers/application.rb +4 -5
- data/app/controllers/elt_controller.rb +9 -7
- data/app/controllers/person_controller.rb +1 -3
- data/app/controllers/subscriber_controller.rb +10 -10
- data/app/helpers/elt_helper.rb +2 -0
- data/app/models/elt.rb +28 -19
- data/app/models/mail.rb +26 -14
- data/app/models/mail_notify.rb +5 -4
- data/app/models/person.rb +11 -2
- data/app/views/account/_login.rhtml +3 -3
- data/app/views/account/_show.rhtml +12 -14
- data/app/views/elt/_choice.rhtml +3 -3
- data/app/views/elt/_elt.rhtml +4 -4
- data/app/views/elt/_list.rhtml +2 -2
- data/app/views/elt/_listByDate.rhtml +1 -1
- data/app/views/elt/_listByVote.rhtml +1 -1
- data/app/views/elt/new.rhtml +3 -3
- data/app/views/elt/show.rhtml +2 -2
- data/app/views/layouts/top.rhtml +6 -0
- data/app/views/mail_notify/publish.text.html.rhtml +1 -1
- data/app/views/person/_listElts.rhtml +5 -3
- data/app/views/person/show.rhtml +1 -2
- data/config/boot.rb +5 -4
- data/config/environment.rb +6 -4
- data/config/routes.rb +3 -2
- data/db/development_structure.sql +15 -4
- data/db/migrate/006_last_activity.rb +10 -0
- data/db/schema.rb +67 -49
- data/public/dispatch.fcgi +1 -0
- data/public/javascripts/controls.js +41 -23
- data/public/javascripts/dragdrop.js +317 -99
- data/public/javascripts/effects.js +301 -166
- data/public/javascripts/prototype.js +932 -402
- data/public/stylesheets/default.css +3 -2
- data/test/unit/elt_test.rb +13 -0
- data/test/unit/mail_test.rb +3 -1
- data/vendor/plugins/engines/CHANGELOG +203 -99
- data/vendor/plugins/engines/MIT-LICENSE +1 -1
- data/vendor/plugins/engines/README +32 -384
- data/vendor/plugins/engines/Rakefile +14 -0
- data/vendor/plugins/engines/UPGRADING +93 -0
- data/vendor/plugins/engines/about.yml +7 -0
- data/vendor/plugins/engines/generators/plugin_migration/USAGE +45 -0
- data/vendor/plugins/engines/generators/plugin_migration/plugin_migration_generator.rb +79 -0
- data/vendor/plugins/engines/generators/plugin_migration/templates/plugin_migration.erb +13 -0
- data/vendor/plugins/engines/init.rb +34 -47
- data/vendor/plugins/engines/install.rb +32 -0
- data/vendor/plugins/engines/lib/engines/{ruby_extensions.rb → deprecated_config_support.rb} +135 -113
- data/vendor/plugins/engines/lib/engines/plugin.rb +214 -0
- data/vendor/plugins/engines/lib/engines/plugin_list.rb +31 -0
- data/vendor/plugins/engines/lib/engines/plugin_migrator.rb +60 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/active_record.rb +19 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/dependencies.rb +143 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/migrations.rb +155 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/public_asset_helpers.rb +116 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/rails.rb +20 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/rails_initializer.rb +86 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb +77 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions/templates.rb +140 -0
- data/vendor/plugins/engines/lib/engines/rails_extensions.rb +6 -0
- data/vendor/plugins/engines/lib/engines/testing.rb +88 -0
- data/vendor/plugins/engines/lib/engines.rb +281 -425
- data/vendor/plugins/engines/tasks/engines.rake +108 -137
- metadata +218 -250
- data/db/ROOT/perso.txt +0 -214
- data/public/images/indicator.gif +0 -0
- data/public/images/orange_by_darren_Hester_350o.jpg +0 -0
- data/public/images/smile.png +0 -0
- data/vendor/plugins/engines/generators/engine/USAGE +0 -26
- data/vendor/plugins/engines/generators/engine/engine_generator.rb +0 -199
- data/vendor/plugins/engines/generators/engine/templates/README +0 -85
- data/vendor/plugins/engines/generators/engine/templates/init_engine.erb +0 -15
- data/vendor/plugins/engines/generators/engine/templates/install.erb +0 -4
- data/vendor/plugins/engines/generators/engine/templates/lib/engine.erb +0 -6
- data/vendor/plugins/engines/generators/engine/templates/licenses/GPL +0 -18
- data/vendor/plugins/engines/generators/engine/templates/licenses/LGPL +0 -19
- data/vendor/plugins/engines/generators/engine/templates/licenses/MIT +0 -22
- data/vendor/plugins/engines/generators/engine/templates/licenses/None +0 -1
- data/vendor/plugins/engines/generators/engine/templates/public/javascripts/engine.js +0 -0
- data/vendor/plugins/engines/generators/engine/templates/public/stylesheets/engine.css +0 -0
- data/vendor/plugins/engines/generators/engine/templates/tasks/engine.rake +0 -0
- data/vendor/plugins/engines/generators/engine/templates/test/test_helper.erb +0 -17
- data/vendor/plugins/engines/lib/bundles/require_resource.rb +0 -124
- data/vendor/plugins/engines/lib/bundles.rb +0 -77
- data/vendor/plugins/engines/lib/engines/action_mailer_extensions.rb +0 -140
- data/vendor/plugins/engines/lib/engines/action_view_extensions.rb +0 -141
- data/vendor/plugins/engines/lib/engines/active_record_extensions.rb +0 -21
- data/vendor/plugins/engines/lib/engines/dependencies_extensions.rb +0 -129
- data/vendor/plugins/engines/lib/engines/migration_extensions.rb +0 -53
- data/vendor/plugins/engines/lib/engines/routing_extensions.rb +0 -28
- data/vendor/plugins/engines/lib/engines/testing_extensions.rb +0 -327
- data/vendor/plugins/engines/tasks/deprecated_engines.rake +0 -7
- data/vendor/plugins/engines/test/action_view_extensions_test.rb +0 -9
- data/vendor/plugins/engines/test/ruby_extensions_test.rb +0 -115
- data/vendor/plugins/guid/README.TXT +0 -29
- data/vendor/plugins/guid/init.rb +0 -30
- data/vendor/plugins/guid/lib/usesguid.rb +0 -37
- data/vendor/plugins/guid/lib/uuid22.rb +0 -43
- data/vendor/plugins/guid/lib/uuidtools.rb +0 -572
- data/vendor/plugins/responds_to_parent/MIT-LICENSE +0 -20
- data/vendor/plugins/responds_to_parent/README +0 -42
- data/vendor/plugins/responds_to_parent/Rakefile +0 -22
- data/vendor/plugins/responds_to_parent/init.rb +0 -1
- data/vendor/plugins/responds_to_parent/lib/responds_to_parent.rb +0 -46
- data/vendor/plugins/responds_to_parent/test/responds_to_parent_test.rb +0 -115
data/CHANGES
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
- parlement changelog
|
2
2
|
|
3
|
+
== Version 0.11
|
4
|
+
|
5
|
+
Most active forums presented first
|
6
|
+
|
7
|
+
* Corrected a small javascript error displaying subscriptionLink
|
8
|
+
* last_activity field added to elts
|
9
|
+
* passage to rails 1.2
|
10
|
+
* removal of the guid plugin, now id are generated from internal data
|
11
|
+
* better anti spam check. Won't block on any url
|
12
|
+
* corrected person's page
|
13
|
+
|
3
14
|
== Version 0.10
|
4
15
|
|
5
16
|
Democratically moderated mails.
|
data/MEMORY
CHANGED
@@ -47,5 +47,13 @@ select count(*) from mails;
|
|
47
47
|
select * from people;
|
48
48
|
select * from subscriptions;
|
49
49
|
select * from person_mails;
|
50
|
-
|
50
|
+
select distinct last_activity from elts;
|
51
|
+
UPDATE elts SET last_activity = (SELECT MAX(created_on) FROM elts c WHERE elts.lft <= c.lft AND c.rgt <= elts.rgt);
|
52
|
+
|
53
|
+
|
54
|
+
Processing EltController#create (for 192.168.0.254 at 2007-02-11 00:07:05) [POST]
|
55
|
+
Session ID: 23a1ab5f9b11763838d64c50157610f3
|
56
|
+
Parameters: {"commit"=>"Propose!", "elt"=>{"body"=>"arg", "subject"=>"Re: Testez", "parent_id"=>"Testez"}, "submit"=>"preview", "action"=>"create", "id"=>"Testez", "controller"=>"elt"}
|
57
|
+
Response body was encoded with gzip
|
58
|
+
Completed in 0.05879 (17 reqs/sec) | Rendering: 0.05682 (96%) | DB: 0.00072 (1%) | 200 OK [http://leparlement.org/elt/create/Testez?submit=preview]
|
51
59
|
|
data/README
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
| .__/ \__,_|_| |_|\___|_| |_| |_|\___|_| |_|\__|
|
6
6
|
|_|
|
7
7
|
|
8
|
-
On debian, here are the commands used to setup
|
8
|
+
On debian, here are the commands used to setup a parlement server:
|
9
9
|
# apt-get install postgresql
|
10
10
|
# sudo su - postgres
|
11
11
|
~ createuser /your_login/
|
@@ -16,7 +16,7 @@ On debian, here are the commands used to setup the parlement machine:
|
|
16
16
|
# apt-get install rdoc
|
17
17
|
|
18
18
|
Basically this install postgresql, ruby and the ruby driver to psql. Ruby on
|
19
|
-
Rails is database agnostic, parlement will be sometimes in the
|
19
|
+
Rails is database agnostic, parlement will be sometimes in the future.
|
20
20
|
|
21
21
|
You need to install "ruby gems":http://docs.rubygems.org
|
22
22
|
|
@@ -45,8 +45,9 @@ filtering tool), define this kind of rule:
|
|
45
45
|
Once you have everything set up (ruby, postgresql, redcloth, irb), you can
|
46
46
|
initialise and launch parlement this way:
|
47
47
|
|
48
|
-
|
49
|
-
~
|
48
|
+
# Get the source code
|
49
|
+
~ svn checkout svn://rubyforge.org/var/svn/parlement/trunk parlement
|
50
|
+
~ cd parlement # Go into the right folder
|
50
51
|
~ createdb parlement_development # Create database
|
51
52
|
~ psql -q template1 -f db/schema.sql # Initiate the db schema
|
52
53
|
~ rake migrate # Get the db to its last version
|
@@ -2,18 +2,15 @@
|
|
2
2
|
# This class manages users inscription, login and logout
|
3
3
|
#
|
4
4
|
class AccountController < UserController
|
5
|
-
model :person
|
6
|
-
model :user
|
7
|
-
|
8
5
|
def login
|
9
6
|
# Cleaning up
|
10
7
|
session[:person] = @person = session[:user] = @user = nil
|
11
8
|
cookies.delete :person_name
|
12
9
|
cookies.delete :salted_password
|
13
10
|
|
14
|
-
login =
|
15
|
-
email =
|
16
|
-
password =
|
11
|
+
login = params[:person][:name]
|
12
|
+
email = params[:person][:email]
|
13
|
+
password = params[:user][:password]
|
17
14
|
|
18
15
|
@person = Person.find_by_name(login)
|
19
16
|
@user = @person.user if @person
|
@@ -22,7 +19,7 @@ class AccountController < UserController
|
|
22
19
|
if not @person
|
23
20
|
# Create the pseudo
|
24
21
|
begin
|
25
|
-
Person.transaction
|
22
|
+
Person.transaction do
|
26
23
|
@person = Person.new :id => login.gsub(/\s/, '_'), :name => login
|
27
24
|
if @person.save
|
28
25
|
logger.info yellow { bold { "Person: #{@person.name}, id: #{@person.id}" } }
|
@@ -59,7 +56,7 @@ class AccountController < UserController
|
|
59
56
|
elsif email and not email.empty?
|
60
57
|
# There is a check key, used to change the password
|
61
58
|
begin
|
62
|
-
User.transaction
|
59
|
+
User.transaction do
|
63
60
|
if User.authenticate_by_token(@user.id, email)
|
64
61
|
@user.change_password(password)
|
65
62
|
@user.security_token = nil
|
@@ -127,7 +124,7 @@ class AccountController < UserController
|
|
127
124
|
end
|
128
125
|
|
129
126
|
def check_key
|
130
|
-
if @user = User.authenticate_by_token(
|
127
|
+
if @user = User.authenticate_by_token(params[:user][:id], params[:key])
|
131
128
|
#@user = User.find(:first, :conditions => "security_token = '#{params[:key]}'")
|
132
129
|
@person = Person.find_by_name(@user.login) if @user
|
133
130
|
@person.email = @user.email
|
@@ -200,10 +197,10 @@ class AccountController < UserController
|
|
200
197
|
protected
|
201
198
|
|
202
199
|
def mngPassword
|
203
|
-
if @person and password =
|
200
|
+
if @person and password = params[:user][:password] and !password.empty?
|
204
201
|
@user = @person.user || User.new()
|
205
202
|
begin
|
206
|
-
User.transaction
|
203
|
+
User.transaction do
|
207
204
|
@user.login = @person.name
|
208
205
|
# To make sure even a non email protected user can use a password
|
209
206
|
@user.email ||= @person.name+'@nomailyet'
|
@@ -232,9 +229,9 @@ class AccountController < UserController
|
|
232
229
|
@user.login = @person.name
|
233
230
|
end
|
234
231
|
|
235
|
-
@user.email =
|
232
|
+
@user.email = params[:person][:email]
|
236
233
|
begin
|
237
|
-
User.transaction
|
234
|
+
User.transaction do
|
238
235
|
unless LoginEngine.config(:use_email_notification)
|
239
236
|
@user.verified = 1
|
240
237
|
end
|
@@ -7,7 +7,6 @@ require 'term/ansicolor'
|
|
7
7
|
class ApplicationController < ActionController::Base
|
8
8
|
include LoginEngine
|
9
9
|
include Term::ANSIColor
|
10
|
-
model :user
|
11
10
|
|
12
11
|
before_filter :set_charset
|
13
12
|
before_filter :set_login_from_cookie
|
@@ -17,15 +16,15 @@ class ApplicationController < ActionController::Base
|
|
17
16
|
# automatically and transparently fixes utf-8 bug
|
18
17
|
# with Safari when using xmlhttp
|
19
18
|
def fix_unicode_for_safari
|
20
|
-
if
|
21
|
-
|
22
|
-
|
19
|
+
if headers["Content-Type"] == "text/html; charset=utf-8" and
|
20
|
+
request.env['HTTP_USER_AGENT'].to_s.include? 'AppleWebKit' then
|
21
|
+
response.body = response.body.gsub(/([^\x00-\xa0])/u) { |s| "&#x%x;" % $1.unpack('U')[0] }
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
25
|
def set_charset
|
27
26
|
#@headers["Content-Type"] = "text/html; charset=iso-8859-15"
|
28
|
-
|
27
|
+
headers["Content-Type"] = "text/html; charset=utf-8"
|
29
28
|
end
|
30
29
|
|
31
30
|
def set_login_from_cookie
|
@@ -4,7 +4,6 @@
|
|
4
4
|
# An element is just the name for a poll/message/issue
|
5
5
|
#
|
6
6
|
class EltController < ApplicationController
|
7
|
-
|
8
7
|
def index
|
9
8
|
params[:id] = params[:id].gsub(/.html/, '')
|
10
9
|
show
|
@@ -40,13 +39,13 @@ class EltController < ApplicationController
|
|
40
39
|
|
41
40
|
def rss
|
42
41
|
params[:id] = params[:id].gsub(/.rss/, '')
|
43
|
-
|
42
|
+
headers["Content-Type"] = "text/xml; charset=utf-8"
|
44
43
|
@elt = Elt.find(params[:id]) if @elt == nil
|
45
44
|
end
|
46
45
|
|
47
46
|
def vote_rss
|
48
47
|
params[:id] = params[:id].gsub(/.rss/, '')
|
49
|
-
|
48
|
+
headers["Content-Type"] = "text/xml; charset=utf-8"
|
50
49
|
@elt = Elt.find(params[:id]) if @elt == nil
|
51
50
|
end
|
52
51
|
|
@@ -64,12 +63,13 @@ class EltController < ApplicationController
|
|
64
63
|
|
65
64
|
def create
|
66
65
|
@elt = Elt.new(params[:elt])
|
67
|
-
@elt.person =
|
66
|
+
@elt.person = session[:person]
|
68
67
|
|
69
|
-
if
|
70
|
-
|
68
|
+
if !session[:person] and \
|
69
|
+
(@elt.subject =~ /([<>\/]|href)/ \
|
70
|
+
or @elt.body =~ /(.*(http|href).*){3}/ \
|
71
71
|
or @elt.body =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i \
|
72
|
-
or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i
|
72
|
+
or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i) then
|
73
73
|
logger.error red { underline { "SPAM! '#{@elt.subject}'" } }
|
74
74
|
logger.error "SPAM! '#{@elt.body}'"
|
75
75
|
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!'
|
@@ -79,6 +79,8 @@ class EltController < ApplicationController
|
|
79
79
|
#headers["Status"] = "201 Created"
|
80
80
|
render :partial => '/elt/elt', :locals => { :elt => @elt, :eltTop => false }
|
81
81
|
else
|
82
|
+
logger.error "Strange error, can't preview or save an element"
|
83
|
+
puts "Strange error, can't preview or save an element"
|
82
84
|
flash[:notice] = 'Error'
|
83
85
|
render :controller => 'elt', :action => 'new'
|
84
86
|
end
|
@@ -3,8 +3,6 @@ class PersonController < ApplicationController
|
|
3
3
|
helper :elt
|
4
4
|
|
5
5
|
layout 'top'
|
6
|
-
model :person
|
7
|
-
|
8
6
|
def show
|
9
7
|
@person = Person.find(params[:id])
|
10
8
|
@title = @person.name+' (parlement)'
|
@@ -15,7 +13,7 @@ class PersonController < ApplicationController
|
|
15
13
|
end
|
16
14
|
|
17
15
|
def list
|
18
|
-
@person = Person.find(params[:id])
|
16
|
+
@person = Person.find(params[:id])
|
19
17
|
render :partial => '/person/listElts', :locals => { :person => @person }
|
20
18
|
end
|
21
19
|
end
|
@@ -7,15 +7,15 @@ class SubscriberController < ApplicationController
|
|
7
7
|
def subscribe
|
8
8
|
@elt = Elt.find params[:id]
|
9
9
|
|
10
|
-
if
|
11
|
-
if @elt.subscribers.include?(
|
12
|
-
Subscription.find_by_person_id_and_elt_id(
|
13
|
-
logger.info yellow { "User #{
|
14
|
-
elsif @elt.all_recipients.include?(
|
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])
|
15
15
|
elt2 = @elt
|
16
|
-
elt2 = elt2.parent until elt2.subscribers.include?(
|
17
|
-
Subscription.find_by_person_id_and_elt_id(
|
18
|
-
logger.info yellow { "User #{
|
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}..." }
|
19
19
|
else
|
20
20
|
if cookies[:filter]
|
21
21
|
filter = cookies[:filter].to_i - 1
|
@@ -23,8 +23,8 @@ class SubscriberController < ApplicationController
|
|
23
23
|
else
|
24
24
|
filter = 0
|
25
25
|
end
|
26
|
-
@elt.subscriptions.create :person =>
|
27
|
-
logger.info yellow { "User #{
|
26
|
+
@elt.subscriptions.create :person => session[:person], :filter => filter
|
27
|
+
logger.info yellow { "User #{session[:person].name} subscribed to #{@elt.id} with filter #{filter}..." }
|
28
28
|
end
|
29
29
|
else
|
30
30
|
puts "Not logged in!"
|
data/app/helpers/elt_helper.rb
CHANGED
@@ -9,6 +9,7 @@ module EltHelper
|
|
9
9
|
# /italic/
|
10
10
|
# - listElement
|
11
11
|
# 1. numbered list
|
12
|
+
# *headed list* text
|
12
13
|
# chat log lines become list elements
|
13
14
|
# short lines to which are added a break
|
14
15
|
# positions have a special treatment in the view
|
@@ -20,6 +21,7 @@ module EltHelper
|
|
20
21
|
.gsub(/^-\s/, '* ') \
|
21
22
|
.gsub(/^\d+[\.-]\s+/, '# ') \
|
22
23
|
.gsub(/^(\d\d:\d\d\s)/, '* \\1') \
|
24
|
+
.gsub(/^\s\*(.*)\*/, '*\\1*') \
|
23
25
|
.gsub(/^\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
|
24
26
|
.gsub(/\n*^\b(position:\s*(\d*(\.\d+)?))\s*$\n*/, ' <span class="position">\1</span>') \
|
25
27
|
if data != nil
|
data/app/models/elt.rb
CHANGED
@@ -25,8 +25,8 @@ class Elt < ActiveRecord::Base
|
|
25
25
|
has_many :subscriptions, :dependent => :destroy
|
26
26
|
has_many :subscribers, :through => :subscriptions, :source => :person
|
27
27
|
|
28
|
-
acts_as_nested_set :order => "position is not null, position, created_on"
|
29
|
-
acts_as_tree :order => "position is not null, position, created_on", :counter_cache => true
|
28
|
+
acts_as_nested_set :order => "position is not null, position, last_activity DESC, created_on DESC"
|
29
|
+
acts_as_tree :order => "position is not null, position, last_activity DESC, created_on DESC", :counter_cache => true
|
30
30
|
|
31
31
|
# Just a quick method to get all subscribers as a simple list
|
32
32
|
def all_recipients
|
@@ -39,9 +39,9 @@ class Elt < ActiveRecord::Base
|
|
39
39
|
|
40
40
|
def all_subscriptions
|
41
41
|
if parent
|
42
|
-
|
42
|
+
(subscriptions + parent.all_subscriptions).uniq
|
43
43
|
else
|
44
|
-
|
44
|
+
subscriptions
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -73,7 +73,7 @@ class Elt < ActiveRecord::Base
|
|
73
73
|
|
74
74
|
parent.vote Regexp.last_match(1), person if body =~ /^\s*(-1|0|\+1)(\s|$)/
|
75
75
|
if Regexp.last_match(1) and self.body.gsub(/(-1|0|\+1)/, '').strip.empty?
|
76
|
-
|
76
|
+
# Hide simple votes
|
77
77
|
vote -1
|
78
78
|
else
|
79
79
|
vote if person
|
@@ -81,20 +81,29 @@ class Elt < ActiveRecord::Base
|
|
81
81
|
true
|
82
82
|
end
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
84
|
+
def before_create
|
85
|
+
# Let's generate a nice looking id
|
86
|
+
self.id ||= new_id =
|
87
|
+
subject.gsub(/\[[\w-]*\]/, '').strip \
|
88
|
+
.gsub(/\s/, '_').gsub(/[^\w]+/, '') \
|
89
|
+
.gsub(/_+/, '_').gsub(/(^_|_$)/, '') if subject
|
90
|
+
self.id ||= "elt"
|
91
|
+
|
92
|
+
i = 0
|
93
|
+
self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_child(c)
|
97
|
+
result = super(c)
|
98
|
+
p = c
|
99
|
+
while p
|
100
|
+
if !p.last_activity or p.last_activity < c.created_on then
|
101
|
+
p.last_activity = c.created_on
|
102
|
+
p.save!
|
103
|
+
end
|
104
|
+
p = p.parent
|
105
|
+
end
|
106
|
+
result
|
98
107
|
end
|
99
108
|
|
100
109
|
#
|
data/app/models/mail.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# are also managed in an associated table
|
6
6
|
#
|
7
7
|
class Mail < ActiveRecord::Base
|
8
|
-
usesguid
|
8
|
+
#usesguid
|
9
9
|
|
10
10
|
belongs_to :elt
|
11
11
|
has_many :person_mails, :dependent => :destroy
|
@@ -30,6 +30,18 @@ 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
|
44
|
+
|
33
45
|
""" _
|
34
46
|
_ __ ___ ___ ___(_)_ _____
|
35
47
|
| '__/ _ \/ __/ _ \ \ \ / / _ \
|
@@ -41,12 +53,15 @@ class Mail < ActiveRecord::Base
|
|
41
53
|
# The algorithm to define its parent is simple:
|
42
54
|
# - header "references"
|
43
55
|
# - or any subject between []
|
44
|
-
# - the "to" part before @#{ActionMailer::Base.
|
56
|
+
# - the "to" part before @#{ActionMailer::Base.smtp_settings[:domain]}
|
45
57
|
# - in a "mail/lost+found" thread
|
46
58
|
#
|
47
59
|
def receive(mail)
|
48
60
|
logger.info "Receive mail #{mail.message_id}"
|
49
|
-
|
61
|
+
self.mail_parents = mail.references
|
62
|
+
self.message = mail.message_id
|
63
|
+
self.file = mail.encoded
|
64
|
+
|
50
65
|
build_elt :created_on => mail.date,
|
51
66
|
:subject => unquote(mail.subject),
|
52
67
|
:body => '',
|
@@ -76,9 +91,9 @@ class Mail < ActiveRecord::Base
|
|
76
91
|
|
77
92
|
# No reference matching an existing parent, let's try the "to" field
|
78
93
|
to = mail["Envelope-to"].to_s + ', ' + mail.to.to_s
|
79
|
-
if not elt.parent and to.match(/[\w-]*@#{ActionMailer::Base.
|
80
|
-
parentId = to.match(/[\w-]*@#{ActionMailer::Base.
|
81
|
-
.gsub(/@#{ActionMailer::Base.
|
94
|
+
if not elt.parent and to.match(/[\w-]*@#{ActionMailer::Base.smtp_settings[:domain]}/)
|
95
|
+
parentId = to.match(/[\w-]*@#{ActionMailer::Base.smtp_settings[:domain]}/)[0] \
|
96
|
+
.gsub(/@#{ActionMailer::Base.smtp_settings[:domain]}/, '')
|
82
97
|
elt.parent = Elt.find parentId
|
83
98
|
end
|
84
99
|
|
@@ -104,14 +119,11 @@ class Mail < ActiveRecord::Base
|
|
104
119
|
|| elt.build_person(:id => unquote(mail.friendly_from).gsub(/\s/, '_'),
|
105
120
|
:name => unquote(mail.friendly_from),
|
106
121
|
:email => mail.from.first) \
|
107
|
-
if not mail.from.first.match(/#{ANONYMOUS_POSTER}@#{ActionMailer::Base.
|
122
|
+
if not mail.from.first.match(/#{ANONYMOUS_POSTER}@#{ActionMailer::Base.smtp_settings[:domain]}/)
|
108
123
|
|
109
|
-
self.mail_parents = mail.references
|
110
|
-
self.message = mail.message_id
|
111
|
-
self.file = mail.encoded
|
112
124
|
elt.publish
|
113
125
|
|
114
|
-
if mail.to.to_s.match(/people@#{ActionMailer::Base.
|
126
|
+
if mail.to.to_s.match(/people@#{ActionMailer::Base.smtp_settings[:domain]}/)
|
115
127
|
elt.person.image = "/attachment/file/#{elt.attachments.first.file_relative_path}"
|
116
128
|
elt.person.save
|
117
129
|
end
|
@@ -145,9 +157,9 @@ class Mail < ActiveRecord::Base
|
|
145
157
|
end
|
146
158
|
|
147
159
|
mail['Precedence'] = 'list'
|
148
|
-
mail['X-Loop'] = ActionMailer::Base.
|
149
|
-
mail['List-Archive'] = "http://"+ActionMailer::Base.
|
150
|
-
mail['Errors-To'] = "errors@"+ActionMailer::Base.
|
160
|
+
mail['X-Loop'] = ActionMailer::Base.smtp_settings[:domain]
|
161
|
+
mail['List-Archive'] = "http://"+ActionMailer::Base.smtp_settings[:domain]
|
162
|
+
mail['Errors-To'] = "errors@"+ActionMailer::Base.smtp_settings[:domain]
|
151
163
|
|
152
164
|
subscriptions = elt.all_subscriptions \
|
153
165
|
.select { |s| s.person.email and not s.person.email.blank? } \
|
data/app/models/mail_notify.rb
CHANGED
@@ -12,12 +12,12 @@ class MailNotify < ActionMailer::Base
|
|
12
12
|
ml = mailing_list(elt.parent)
|
13
13
|
|
14
14
|
recipients ml.subject.to_s \
|
15
|
-
+ " <#{ml.id}@#{ActionMailer::Base.
|
15
|
+
+ " <#{ml.id}@#{ActionMailer::Base.smtp_settings[:domain]}>"
|
16
16
|
|
17
17
|
from ((elt.person and elt.person.name) ? elt.person.name : ANONYMOUS_POSTER) \
|
18
18
|
+ " <" \
|
19
19
|
+ ((elt.person and elt.person.email) \
|
20
|
-
? elt.person.email : "#{ANONYMOUS_POSTER}@#{ActionMailer::Base.
|
20
|
+
? elt.person.email : "#{ANONYMOUS_POSTER}@#{ActionMailer::Base.smtp_settings[:domain]}") \
|
21
21
|
+ ">"
|
22
22
|
|
23
23
|
# Try to render the element as html
|
@@ -49,7 +49,8 @@ class MailNotify < ActionMailer::Base
|
|
49
49
|
# This is the essential of a mailing list, you reply to the mailing list,
|
50
50
|
# where every body sends their mail.
|
51
51
|
# This very mail can be a mailing list all by itself...
|
52
|
-
@headers['Reply-to'] = "#{ml.id}@#{ActionMailer::Base.
|
52
|
+
@headers['Reply-to'] = "#{ml.id}@#{ActionMailer::Base.smtp_settings[:domain]}"
|
53
|
+
#puts "#{ml.id}@#{ActionMailer::Base.smtp_settings[:domain]}"
|
53
54
|
|
54
55
|
@headers['In-Reply-To'] = elt.parent.mail.message \
|
55
56
|
if elt.parent and elt.parent.mail and elt.parent.mail.message
|
@@ -64,7 +65,7 @@ class MailNotify < ActionMailer::Base
|
|
64
65
|
@headers['references'] << parentMsg.message if parentMsg.message
|
65
66
|
end
|
66
67
|
|
67
|
-
@headers['X-Mailer'] = "#{ActionMailer::Base.
|
68
|
+
@headers['X-Mailer'] = "#{ActionMailer::Base.smtp_settings[:domain]} v#{PARLEMENT_VERSION}"
|
68
69
|
|
69
70
|
logger.info "Mail created"
|
70
71
|
end
|
data/app/models/person.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
class Person < ActiveRecord::Base
|
2
|
-
usesguid
|
3
|
-
|
4
2
|
has_many :elts
|
5
3
|
|
6
4
|
has_many :choices, :dependent => :destroy
|
@@ -20,5 +18,16 @@ class Person < ActiveRecord::Base
|
|
20
18
|
def user
|
21
19
|
return User.find_by_login(name)
|
22
20
|
end
|
21
|
+
|
22
|
+
def before_create
|
23
|
+
# Let's generate a nice looking id
|
24
|
+
self.id ||= new_id =
|
25
|
+
name.gsub(/\[[\w-]*\]/, '').strip \
|
26
|
+
.gsub(/\s/, '_').gsub(/[^\w]+/, '') \
|
27
|
+
.gsub(/_+/, '_').gsub(/(^_|_$)/, '') if name
|
28
|
+
|
29
|
+
i = 0
|
30
|
+
self.id = "#{new_id}_#{i+=1}" while self.class.find_by_id self.id
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
<% form_remote_tag(
|
2
2
|
:update => 'identity',
|
3
3
|
:url => { :controller => 'account', :action => 'login', :elt => @elt },
|
4
4
|
:before => visual_effect(:BlindUp, 'identity')+";resetChoices();",
|
5
|
-
:loaded => visual_effect(:BlindDown, 'identity')) %>
|
5
|
+
:loaded => visual_effect(:BlindDown, 'identity')) do %>
|
6
6
|
|
7
7
|
<div class="login">Please, choose a pseudo</div>
|
8
8
|
|
@@ -58,5 +58,5 @@
|
|
58
58
|
A login must contain [3..40] characters, a password [5..40].
|
59
59
|
</p>
|
60
60
|
' } %>
|
61
|
-
|
61
|
+
<% end %>
|
62
62
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%
|
1
|
+
<% flash.each do |key, value| %>
|
2
2
|
<div class="<%= key %>"><%= value %></div>
|
3
3
|
<% end %>
|
4
4
|
|
@@ -15,6 +15,7 @@
|
|
15
15
|
};
|
16
16
|
updateChoices(choices_to_update);
|
17
17
|
</script>
|
18
|
+
<script language="JavaScript">Element.show($('subscriptionLink'));</script>
|
18
19
|
</span>
|
19
20
|
<% end %>
|
20
21
|
|
@@ -23,7 +24,7 @@
|
|
23
24
|
<%= link_to_remote('[X]',
|
24
25
|
{ :update => 'identity',
|
25
26
|
:url => { :controller => 'account', :action => 'logout', :elt => @elt },
|
26
|
-
:before => visual_effect(:BlindUp, 'identity')+";resetChoices();",
|
27
|
+
:before => visual_effect(:BlindUp, 'identity')+visual_effect(:BlindUp, 'subscriptionLink')+";resetChoices();",
|
27
28
|
:loaded => visual_effect(:BlindDown, 'identity') },
|
28
29
|
{ :href => url_for(:controller => 'account', :action => 'logout') }) %>
|
29
30
|
</span>
|
@@ -40,40 +41,37 @@
|
|
40
41
|
</div>
|
41
42
|
|
42
43
|
<fieldset id="edit"><legend>Edit</legend>
|
43
|
-
|
44
|
+
<% form_remote_tag(
|
44
45
|
:update => 'identity',
|
45
46
|
:url => { :controller => 'account', :action => 'setPassword' },
|
46
47
|
:before => visual_effect(:BlindUp, 'identity'),
|
47
|
-
:loaded => visual_effect(:BlindDown, 'identity')) %>
|
48
|
+
:loaded => visual_effect(:BlindDown, 'identity')) do %>
|
48
49
|
<label for="user_password">Password:</label>
|
49
50
|
<%= password_field "user", "password", :size => 12 %>
|
50
51
|
<%= submit_tag 'OK' %>
|
51
|
-
|
52
|
+
<% end %>
|
52
53
|
|
53
|
-
|
54
|
+
<% form_remote_tag(
|
54
55
|
:update => 'identity',
|
55
56
|
:url => { :controller => 'account', :action => 'setEmail' },
|
56
57
|
:before => visual_effect(:BlindUp, 'identity'),
|
57
|
-
:loaded => visual_effect(:BlindDown, 'identity')) %>
|
58
|
+
:loaded => visual_effect(:BlindDown, 'identity')) do %>
|
58
59
|
<label for="person_email">Email:</label>
|
59
60
|
<%= text_field "person", "email", :size => 16 %>
|
60
61
|
<%= submit_tag 'OK' %>
|
61
|
-
|
62
|
+
<% end %>
|
62
63
|
|
63
|
-
|
64
|
-
:multipart => true, :target => "avatar", :class => "setAvatar") %>
|
64
|
+
<% form_tag( { :controller => "account", :action => "setAvatar"},
|
65
|
+
:multipart => true, :target => "avatar", :class => "setAvatar") do %>
|
65
66
|
<label>Avatar:</label>
|
66
67
|
<%= file_field "person", "image", :onchange => "submit()", :size => 3 %>
|
67
68
|
<%= submit_tag 'OK' %>
|
68
|
-
|
69
|
+
<% end %>
|
69
70
|
</fieldset>
|
70
71
|
|
71
72
|
<iframe id="avatar" name="avatar" style="display: none"></iframe>
|
72
|
-
|
73
|
-
<script language="JavaScript">Element.show($('subscriptionLink'));</script>
|
74
73
|
<% else %>
|
75
74
|
|
76
75
|
<%= render :partial => '/account/login' %>
|
77
|
-
<script language="JavaScript">Element.hide($('subscriptionLink'));</script>
|
78
76
|
<% end %>
|
79
77
|
|
data/app/views/elt/_choice.rhtml
CHANGED
@@ -5,7 +5,7 @@ result = elt.result
|
|
5
5
|
|
6
6
|
<label class="con <%= choice and choice.value == -1 ? "selected" : "" %>"
|
7
7
|
title="-1" for="choice_<%= elt.id %>_con">
|
8
|
-
<%= image_tag 'vote_minus' %>
|
8
|
+
<%= image_tag 'vote_minus.png' %>
|
9
9
|
<%= radio_button_tag "choice[value]", "-1",
|
10
10
|
(choice and choice.value == -1),
|
11
11
|
:id => "choice_#{elt.id}_con",
|
@@ -22,7 +22,7 @@ result = elt.result
|
|
22
22
|
|
23
23
|
<label class="pro <%= choice and choice.value == 1 ? "selected" : "" %>"
|
24
24
|
title="+1" for="choice_<%= elt.id %>_pro">
|
25
|
-
<%= image_tag 'vote_plus' %>
|
25
|
+
<%= image_tag 'vote_plus.png' %>
|
26
26
|
<%= radio_button_tag "choice[value]", "+1",
|
27
27
|
(choice and choice.value == +1),
|
28
28
|
:id => "choice_#{elt.id}_pro",
|
@@ -32,7 +32,7 @@ result = elt.result
|
|
32
32
|
<%= submit_tag 'Vote!' %>
|
33
33
|
|
34
34
|
<span class="eltQuickAdd" id="eltQuickAdd_<%= elt.id %>" title="<%= elt.created_on %>">
|
35
|
-
<%= link_to_remote(image_tag('write'),
|
35
|
+
<%= link_to_remote(image_tag('write.png'),
|
36
36
|
{ :update => 'eltNew_'+elt.id.to_s,
|
37
37
|
:url => { :controller => 'elt', :action => 'new', :id => elt },
|
38
38
|
:loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
|
data/app/views/elt/_elt.rhtml
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
<script>setKnobs($('elt_<%= elt.id %>'));</script>
|
3
3
|
|
4
4
|
<!-- The form is here to make sure a text browser can see it all on one line -->
|
5
|
-
|
5
|
+
<% form_remote_tag(
|
6
6
|
:update => 'eltChoice_'+elt.id.to_s,
|
7
7
|
:url => { :action => 'vote', :id => elt },
|
8
8
|
:before => visual_effect(:DropOut, 'eltChoice_'+elt.id.to_s, { :queue => 'end' }),
|
9
|
-
:loaded => visual_effect(:Grow, 'eltChoice_'+elt.id.to_s, { :queue => 'end' }))
|
9
|
+
:loaded => visual_effect(:Grow, 'eltChoice_'+elt.id.to_s, { :queue => 'end' })) do
|
10
10
|
|
11
|
-
|
11
|
+
cache :action => 'show', :id => elt.id do %>
|
12
12
|
<% if displayTitle? elt and elt.created_on %>
|
13
13
|
<span class="created_on"><%= elt.created_on.strftime('%d/%m/%y %H:%M') %></span>
|
14
14
|
<% end %>
|
@@ -67,7 +67,7 @@
|
|
67
67
|
{ :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
|
68
68
|
</span>
|
69
69
|
<!-- The choice end form, here to make sure it looks nice in text browsers -->
|
70
|
-
|
70
|
+
<% end %>
|
71
71
|
|
72
72
|
<ul class="eltNew" id="eltNew_<%= elt.id %>"></ul>
|
73
73
|
|