# # This is the central element to parlement # # An element is just the name for a poll/message/issue # class EltController < ApplicationController def index show end def show params[:id] = request.subdomains[0] unless params[:id] params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id] params[:id] = params[:id].gsub(/.html/, '') @elt = Elt.find(params[:id]) @title = @elt.subject @title += " (parlement)" if !@title.downcase.include? "parlement" render :layout => 'top', :template => 'elt/show' #rescue ActiveRecord::StatementInvalid => e # load 'db/schema.rb' # redirect_to '/' rescue ActiveRecord::RecordNotFound => e root = Elt.find_by_id('ROOT') if root and root.children.size > 0 render :status => 404, :file => "#{RAILS_ROOT}/public/404.html" else if root @elt = root else @elt = Elt.new :subject => '', :lft => 0, :rgt => 1, :last_activity => Time.now @elt.id = 'ROOT' @elt.save end flash[:notice] = _("You need to create a top object (click on the new icon below)") render :layout => 'top' end end def list @elt = Elt.find(params[:id]) if @elt == nil render :partial => '/elt/list/children', :locals => { :elt => @elt } end def listByDate @elt = Elt.find params[:id] unless @elt render :partial => '/elt/list/byDate' end def listByVote @elt = Elt.find params[:id] unless @elt render :partial => '/elt/list/byVote' end def listVisitors @elt = Elt.find params[:id] unless @elt render :partial => '/elt/list/visitors' end def listSubscribers @elt = Elt.find params[:id] unless @elt render :partial => '/elt/list/subscribers' end def updateView session[:lastUpdatedView] ||= Time.now - UPDATE_VIEW_PERIOD @elt = Elt.find(params[:id]) acts = "" acts += " \ \ " if @elt.last_activity > session[:lastUpdatedView] if person = Person.find_by_id(session[:person_id]) visits = Visit.count \ :joins => "JOIN elts e1 ON e1.id = '#{params[:id]}' \ JOIN elts e2 ON visits.elt_id = e2.id \ AND ((e1.lft <= e2.lft AND e2.rgt <= e1.rgt) \ OR (e1.lft > e2.lft AND e2.rgt > e1.rgt))", :conditions => "visits.updated_on >= '#{session[:lastUpdatedView]}'" acts += " \ \ " if visits > 0 subscribers = Subscription.count \ :joins => "JOIN elts e1 ON e1.id = '#{params[:id]}' \ JOIN elts e2 ON subscriptions.elt_id = e2.id \ AND ((e1.lft <= e2.lft AND e2.rgt <= e1.rgt) \ OR (e1.lft > e2.lft AND e2.rgt > e1.rgt))", :conditions => "subscriptions.created_on >= '#{session[:lastUpdatedView]}'" acts += " \ \ " if subscribers > 0 visit = Visit.find_by_person_id_and_elt_id(person, params[:id]) if visit and person.last_login and person.last_login > visit.created_on then logger.info yellow { "New visit" } visit.destroy visit = nil end visit = Visit.new(:person => person, :elt_id => params[:id]) unless visit visit.filter = filter visit.save! logger.info magenta { "#{visits} visit(s), #{subscribers} subscriber(s)" } end session[:lastUpdatedView] = Time.now render :inline => acts end def rss params[:id] = nil if params[:id].size == 0 params[:id] = request.subdomains[0] unless params[:id] params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id] params[:id] = params[:id].gsub(/.rss/, '') headers["Content-Type"] = "text/xml; charset=utf-8" @elt = Elt.find(params[:id]) if @elt == nil rescue ActiveRecord::RecordNotFound => e redirect_to '/404.html' end def vote_rss params[:id] = nil if params[:id].size == 0 params[:id] = request.subdomains[0] unless params[:id] params[:id] = Elt.find(:first, :conditions => "parent_id = 'ROOT'", :order => 'created_on').id unless params[:id] params[:id] = params[:id].gsub(/.rss/, '') headers["Content-Type"] = "text/xml; charset=utf-8" @elt = Elt.find(params[:id]) if @elt == nil rescue ActiveRecord::RecordNotFound => e redirect_to '/404.html' end # Used to initialise the elt, its subject mainly def new @elt = Elt.new(:parent_id => params[:id], :body => "") if @elt.parent then if @elt.parent.subject.include? 'Re: ' @elt.subject = @elt.parent.subject else @elt.subject = 'Re: '+@elt.parent.subject end else # Rejected if you are not coming from a valid elt render :status => 404, :file => "#{RAILS_ROOT}/public/404.html" end end def create @elt = Elt.new(params[:elt]) @elt.person = Person.find_by_id(session[:person_id]) if !@elt.parent then # Rejected if you are not coming from a valid elt render :status => 404, :file => "#{RAILS_ROOT}/public/404.html" return end if ((!@elt.person \ and (@elt.subject =~ /([<>\/]|href)/ \ or @elt.body =~ /(.*(http|href)(.*\n)*)/ \ or @elt.body =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i \ or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i)) \ or ((!@elt.person or @elt.person.elts.size <= 1) and @elt.body =~ /(http|href)/)) then logger.error red { underline { "SPAM! '#{@elt.subject}'" } } logger.error "SPAM! '#{@elt.body}'" 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!') headers["Status"] = "404 Post considered as spam" render :controller => 'elt', :action => 'new', :status => 404 else if not @elt.person and params[:person] and login = params[:person][:name] and !login.empty? then @elt.person = Person.find_by_name(login) || Person.new(params[:person]) if @elt.person.user flash[:warning] = _('This name is password protected, login in top right box') @elt.person = nil elsif params[:submit] != "preview" @elt.person.save! end elsif params[:person] and email = params[:person][:email] and !email.empty? then @elt.person.save! end if params[:submit] == "preview" or (@elt.publish and headers["Status"] = "201 Created") then render :partial => '/elt/elt', :locals => { :elt => @elt, :eltTop => false, :created => true } else logger.error "Strange error, can't preview or save an element" puts "Strange error, can't preview or save an element" flash[:notice] = 'Error' render :controller => 'elt', :action => 'new' end end end def raw_elt @mail = Elt.find(params[:id]).mail #@elt = TMail::Mail.parse(Elt.find(params[:id]).mail.id) render :inline => "
<%= @mail.file %>
", :layout => 'top' end def vote @elt = Elt.find params[:id] if !session[:person_id] then flash[:error] = 'Sorry, need to be authenticated to vote!' render :partial => '/elt/choice', :locals => { :elt => @elt } return end if !params[:choice][:value] =~ /^\s*(-1|0|\+1)(\s|$)/ then logger.error red { underline { "SPAM! through the vote" } } logger.error params[:choice][:value] flash[:error] = 'Sorry, you can only vote here!' render :partial => '/elt/choice', :locals => { :elt => @elt } return end vote = @elt.children.build vote.person = Person.find_by_id(session[:person_id]) vote.subject = @elt.subject vote.subject = 'Re: '+vote.subject if vote.subject and !vote.subject.include? 'Re: ' vote.body = params[:choice][:value] choice = Choice.find_by_elt_id_and_person_id @elt.id, session[:person_id] if choice and choice.value == vote.body.to_i then logger.info "#{session[:person_id]} voting 0" vote.body = "0" else logger.info "#{session[:person_id]} voting #{params[:choice][:value]}" end vote.publish @elt.add_child vote render :partial => '/elt/choice', :locals => { :elt => @elt } end def choices @elt = Elt.find params[:id] rescue ActiveRecord::RecordNotFound => e render :status => 404, :file => "#{RAILS_ROOT}/public/404.html" end end