# # This is the central component to parlement # # An element is just the name for a poll/message/issue # class EltController < ApplicationController def index params[:id] = params[:id].gsub(/.html/, '') show end def show params[:id] = params[:id].gsub(/.html/, '') @elt = Elt.find(params[:id]) @title = @elt.subject @title += " (parlement)" if !@title.downcase.include? "parlement" render :layout => 'top' rescue ActiveRecord::RecordNotFound => e flash[:error] = _("Element %s does not exist") % params[:id] headers["Status"] = "301 Moved Permanently" redirect_to '/' 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 if session[:lastUpdatedView] && session[:lastUpdatedView] > Time.now - 9 then # Protection against some browsers updating too fast logger.info "Too soon" render :inline => "" return end session[:lastUpdatedView] ||= Time.now - 10 @elt = Elt.find(params[:id]) acts = "" acts += " \ \ " if @elt.last_activity > session[:lastUpdatedView] if person = session[:person] 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 "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 "#{visits} visit(s), #{subscribers} subscriber(s)" end session[:lastUpdatedView] = Time.now render :inline => acts end def rss params[:id] = params[:id].gsub(/.rss/, '') headers["Content-Type"] = "text/xml; charset=utf-8" @elt = Elt.find(params[:id]) if @elt == nil end def vote_rss params[:id] = params[:id].gsub(/.rss/, '') headers["Content-Type"] = "text/xml; charset=utf-8" @elt = Elt.find(params[:id]) if @elt == nil end # Used to initialise the elt, its subject mainly def new @elt = Elt.new(:parent_id => params[:id], :body => "") if @elt.parent.subject.include? 'Re: ' @elt.subject = @elt.parent.subject else @elt.subject = 'Re: '+@elt.parent.subject end end def create @elt = Elt.new(params[:elt]) @elt.person = session[:person] if !session[:person] \ and (@elt.subject =~ /([<>\/]|href)/ \ or @elt.body =~ /(.*(http|href)(.*\n)*){3}/ \ or @elt.body =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i \ or @elt.body =~ /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}.*){3}/i) 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] unless 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 = session[:person] 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] ? session[:person].id : nil) if choice and choice.value == vote.body.to_i then logger.info "#{(session[:person] ? session[:person].name : 'null')} voting 0" vote.body = "0" else logger.info "#{(session[:person] ? session[:person].name : 'null')} voting #{params[:choice][:value]}" end vote.publish @elt.add_child vote expire_fragment :action => 'show', :id => @elt.id render :partial => '/elt/choice', :locals => { :elt => @elt } end end