I am using debian, so here are a few commands I use: # apt-get install postgresql # sudo su - postgres # createuser /your_login/ # apt-get install ruby # apt-get install libpgsql-ruby # apt-get install irb # apt-get install rdoc -> why??? # ln -s /sbin/ifconfig /bin/ # gem install rails # gem install redcloth Only if you expect to develop and release: # gem install meta_project The database is setup for user "manu", you may need to change the file config/database.yml for your own settings. Change config/environment.rb to set the domain, default is something like 'leparlement.org', define it as your web site or email domain. In procmail, define a rule to redirect the relevant mail to parlement, I use: :0 c * ^TO parlement|leparlement.org | /home/manu/parlement/trunk/script/runner 'Mailman.receive STDIN.read' Once you have everything set up (ruby, postgresql, redcloth, irb), you can launch parlement thus: ~ cd parlement ~ psql -q template1 -f db/schema.sql ~ ruby lib/data_import.rb ~ ruby ./script/server Now you can go to localhost:3000 The problem: "how to display conversations" The entities involved: - element - ancestor - children - children number - author - element's size - title - body The possibilities - show one element and its children closed - show one element opened and its children closed - show one element and its children opened, its grand children closed - show one element opened, its children and grand children opened - when an element is closed, also show its children? Limits - can not display all elements at once - can not display one element and all its direct children at once Parameters - ordering - date - number of children displayed - votes # Here is my console code to reset threads from their original mails: >> elts=Mail.find_all.select{|m|m.file and mail=TMail::Mail.parse(m.file) and reply=mail.in_reply_to and mailObject=Mail.find_by_message(reply) and mailObject.elt.id!=m.elt.parent_id}.collect{|m| {:elt=>m.elt.id, :parent=>Mail.find_by_message(TMail::Mail.parse(m.file).in_reply_to).elt.id}}; puts elts.size >> elts.each{|e|print e[:elt], ' ', e[:parent], ' '; puts Elt.update_all("parent_id='#{e[:parent]}'", "id='#{e[:elt]}'")}; puts elts.size # To get and remove duplicate messages >> messages=Mail.find_by_sql "select message from mails group by message having count(message) > 1"; puts messages.length >> messages.each{ |m| mail=Mail.find_all_by_message m.message; mail.each{|m| print m.elt.id, ' ', m.elt.subject, ' ', m.elt.children.size; puts } }; puts messages.length >> messages.each{ |m| mail=Mail.find_all_by_message m.message; mail.each_index{|i| m=mail[i]; print i, ' ', m.elt.id, ' ', m.elt.subject, ' ', m.elt.children.size; m.elt.destroy if i>0 and m.elt.children.size==0; puts } }; puts messages.length # To get all existing votes elts=Elt.find(:all, :conditions => ["body LIKE '%%+1%%' OR body LIKE '%%0%%' OR body LIKE '%%-1%%'"]); puts elts.size elts.each { |e| print '(', Regexp.last_match(1), ')' if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size elts.each { |e| e.vote(Regexp.last_match(1), e.person) if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size