parlement 0.2 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|