parlement 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +14 -4
- data/README +25 -5
- data/Rakefile +21 -21
- data/app/controllers/account_controller.rb +5 -1
- data/app/controllers/elt_controller.rb +7 -10
- data/app/controllers/person_controller.rb +9 -0
- data/app/controllers/subscriber_controller.rb +21 -0
- data/app/helpers/elt_helper.rb +25 -13
- data/app/helpers/mailman.rb +9 -92
- data/app/helpers/subscriber_helper.rb +2 -0
- data/app/models/attachment.rb +2 -0
- data/app/models/elt.rb +64 -2
- data/app/models/mail.rb +198 -0
- data/app/models/mail_notify.rb +63 -0
- data/app/models/person.rb +8 -1
- data/app/views/account/_login.rhtml +31 -28
- data/app/views/account/_show.rhtml +4 -4
- data/app/views/elt/_elt.rhtml +23 -28
- data/app/views/elt/_list.rhtml +6 -2
- data/app/views/elt/new.rhtml +1 -1
- data/app/views/elt/show.rhtml +32 -10
- data/app/views/layouts/top.rhtml +16 -10
- data/app/views/mail_notify/publish.text.html.rhtml +46 -0
- data/app/views/mail_notify/publish.text.plain.rhtml +2 -0
- data/app/views/person/_listElts.rhtml +33 -0
- data/app/views/person/show.rhtml +21 -19
- data/config/boot.rb +2 -0
- data/config/environment.rb +19 -13
- data/config/environments/development.rb +3 -1
- data/config/environments/production.rb +2 -0
- data/config/environments/test.rb +2 -0
- data/config/routes.rb +5 -2
- data/db/ROOT/mail.txt +2 -0
- data/db/ROOT/parlement/news/release0.2.txt +8 -0
- data/db/ROOT/parlement/news/release0.3.txt +11 -0
- data/db/ROOT/parlement/test.txt +6 -1
- data/db/ROOT/parlement.txt +23 -30
- data/db/ROOT/perso.txt +17 -18
- data/db/development_structure.sql +133 -217
- data/db/schema.rb +83 -0
- data/db/schema.sql +11 -15
- data/lib/data_import.rb +3 -1
- data/public/attachment/file/architecture.png +0 -0
- data/public/attachment/file/architecture.svg +8972 -0
- data/public/attachment/file/security.svg +8960 -0
- data/public/images/Sleep-Deprivation-5.JPG +0 -0
- data/public/images/eltBackground.png +0 -0
- data/public/images/eltBackground.svg +89 -0
- data/public/images/orange_by_darren_Hester_350o.jpg +0 -0
- data/public/images/rails.png +0 -0
- data/public/images/smile.png +0 -0
- data/public/images/smile.svg +257 -0
- data/public/images/world.png +0 -0
- data/public/images/world.svg +170 -0
- data/public/javascripts/controls.js +30 -1
- data/public/javascripts/dragdrop.js +210 -145
- data/public/javascripts/effects.js +261 -399
- data/public/javascripts/ie7.js +6 -0
- data/public/javascripts/prototype.js +131 -72
- data/public/oldindex.html +270 -71
- data/public/stylesheets/default.css +189 -215
- data/script/about +1 -1
- data/script/breakpointer +1 -1
- data/script/console +1 -1
- data/script/destroy +1 -1
- data/script/generate +1 -1
- data/script/performance/benchmarker +1 -1
- data/script/performance/profiler +1 -1
- data/script/plugin +1 -1
- data/script/process/reaper +1 -1
- data/script/process/spawner +1 -1
- data/script/process/spinner +1 -1
- data/script/runner +1 -1
- data/script/server +1 -1
- data/test/fixtures/elts.yml +2 -0
- data/test/fixtures/mail/mail_ruby +27 -0
- data/test/fixtures/mail/mail_rubyChild +28 -0
- data/test/fixtures/mail/mail_rubyWithAttachment +7932 -0
- data/test/fixtures/mail/mail_rubyWithSubject +27 -0
- data/test/fixtures/mails.yml +7 -1
- data/test/fixtures/people.yml +5 -0
- data/test/fixtures/subscribers.yml +11 -0
- data/test/functional/account_controller_test.rb +38 -37
- data/test/functional/subscriber_controller_test.rb +128 -0
- data/test/test_helper.rb +44 -0
- data/test/unit/attachment_test.rb +1 -1
- data/test/unit/elt_test.rb +3 -2
- data/test/unit/mail_notify_test.rb +37 -0
- data/test/unit/mail_test.rb +124 -1
- data/test/unit/notifier_test.rb +0 -14
- data/test/unit/person_test.rb +2 -1
- data/test/unit/subscriber_test.rb +35 -0
- data/test/unit/user_test.rb +3 -3
- data/vendor/plugins/file_column/CHANGELOG +64 -0
- data/vendor/plugins/file_column/README +54 -0
- data/vendor/plugins/file_column/Rakefile +36 -0
- data/vendor/plugins/file_column/TODO +6 -0
- data/vendor/plugins/file_column/init.rb +12 -0
- data/vendor/plugins/file_column/lib/file_column.rb +719 -0
- data/vendor/plugins/file_column/lib/file_column_helper.rb +145 -0
- data/vendor/plugins/file_column/lib/file_compat.rb +28 -0
- data/vendor/plugins/file_column/lib/magick_file_column.rb +188 -0
- data/vendor/plugins/file_column/lib/validations.rb +112 -0
- data/vendor/plugins/file_column/test/abstract_unit.rb +90 -0
- data/vendor/plugins/file_column/test/connection.rb +17 -0
- data/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
- data/vendor/plugins/file_column/test/file_column_test.rb +630 -0
- data/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
- data/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
- data/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
- data/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
- data/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
- data/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
- data/vendor/plugins/file_column/test/magick_test.rb +251 -0
- data/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
- data/vendor/plugins/guid/README.TXT +19 -0
- data/vendor/plugins/guid/init.rb +23 -0
- data/vendor/plugins/guid/lib/usesguid.rb +37 -0
- data/vendor/plugins/guid/lib/uuid22.rb +43 -0
- data/vendor/plugins/guid/lib/uuidtools.rb +565 -0
- metadata +83 -15
- data/db/ROOT/CV.txt +0 -166
- data/lib/file_column.rb +0 -263
- data/lib/file_column_helper.rb +0 -45
- /data/{lib → vendor/plugins/file_column/lib}/rails_file_column.rb +0 -0
data/app/models/mail.rb
CHANGED
@@ -1,4 +1,202 @@
|
|
1
|
+
#
|
2
|
+
# Receive a mail 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
|
+
#
|
1
7
|
class Mail < ActiveRecord::Base
|
8
|
+
usesguid
|
9
|
+
|
2
10
|
belongs_to :elt
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
""" _
|
15
|
+
_ __ ___ ___ ___(_)_ _____
|
16
|
+
| '__/ _ \/ __/ _ \ \ \ / / _ \
|
17
|
+
| | | __/ (_| __/ |\ V / __/
|
18
|
+
|_| \___|\___\___|_| \_/ \___| """
|
19
|
+
#
|
20
|
+
# Receive a mail that will be stored as an elt.
|
21
|
+
#
|
22
|
+
# The algorithm to define its parent is simple:
|
23
|
+
# - header "references"
|
24
|
+
# - or any subject between []
|
25
|
+
# - the "to" part before @#{ActionMailer::Base.server_settings[:domain]}
|
26
|
+
# - in a "mail/lost+found" thread
|
27
|
+
#
|
28
|
+
def receive(mail)
|
29
|
+
logger.info "Receive mail #{mail.message_id}"
|
30
|
+
elt.created_on = mail.date
|
31
|
+
elt.subject = unquote(mail.subject)
|
32
|
+
|
33
|
+
elt.body = ''
|
34
|
+
|
35
|
+
elt.person = Person.find_by_email(mail.from)
|
36
|
+
elt.person = Person.find_by_name(unquote(mail.friendly_from)) if not elt.person
|
37
|
+
elt.person = Person.new if not elt.person
|
38
|
+
elt.person.name = unquote(mail.friendly_from)
|
39
|
+
elt.person.email = mail.from.first
|
40
|
+
|
41
|
+
# Try to find its mail parent in the db
|
42
|
+
if mail.references
|
43
|
+
for parent in mail.references
|
44
|
+
m = Mail.find_by_message(parent.to_s)
|
45
|
+
elt.parent = m.elt if m
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# No reference matching an existing parent, let's try a mailing list we
|
50
|
+
# deduce from an eventual [subject]
|
51
|
+
if not elt.parent and elt.subject.match(/\[\w*\]/)
|
52
|
+
parentId = elt.subject.match(/\[\w*\]/)
|
53
|
+
parentId = parentId[0].gsub(/[\[\]]/, '') if parentId
|
54
|
+
|
55
|
+
begin
|
56
|
+
elt.parent = Elt.find(parentId)
|
57
|
+
|
58
|
+
rescue ActiveRecord::RecordNotFound
|
59
|
+
elt.parent = elt.build_parent
|
60
|
+
elt.parent.parent_id = 'mail'
|
61
|
+
elt.parent.subject = parentId
|
62
|
+
elt.parent.body = ''
|
63
|
+
elt.parent.save
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# No reference matching an existing parent, let's try the "to" field
|
68
|
+
if not elt.parent and mail.to.to_s.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)
|
69
|
+
parentId = mail.to.to_s.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
|
70
|
+
.gsub(/@#{ActionMailer::Base.server_settings[:domain]}/, '')
|
71
|
+
|
72
|
+
begin
|
73
|
+
elt.parent = Elt.find(parentId)
|
74
|
+
|
75
|
+
rescue ActiveRecord::RecordNotFound
|
76
|
+
elt.parent = elt.build_parent
|
77
|
+
elt.parent.parent_id = 'mail'
|
78
|
+
elt.parent.subject = parentId
|
79
|
+
elt.parent.body = ''
|
80
|
+
elt.parent.save
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if not elt.parent
|
85
|
+
parentId = "lost+found"
|
86
|
+
|
87
|
+
begin
|
88
|
+
elt.parent = Elt.find(parentId)
|
89
|
+
|
90
|
+
rescue ActiveRecord::RecordNotFound
|
91
|
+
elt.id = parentId
|
92
|
+
elt.parent = elt.build_parent
|
93
|
+
elt.parent.parent_id = 'mail'
|
94
|
+
elt.parent.subject = parentId
|
95
|
+
elt.parent.body = ''
|
96
|
+
elt.parent.save
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
#elt.parent = Elt.find('mail') if not elt.parent
|
101
|
+
mngAttachment(mail) if mail
|
102
|
+
|
103
|
+
self.message = mail.message_id
|
104
|
+
self.mail_parents = mail.references
|
105
|
+
self.file = mail.encoded
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
""" _ _ _ _
|
110
|
+
_ __ _ _| |__ | (_)___| |__
|
111
|
+
| '_ \| | | | '_ \| | / __| '_ \
|
112
|
+
| |_) | |_| | |_) | | \__ \ | | |
|
113
|
+
| .__/ \__,_|_.__/|_|_|___/_| |_|
|
114
|
+
|_| """
|
115
|
+
#
|
116
|
+
# An elt has just been saved, and needs to be published as a mail
|
117
|
+
#
|
118
|
+
def publish
|
119
|
+
logger.info "Publish mail"
|
120
|
+
|
121
|
+
if message and not message.blank? and file
|
122
|
+
mail = TMail::Mail.parse(file)
|
123
|
+
else
|
124
|
+
mail = MailNotify::create_publish(elt)
|
125
|
+
self.mail_parents = mail.references
|
126
|
+
self.file = mail.encoded
|
127
|
+
end
|
128
|
+
|
129
|
+
mail['Precedence'] = 'list'
|
130
|
+
mail['X-Loop'] = ActionMailer::Base.server_settings[:domain]
|
131
|
+
mail['List-Archive'] = "http://"+ActionMailer::Base.server_settings[:domain]
|
132
|
+
mail['Errors-To'] = "errors@"+ActionMailer::Base.server_settings[:domain]
|
133
|
+
|
134
|
+
mail.bcc = elt.all_recipients \
|
135
|
+
.select { |i| i.email and not i.email.blank? } \
|
136
|
+
.collect { |i| i.email } \
|
137
|
+
.uniq \
|
138
|
+
.join(', ')
|
139
|
+
|
140
|
+
#
|
141
|
+
# Redefine the recipients used when delivering the mail to the local smtp server
|
142
|
+
#
|
143
|
+
# In fact, only send the mail to the bcc recipients, the to and/or cc are
|
144
|
+
# just here for information
|
145
|
+
#
|
146
|
+
def mail.destinations(default = nil)
|
147
|
+
ret = []
|
148
|
+
%w( bcc ).each do |nm|
|
149
|
+
if h = @header[nm]
|
150
|
+
h.addrs.each {|i| ret.push i.address }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
ret.empty? ? default : ret
|
154
|
+
end
|
155
|
+
|
156
|
+
# Added to make sure it is not lost, but not modified if already existant
|
157
|
+
mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
|
158
|
+
|
159
|
+
|
160
|
+
MailNotify::deliver(mail) if not mail.destinations.empty?
|
161
|
+
|
162
|
+
# Do it after sending, to get the actual message id as generated by the MTA
|
163
|
+
# Note that the id of a resent mail is regenerated, but we don't record it,
|
164
|
+
# we record the initial id
|
165
|
+
self.message = mail.message_id if not self.message or self.message.blank?
|
166
|
+
|
167
|
+
logger.info "Published with id \"#{message}\""
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
#
|
174
|
+
# This is to make sure we only have utf-8, no iso-8859
|
175
|
+
#
|
176
|
+
def unquote(text)
|
177
|
+
text.gsub(/\=\?.*?\?\=/) do |m|
|
178
|
+
TMail::Unquoter.unquote_and_convert_to(m, 'utf-8')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# Get and store the attachments
|
184
|
+
#
|
185
|
+
def mngAttachment(attachment)
|
186
|
+
if attachment.content_type == 'text/plain'
|
187
|
+
elt.body += attachment.body
|
188
|
+
|
189
|
+
elsif attachment.multipart?
|
190
|
+
attachment.parts.each { |part| mngAttachment(part) }
|
191
|
+
|
192
|
+
elsif attachment.type_param('name')
|
193
|
+
file = File.new('/tmp/'+attachment.type_param('name'), 'w')
|
194
|
+
file << attachment.body
|
195
|
+
file.flush
|
196
|
+
|
197
|
+
attach = elt.attachments.build
|
198
|
+
attach.file = file
|
199
|
+
end
|
200
|
+
end
|
3
201
|
end
|
4
202
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#
|
2
|
+
# Send a publication email whenever an elt is saved
|
3
|
+
#
|
4
|
+
# Important:
|
5
|
+
# the bcc, which is actually used for sending, is setup in the Mail class
|
6
|
+
#
|
7
|
+
class MailNotify < ActionMailer::Base
|
8
|
+
def publish(elt)
|
9
|
+
@subject = elt.subject
|
10
|
+
# Try to render the element as html
|
11
|
+
#@body = elt.body
|
12
|
+
@body[:elt] = elt
|
13
|
+
|
14
|
+
@recipients = (mailing_list(elt.parent).subject.blank? ? '' : mailing_list(elt.parent).subject ) \
|
15
|
+
+ ' <' \
|
16
|
+
+ mailing_list(elt.parent).id + '@' + ActionMailer::Base.server_settings[:domain] \
|
17
|
+
+ '>'
|
18
|
+
|
19
|
+
@from = ((elt.person and elt.person.name) ? elt.person.name : ANONYMOUS_POSTER) \
|
20
|
+
+ ' <' \
|
21
|
+
+ ((elt.person and elt.person.email) \
|
22
|
+
? elt.person.email : ANONYMOUS_POSTER + '@' + ActionMailer::Base.server_settings[:domain]) \
|
23
|
+
+ '> '
|
24
|
+
|
25
|
+
# This is the essential of a mailing list, you reply to the mailing list,
|
26
|
+
# where every body sends their mail.
|
27
|
+
# This very mail can be a mailing list all by itself...
|
28
|
+
@headers['Reply-to'] = mailing_list(elt).id + '@' + ActionMailer::Base.server_settings[:domain]
|
29
|
+
|
30
|
+
@headers['In-Reply-To'] = elt.parent.mail.message if elt.parent \
|
31
|
+
and elt.parent.mail and elt.parent.mail.message
|
32
|
+
|
33
|
+
@sent_on = elt.created_on
|
34
|
+
|
35
|
+
parentMsg = elt.parent.mail
|
36
|
+
if parentMsg
|
37
|
+
@headers['references'] = ''
|
38
|
+
@headers['references'] << parentMsg.mail_parents if parentMsg.mail_parents
|
39
|
+
@headers['references'] << parentMsg.message if parentMsg.message
|
40
|
+
end
|
41
|
+
|
42
|
+
@content_type = 'multipart/alternative'
|
43
|
+
|
44
|
+
@headers['X-Mailer'] = ActionMailer::Base.server_settings[:domain] + " v" + PARLEMENT_VERSION
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
#
|
50
|
+
# Try to fine, define, the mailing list id this elt is part of
|
51
|
+
#
|
52
|
+
# The algo used is simple: find a parent id smaller than the usually auto
|
53
|
+
# generated ids
|
54
|
+
#
|
55
|
+
def mailing_list(elt)
|
56
|
+
e = elt
|
57
|
+
while e.id.size > 21 and e.parent_id != 'ROOT'
|
58
|
+
e = e.parent
|
59
|
+
end
|
60
|
+
e
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
data/app/models/person.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
class Person < ActiveRecord::Base
|
2
|
+
usesguid
|
3
|
+
|
2
4
|
has_many :elts
|
3
5
|
|
4
6
|
validates_presence_of :name, :on => :create
|
5
7
|
validates_length_of :name, :within => 3..40, :on => :create
|
6
8
|
validates_uniqueness_of :name, :on => :create
|
7
|
-
validates_uniqueness_of :email, :on => :create
|
9
|
+
validates_uniqueness_of :email, :on => :create,
|
10
|
+
:if => Proc.new { |p| p.email and p.email.length > 0 }
|
11
|
+
|
12
|
+
has_and_belongs_to_many :subscribed_elts,
|
13
|
+
:class_name => "Elt",
|
14
|
+
:join_table => "subscribers"
|
8
15
|
end
|
9
16
|
|
@@ -1,57 +1,60 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
:interactive => visual_effect(:BlindDown, divId)) %>
|
6
|
-
<!--:position => 'after',-->
|
1
|
+
<%= form_remote_tag(
|
2
|
+
:update => divId,
|
3
|
+
:url => { :controller => 'account', :action => 'login' },
|
4
|
+
:complete => visual_effect(:BlindDown, divId)) %>
|
7
5
|
|
8
|
-
|
6
|
+
<div class="login">
|
7
|
+
<span>
|
8
|
+
<input type="hidden" id="divId" name="divId" value="<%= divId %>"/>
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
<label for="person_name">Pseudo:</label>
|
11
|
+
<%= text_field "person", "name", :size => 10 %>
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
<%= link_to_function('+',
|
14
|
+
"Element.toggle(this);"+visual_effect(:Grow, 'user_password_'+divId.to_s)) %>
|
15
|
+
</span>
|
15
16
|
|
16
|
-
<span style="display:none" id="user_password_<%= divId %>">
|
17
|
+
<span style="display: none;" id="user_password_<%= divId %>">
|
17
18
|
|
18
19
|
<label for="user_password">Password:</label>
|
19
20
|
<%= password_field "user", "password", :size => 10 %>
|
20
21
|
|
21
|
-
<%= link_to_function('email?
|
22
|
+
<%= link_to_function('email? >',
|
22
23
|
"Element.toggle(this);"+visual_effect(:Grow, 'person_email_'+divId.to_s)) %>
|
23
24
|
</span>
|
24
25
|
|
25
|
-
<span style="display:none" id="person_email_<%= divId %>">
|
26
|
+
<span style="display: none;" id="person_email_<%= divId %>">
|
26
27
|
<br/>
|
27
28
|
<!--
|
28
|
-
<label for="user_password_confirmation">Confirm password:</label>
|
29
29
|
<%= password_field "user", "password_confirmation", :size => 10 %>
|
30
|
-
|
31
30
|
-->
|
32
31
|
<label for="person_email">Email (or check key):</label>
|
33
|
-
<%= text_field "person", "email", :size =>
|
32
|
+
<%= text_field "person", "email", :size => 20 %>
|
34
33
|
</span>
|
35
34
|
|
36
35
|
<%= submit_tag 'Ok' %>
|
37
36
|
|
38
37
|
<%= render :partial => '/help',
|
39
38
|
:locals => { :divId => 'login'+divId.to_s, :content => '
|
40
|
-
<
|
39
|
+
<p>You can propose an element</p>
|
40
|
+
<ul>
|
41
41
|
<li>with no pseudo</li>
|
42
42
|
<li>with an unprotected pseudo</li>
|
43
43
|
<li>with a password protected pseudo (click on the "+")</li>
|
44
44
|
<li>with a password protected and email verified pseudo (TODO)</li>
|
45
45
|
</ul>
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
<p>
|
47
|
+
The last method is the only secure way to protect a nickname on
|
48
|
+
<strong>this</strong> server.
|
49
|
+
</p>
|
50
|
+
<p>
|
51
|
+
If a nick is not protected and verified, anybody else can protect it for
|
52
|
+
themselves if they at least supply a password <em>and</em> an email.
|
53
|
+
</p>
|
54
|
+
<p>
|
55
|
+
A login must contain [3..40] characters, a password [5..40].
|
56
|
+
</p>
|
53
57
|
' } %>
|
54
|
-
|
55
|
-
|
56
|
-
</div>
|
58
|
+
</div>
|
59
|
+
<%= end_form_tag %>
|
57
60
|
|
@@ -8,18 +8,18 @@
|
|
8
8
|
<% if @session[:person] %>
|
9
9
|
<% if @session[:person].name and @session[:person].name != '' %>
|
10
10
|
<div class="author">
|
11
|
-
|
11
|
+
<%= link_to(@session[:person].name,
|
12
12
|
:controller => 'person',
|
13
13
|
:action => 'show',
|
14
|
-
:id => @session[:person])
|
14
|
+
:id => @session[:person]) %>
|
15
15
|
</div>
|
16
16
|
<% end %>
|
17
17
|
|
18
18
|
<div class="logout">
|
19
|
-
<%= link_to_remote('
|
19
|
+
<%= link_to_remote('[X]',
|
20
20
|
:update => divId,
|
21
21
|
:url => { :controller => 'account', :action => 'logout', :divId => divId },
|
22
|
-
:
|
22
|
+
:complete => visual_effect(:BlindDown, divId)) %>
|
23
23
|
</div>
|
24
24
|
<% else %>
|
25
25
|
|
data/app/views/elt/_elt.rhtml
CHANGED
@@ -1,25 +1,23 @@
|
|
1
1
|
<% eltSubsNb = elt.children.count if eltSubsNb == nil %>
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<% end %>
|
15
|
-
</div>
|
3
|
+
<div id="elt_<%= elt.id %>" class="elt">
|
4
|
+
<% if elt.person %>
|
5
|
+
<div class="author">
|
6
|
+
<%= link_to(elt.person.name,
|
7
|
+
:controller => 'person', :action => 'show', :id => elt.person) %>
|
8
|
+
</div>
|
9
|
+
<% elsif not displayTitle? elt %>
|
10
|
+
<div class="author">
|
11
|
+
<%= ANONYMOUS_POSTER %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
16
14
|
|
17
15
|
<div class="eltInfo" title="<%= elt.created_on %>">
|
18
16
|
<!--
|
19
17
|
<= link_to('@', :action => 'raw_elt', :id => elt) if elt.mail != nil >
|
20
18
|
-->
|
21
19
|
<% if elt.id and elt.children.count == 0 %>
|
22
|
-
<%= link_to_remote('
|
20
|
+
<%= link_to_remote('<span class="icon">>></span>',
|
23
21
|
:update => 'eltNew_'+elt.id.to_s,
|
24
22
|
:url => { :controller => 'elt', :action => 'new', :id => elt },
|
25
23
|
:loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
|
@@ -27,13 +25,10 @@
|
|
27
25
|
<% end %>
|
28
26
|
</div>
|
29
27
|
|
30
|
-
<% if
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
<%= elt.created_on.strftime('%d/%m/%y %H:%M') %>
|
35
|
-
</span>
|
36
|
-
<% end %>
|
28
|
+
<% if eltTop or displayTitle? elt %>
|
29
|
+
<span class="created_on">
|
30
|
+
<%= elt.created_on.strftime('%d/%m/%y %H:%M') %>
|
31
|
+
</span>
|
37
32
|
|
38
33
|
<<%= eltTop ? 'h1' : 'h2' %>>
|
39
34
|
<% if elt.id %>
|
@@ -65,7 +60,7 @@
|
|
65
60
|
visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s),
|
66
61
|
:loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)) %>
|
67
62
|
|
68
|
-
<%= link_to_remote('Add
|
63
|
+
<%= link_to_remote('Add <span class="icon">>></span>',
|
69
64
|
:update => 'eltNew_'+elt.id.to_s,
|
70
65
|
:url => { :controller => 'elt', :action => 'new', :id => elt },
|
71
66
|
:loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
|
@@ -87,20 +82,20 @@
|
|
87
82
|
<div style="display:<%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'none' %>"
|
88
83
|
id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
|
89
84
|
class="eltSubsClose">
|
90
|
-
<%= link_to_function('
|
85
|
+
<%= link_to_function('<span class="icon"><<</span> Close',
|
91
86
|
visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s)+
|
92
87
|
visual_effect(:BlindUp, 'eltNew_'+elt.id.to_s)+
|
93
88
|
visual_effect(:BlindUp, 'eltSubsClose_'+elt.id.to_s)+
|
94
89
|
visual_effect(:BlindDown, 'eltMore_'+elt.id.to_s)) %>
|
95
90
|
|
96
91
|
<% if elt.person %>
|
97
|
-
|
98
|
-
:controller => 'person', :action => 'show', :id => elt.person)
|
99
|
-
<% elsif
|
100
|
-
|
92
|
+
<%= link_to(elt.person.name,
|
93
|
+
:controller => 'person', :action => 'show', :id => elt.person) %>
|
94
|
+
<% elsif not displayTitle? elt %>
|
95
|
+
<%= ANONYMOUS_POSTER %>
|
101
96
|
<% end %>
|
102
97
|
|
103
|
-
<%= link_to_remote('Add
|
98
|
+
<%= link_to_remote('Add <span class="icon">>></span>',
|
104
99
|
:update => 'eltNew_'+elt.id.to_s,
|
105
100
|
:url => { :controller => 'elt', :action => 'new', :id => elt },
|
106
101
|
:loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
|
data/app/views/elt/_list.rhtml
CHANGED
@@ -6,11 +6,15 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
|
|
6
6
|
'created_on DESC', e_pages.current.to_sql)
|
7
7
|
%>
|
8
8
|
|
9
|
+
<%
|
10
|
+
# TODO There seems to be a problem with firefox when trying to use a visual_effect
|
11
|
+
%>
|
12
|
+
|
9
13
|
<%= link_to_remote('< Previous',
|
10
14
|
:update => 'eltSubs_'+elt.id.to_s,
|
11
15
|
:url => { :action => 'list', :id => elt, :page => e_pages.current.next },
|
12
16
|
:loading => visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s),
|
13
|
-
:
|
17
|
+
:complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)) if e_pages.current.next %>
|
14
18
|
|
15
19
|
<span style="display:<%= e_pages.length > 1 ? '' : 'none'%>" class="pageCount">
|
16
20
|
(<%= e_pages.length-e_pages.current.to_i+1 %>/<%= e_pages.length %>)
|
@@ -20,7 +24,7 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
|
|
20
24
|
:update => 'eltSubs_'+elt.id.to_s,
|
21
25
|
:url => { :action => 'list', :id => elt, :page => e_pages.current.previous },
|
22
26
|
:loading => visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s),
|
23
|
-
:
|
27
|
+
:complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)) if e_pages.current.previous %>
|
24
28
|
|
25
29
|
<%= render :partial => '/elt/elt',
|
26
30
|
:collection => e.reverse,
|
data/app/views/elt/new.rhtml
CHANGED
data/app/views/elt/show.rhtml
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
<div class="sidebar">
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<% end %>
|
2
|
+
<% if @elt.children.count > 0 %>
|
3
|
+
<div class="boxTitle">Titres</div>
|
4
|
+
<% end %>
|
6
5
|
|
7
|
-
|
6
|
+
<div class="box">
|
7
|
+
<% for elt in @elt.children.reverse[0...PAGE_ELT_LENGTH] %>
|
8
8
|
<div class="boxLine">
|
9
|
-
<
|
9
|
+
<div style="float:right;margin-right:0.5em;font-size:smaller;">
|
10
10
|
<%= elt.created_on.strftime('%d/%m') %>
|
11
|
-
</
|
11
|
+
</div>
|
12
12
|
<%= link_to elt.subject, :id => elt %>
|
13
13
|
</div>
|
14
14
|
<% end %>
|
@@ -16,7 +16,29 @@
|
|
16
16
|
<br/>
|
17
17
|
|
18
18
|
<%= link_to image_tag("/images/webfeed.gif"),
|
19
|
-
|
19
|
+
:action => 'rss', :id => @elt %>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<div class="boxTitle">Subscribe</div>
|
23
|
+
<div class="box">
|
24
|
+
<div id="author_<%= @elt.id %>">
|
25
|
+
<%= render :partial => 'account/show',
|
26
|
+
:locals => { :divId => 'author_'+@elt.id } %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div id="subscription">
|
30
|
+
<%= link_to_remote(((@session[:person] and @elt.subscribers.include?(@session[:person])) ? 'Unsubscribe!' : 'Subscribe!'),
|
31
|
+
:update => 'subscription',
|
32
|
+
:url => { :controller => 'subscriber', :action => 'subscribe', :id => @elt },
|
33
|
+
:loaded => visual_effect(:BlindDown, 'subscription')) %>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="boxLine"><%= @elt.subscribers.size %> subscriber(s)</div>
|
37
|
+
<div class="boxLine">
|
38
|
+
<% @elt.subscribers.each do |i| %>
|
39
|
+
<%= link_to(i.name, :controller => 'person', :action => 'show', :id => i) %>
|
40
|
+
<% end %>
|
41
|
+
</div>
|
20
42
|
</div>
|
21
43
|
</div>
|
22
44
|
|
@@ -24,10 +46,10 @@
|
|
24
46
|
<div class="<%= key %>"><%= value %></div>
|
25
47
|
<% end %>
|
26
48
|
|
27
|
-
<% if @elt.parent.subject != '' %>
|
49
|
+
<% if @elt.parent and @elt.parent.subject != '' %>
|
28
50
|
<div class="parent">
|
29
51
|
<%= link_to(textilize_without_paragraph(@elt.parent.subject),
|
30
|
-
|
52
|
+
:id => @elt.parent) %>
|
31
53
|
</div>
|
32
54
|
<% end %>
|
33
55
|
|
data/app/views/layouts/top.rhtml
CHANGED
@@ -4,36 +4,42 @@
|
|
4
4
|
<html>
|
5
5
|
<head>
|
6
6
|
<title><%= @title %></title>
|
7
|
-
<%= stylesheet_link_tag 'default' %>
|
7
|
+
<%= stylesheet_link_tag 'default.css' %>
|
8
8
|
<%= javascript_include_tag "/javascripts/prototype" %>
|
9
9
|
<%= javascript_include_tag "/javascripts/scriptaculous" %>
|
10
10
|
|
11
|
+
<link rel="shortcut icon" href="/images/world.png" type="image/png"/>
|
12
|
+
|
11
13
|
<meta name="ROBOTS" content="ALL"/>
|
12
14
|
<meta name="author" content="Emmanuel Charpentier"/>
|
13
15
|
<meta name="description" content="Parlement, a mix between direct and
|
14
16
|
representative democracy, in the shape of a website. A mailing list,
|
15
17
|
forum, chat."/>
|
16
|
-
<meta name="keywords" content="collaborative writing, democracy,
|
17
|
-
|
18
|
-
|
19
|
-
PostgreSQL"/>
|
18
|
+
<meta name="keywords" content="collaborative writing, democracy, direct
|
19
|
+
democracy, representative democracy, forum, mailing list, chat, ruby on
|
20
|
+
rails, PostgreSQL"/>
|
20
21
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
21
22
|
</head>
|
22
23
|
|
23
24
|
<body>
|
24
|
-
<div class="
|
25
|
+
<div class="links">
|
25
26
|
<a class="title" href="http://leparlement.org">Parlement</a>
|
26
|
-
|
27
27
|
<div class="signets">
|
28
28
|
<a href="http://rubyforge.org/projects/parlement">forge</a>
|
29
|
-
<a href="http://www.gnu.org/
|
29
|
+
<a href="http://www.gnu.org/licenses/gpl.html">GPL</a>
|
30
30
|
</div>
|
31
31
|
</div>
|
32
32
|
|
33
33
|
<%= @content_for_layout %>
|
34
34
|
|
35
|
-
<
|
36
|
-
|
35
|
+
<p class="version">
|
36
|
+
<a href="<%= url_for :controller => 'elt', :action => 'show', :id => '' %>">
|
37
|
+
v<%= PARLEMENT_VERSION %></a>
|
38
|
+
<a href="http://validator.w3.org/check?uri=referer">
|
39
|
+
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Strict"/>
|
40
|
+
</a>
|
41
|
+
</p>
|
42
|
+
|
37
43
|
</body>
|
38
44
|
</html>
|
39
45
|
|