Changeset 1130

Show
Ignore:
Timestamp:
08/19/07 22:03:16 (1 year ago)
Author:
alban
Message:

implement association between Subscription and User/Group

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/app/controllers/document_controller.rb

    r1126 r1130  
    6262    attributes = Hash.new 
    6363 
    64     key =~ /(.*)\/(.*)/ 
    65     attributes[:username]= $1 
    66     attributes[:password]= $2 
     64    username, password = key.split('/') 
    6765     
    68     user = User.authenticate(attributes
     66    user = User.authenticate(username, password
    6967    if user 
    7068      @user_id = user.id 
  • trunk/app/controllers/documents_controller.rb

    r1126 r1130  
    132132    id = params[:id] 
    133133     
    134     @users = Document.find(id).nonsubscribers.delete_if do |user| 
     134    @people = Document.find(id).nonsubscribers.delete_if do |user| 
    135135      not (user.name.downcase.include?(input) or (not user.username.nil? and user.username.downcase.include?(input))) 
    136136    end 
    137     render :partial => "users/users", :object => @users,  
     137    render :partial => "users/people", :object => @people,  
    138138      :locals => { :empty => "Aucun utilisateur ne correspond", :draggable => true } 
    139139  end    
  • trunk/app/controllers/group_controller.rb

    r1113 r1130  
    6363    id = params[:id] 
    6464     
    65     @users = Group.find(id).nonmembers.delete_if do |user| 
    66       not (user.name.downcase.include?(input) or user.username.downcase.include?(input)) 
     65    @people = Group.find(id).nonmembers.delete_if do |user| 
     66      not (user.name.downcase.include?(input) or (!user.username.nil? and user.username.downcase.include?(input))) 
    6767    end 
    68     render :partial => "users/users", :object => @users,  
     68    render :partial => "users/people", :object => @people,  
    6969      :locals => { :empty => "Aucun utilisateur ne correspond", :draggable => true } 
    7070  end    
  • trunk/app/controllers/subscriptions_controller.rb

    r1128 r1130  
    55    redirect_to :action => 'manage' 
    66  end 
     7   
    78 
    89        def manage 
    9                 @pages = Paginator.new(self, User.find(session[:user]).subscriptions.size, 4, params[:page]) 
    10                 @subscription = User.find(session[:user]).subscriptions.find(:all, :limit => @pages.items_per_page, :offset => @pages.current.offset) 
     10                @pages = Paginator.new(self, User.find(session[:user]).find_subscriptions.size, 4, params[:page]) 
     11                @subscription = User.find(session[:user]).find_subscriptions(:limit => @pages.items_per_page, :offset => @pages.current.offset) 
    1112        end  
    1213   
    1314  def show 
    14         @subscription = User.find(session[:user]).subscriptions.find(params[:id]) 
     15        @subscription = User.find(session[:user]).find_subscription(params[:id]) 
    1516        @review = Review.new(params[:review]) 
    1617        if request.post? 
     
    2930   
    3031        def add 
     32          document_id = params[:document] 
     33          subscriber_type, subscriber_id = params[:id].split("_") 
     34           
    3135                @subscription = Subscription.new do |subscription| 
    3236        subscription.author = User.find(session[:user]) 
    33         subscription.document = subscription.author.documents.find(params[:document]
    34         subscription.subscriber = User.find(params[:id].split("_")[1]
     37        subscription.document = subscription.author.documents.find(document_id
     38        subscription.subscriber = Object.const_get(subscriber_type.capitalize).find(subscriber_id
    3539    end 
    36                 @subscription.save 
     40                 
     41                unless @subscription.save 
     42                  logger.error("can't create subscription on #{document_id} for #{subscriber_type}:#{subscriber_id} : #{@subscription.errors.inspect}") 
     43                end 
     44                 
    3745                render :action => "update" 
    3846        end 
     
    4553   
    4654  def tag 
    47         @pages = Paginator.new(self, User.find(session[:user]).subscriptions.find_by_tag(params[:name]).size, 4, params[:page]) 
    48         @subscriptions = User.find(session[:user]).subscriptions.find_by_tag(params[:name], { :offset => @pages.current.offset, :limit => @pages.items_per_page }
     55        @pages = Paginator.new(self, User.find(session[:user]).find_subscriptions(:tag => params[:name]).size, 4, params[:page]) 
     56        @subscriptions = User.find(session[:user]).find_subscriptions(:tag => params[:name], :offset => @pages.current.offset, :limit => @pages.items_per_page
    4957  end 
    5058   
    5159  def download 
    52     @subscription = User.find(session[:user]).subscriptions.find(params[:id]) 
     60    @subscription = User.find(session[:user]).find_subscription(params[:id]) 
    5361    @subscription.increment!(:download_count) 
    5462        send_file @subscription.document.path, :type => @subscription.document.format, :filename => @subscription.document.filename 
    5563  end 
     64   
    5665end 
  • trunk/app/controllers/users_controller.rb

    r1128 r1130  
    1313 
    1414        def dashboard 
    15                @author = User.find(session[:user]) 
    16                 @subscriber = User.find(session[:user]) 
    17                 user_tags = @author.documents.collect{ |d| d.tags } 
    18                 @tag = @subscriber.subscriptions.collect{ |s| s.document.tags } + user_tags 
    19                 @tag = @tag.flatten.uniq[0..15] 
     15         user = User.find(session[:user]) 
     16                @author = user 
     17                @subscriber = user 
     18 
     19                @tag = user.tags.uniq[0..15] 
    2020        end 
    2121         
    2222        def tags 
    23           @author = User.find(session[:user]) 
    24                 @subscriber = User.find(session[:user]) 
    25           @tag = @subscriber.subscriptions.collect{ |s| s.document.tags } + @author.documents.collect{ |d| d.tags } 
    26                 @tag = @tag.flatten.uniq 
     23          user = User.find(session[:user]) 
     24          @author = user 
     25                @subscriber = user 
     26 
     27                @tag = user.tags.uniq[0..15] 
    2728        end 
    2829         
    2930        def tag 
    30                 @document = User.find(session[:user]).documents.find_by_tag(params[:name], { :limit => 5 }) 
    31                 @subscription = User.find(session[:user]).subscriptions.find_by_tag(params[:name], { :limit => 5 }) 
     31          user = User.find(session[:user]) 
     32 
     33                @document = user.documents.find_by_tag(params[:name], { :limit => 5 }) 
     34                @subscription = user.find_subscriptions(:tag => params[:name], :limit => 5) 
    3235        end 
    3336         
    3437        def find 
    35                 @document = User.find(session[:user]).documents.find_by_keywords(params[:keywords]) 
    36                 @subscription = User.find(session[:user]).subscriptions.find_by_keywords(params[:keywords]) 
     38          user = User.find(session[:user]) 
     39           
     40                @document = user.documents.find_by_keywords(params[:keywords]) 
     41                @subscription = user.find_subscriptions(:keywords => params[:keywords]) 
    3742        end 
    3843         
     
    5257                @user = User.new 
    5358                if request.post? 
    54                         @user = User.authenticate(params[:user]
     59                        @user = User.authenticate(params[:user][:username],params[:user][:password]
    5560                        unless @user.blank? 
    5661                                flash[:success] = "Bienvenue !" 
  • trunk/app/models/document.rb

    r1129 r1130  
    7777   
    7878  def nonsubscribers 
    79         User.find(:all, :conditions => ["id != ? AND confirmed = ?", author.id, true]) - subscribers 
     79    groups = Group.find(:all) 
     80    users = User.find(:all, :conditions => ["id != ? AND confirmed = ?", author.id, true]) 
     81    return groups + users - subscribers 
    8082  end 
    81  
     83   
     84  def match?(keywords) 
     85    title.downcase.match(keywords.downcase) 
     86  end 
     87   
    8288        protected        
    8389        def destroy_tags 
  • trunk/app/models/group.rb

    r1108 r1130  
    22   has_and_belongs_to_many :users 
    33   belongs_to :owner, :class_name => "User", :foreign_key => "owner_id" 
     4    
     5   has_many :subscriptions, :dependent => :destroy, :order => "created_at DESC", :as => "subscriber" 
    46 
    57        validates_uniqueness_of :name, :message => "Ce nom de groupe existe déjà" 
  • trunk/app/models/subscription.rb

    r1129 r1130  
    44        belongs_to :document 
    55         
    6         validates_uniqueness_of :subscriber_id, :scope => [:document_id
     6        validates_uniqueness_of :subscriber_id, :scope => [:document_id, :subscriber_type
    77end 
  • trunk/app/models/user.rb

    r1129 r1130  
    55        has_many :documents, :dependent => :destroy, :order => "updated_at DESC", :foreign_key => "author_id" do 
    66                def find_by_tag(name, options = Hash.new) 
    7                         find_by_sql(["SELECT documents.* FROM documents, tags, documents_tags WHERE documents.id = documents_tags.document_id AND tags.id = documents_tags.tag_id AND documents.author_id = ? AND tags.name = ? OFFSET ? LIMIT ?", @owner.quoted_id, name, options[:offset], options[:limit]]) 
     7            tag = Tag.find_by_name(name) 
     8                  documents = find(:all).delete_if { |d| !d.tags.include?(tag) } 
     9                   
     10          if options[:offset] and options[:limit] 
     11            documents.slice!(options[:offset], options[:limit]) 
     12          end 
     13           
     14          documents 
    815                end 
    916                 
    1017                def find_by_keywords(keywords) 
    11                         find(:all, :conditions => ["title ~* ?", keywords]) 
     18                        find(:all).delete_if { |d| !d.match?(keywords) } 
    1219                end 
    1320        end 
    1421         
    15         has_many :subscriptions, :dependent => :destroy, :order => "created_at DESC", :as => "subscriber" do  
    16                 def find_by_tag(name, options = Hash.new) 
    17                   options[:offset] = 0 if options[:offset] 
    18                         find_by_sql(["SELECT subscriptions.* FROM subscriptions, documents, tags, documents_tags WHERE subscriptions.document_id = documents.id AND documents.id = documents_tags.document_id AND tags.id = documents_tags.tag_id AND subscriptions.subscriber_id = ? AND tags.name = ? OFFSET ? LIMIT ?", @owner.quoted_id, name, options[:offset], options[:limit]]) 
    19                 end 
    20                  
    21                 def find_by_keywords(keywords) 
    22                         find_by_sql(["SELECT subscriptions.* FROM subscriptions, documents WHERE subscriptions.document_id = documents.id AND subscriptions.subscriber_id = ? AND documents.title ~* ?", @owner.quoted_id, keywords]) 
    23                 end 
    24         end 
     22        has_many :subscriptions, :dependent => :destroy, :order => "created_at DESC", :as => "subscriber" 
    2523         
    2624        has_many :podcasts, :dependent => :destroy, :foreign_key => "author_id" 
     
    3634        validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/, :message => "Un email valide pour vous contacter est requis" 
    3735         
     36        def tags 
     37          subscriptions_tags = find_subscriptions.collect{ |s| s.document.tags }.flatten 
     38          documents_tags = documents.collect{ |d| d.tags }.flatten 
     39          (subscriptions_tags + documents_tags).uniq 
     40        end 
     41         
     42        def find_subscriptions(options = Hash.new) 
     43          group_subscriptions = groups.collect{ |group| group.subscriptions }.flatten 
     44          all_subscriptions = self.subscriptions + group_subscriptions 
     45 
     46          sorted_attribute = "created_at" 
     47          all_subscriptions = all_subscriptions.sort_by { |s| s[sorted_attribute] }.reverse 
     48           
     49          if options[:tag] 
     50            tag = Tag.find_by_name(options[:tag]) 
     51          all_subscriptions = all_subscriptions.delete_if { |s| ! s.document.tags.include?(tag) } 
     52        end 
     53         
     54        if options[:keywords] 
     55          puts options[:keywords] 
     56          all_subscriptions = all_subscriptions.delete_if do |s|  
     57            !s.document.match?(options[:keywords]) 
     58          end 
     59        end 
     60 
     61          if options[:offset] and options[:limit] 
     62            return all_subscriptions.slice(options[:offset], options[:limit]) 
     63          end 
     64           
     65          all_subscriptions 
     66        end 
     67         
     68        def find_subscription(id) 
     69          subscription = self.subscriptions.find_by_id(id) 
     70          for group in groups 
     71          subscription = group.subscriptions.find_by_id(id) 
     72          break unless subscription.nil? 
     73          end 
     74          subscription 
     75        end 
     76                 
    3877        def self.digest_password(clear_password) 
    3978        Digest::SHA256.hexdigest(clear_password) 
     
    4483        end 
    4584         
    46         def self.authenticate(attributes) 
    47           username = attributes[:username] 
    48            
     85        def self.authenticate(username, clear_password) 
    4986                user = User.find_by_username(username, :conditions => ["confirmed = ?", true]) 
    50  
     87                 
    5188    if user.blank? 
    5289      logger.debug("unknown or unconfirmed user : #{username}") 
     
    5491    end 
    5592     
    56     if User.digest_password(attributes[:password]) != user.password 
     93    if User.digest_password(clear_password) != user.password 
    5794      logger.debug("wrong password for : #{username}") 
    5895      return nil 
  • trunk/app/views/documents/share.rhtml

    r1128 r1130  
    2222 
    2323<ul id="users"> 
    24  <%= render :partial => "users/users", :object => @document.nonsubscribers, :locals => { :empty => "Déposer ici les utilisateurs qui n'ont pas accÚs à ce document", :draggable => true } %> 
     24 <%= render :partial => "users/people", :object => @document.nonsubscribers, :locals => { :empty => "Reposer ici les utilisateurs qui ne doivent pas avoir accÚs à ce document" } %> 
    2525</ul> 
    2626<%= drop_receiving_element("users", :url => { :controller => "subscriptions", :action => "remove", :document => @document }) %> 
     
    3636<h4>Ont accÚs à ce document :</h4> 
    3737<ul id="subscribers"> 
    38  <%= render :partial => "users/subscribers", :object => @document.subscribers, :locals => { :empty => "Déposer ici les utilisateurs qui ont accÚs à ce document", :draggable => true } %> 
     38 <%= render :partial => "users/people", :object => @document.subscribers, :locals => { :empty => "Déposer ici les utilisateurs qui ont accÚs à ce document", :limit => :none } %> 
    3939</ul> 
    4040<%= drop_receiving_element("subscribers", :url => { :controller => "subscriptions", :action => "add", :document => @document }) %> 
  • trunk/app/views/group/_groups.rhtml

    r1113 r1130  
    2020     
    2121    <ul id="members"> 
    22      <%= render :partial => "users/users", :object => @group.users, :locals => { :empty => "Aucun membre", :draggable => actions } %> 
     22     <%= render :partial => "users/people", :object => @group.users, :locals => { :empty => "Aucun membre", :draggable => actions, :limit => :none } %> 
    2323    </ul> 
    2424    <%= drop_receiving_element("members", :url => { :controller => "group", :action => "add_member", :group => @group }) %> 
     
    2828    <h4>Ne sont pas membres de ce groupe :</h4> 
    2929    <ul id="users"> 
    30      <%= render :partial => "users/users", :object => @group.nonmembers, :locals => { :empty => "Déposer ici les utilisateurs qui ne sont membres de ce groupe", :draggable => actions } %> 
     30     <%= render :partial => "users/people", :object => @group.nonmembers, :locals => { :empty => "Déposer ici les utilisateurs qui ne sont membres de ce groupe", :draggable => actions } %> 
    3131    </ul> 
    3232    <%= drop_receiving_element("users", :url => { :controller => "group", :action => "remove_member", :group => @group }) %> 
  • trunk/app/views/group/update.rjs

    r1108 r1130  
    1 page.replace_html "users", :partial => "users/users", :object => @group.nonmembers, :locals => { :empty => "Déposer ici les utilisateurs qui ne sont membres de ce groupe", :draggable => true
    2 page.replace_html "members", :partial => "users/users", :object => @group.users, :locals => { :empty => "Déposer ici les utilisateurs membres de ce groupe", :draggable => true
     1page.replace_html "users", :partial => "users/people", :object => @group.nonmembers, :locals => { :empty => "Déposer ici les utilisateurs qui ne sont membres de ce groupe"
     2page.replace_html "members", :partial => "users/people", :object => @group.users, :locals => { :empty => "Déposer ici les utilisateurs membres de ce groupe"
  • trunk/app/views/subscriptions/update.rjs

    r1128 r1130  
    1 page.replace_html "users", :partial => "users/users", :object => @subscription.document.nonsubscribers, :locals => { :empty => "Déposer ici les utilisateurs qui n'ont pas accÚs à ce document", :draggable => true
    2 page.replace_html "subscribers", :partial => "users/subscribers", :object => @subscription.document.subscribers, :locals => { :empty => "Déposer ici les utilisateurs qui ont accÚs à ce document", :draggable => true } 
     1page.replace_html "users", :partial => "users/people", :object => @subscription.document.nonsubscribers, :locals => { :empty => "Déposer ici les utilisateurs qui n'ont pas accÚs à ce document"
     2page.replace_html "subscribers", :partial => "users/people", :object => @subscription.document.subscribers, :locals => { :empty => "Déposer ici les utilisateurs qui ont accÚs à ce document", :limit => :none } 
  • trunk/app/views/users/_sidebar.rhtml

    r1120 r1130  
    1111 <li><%= link_to("Ajouter un podcast", :controller => "podcasts", :action => "add") %></li> 
    1212</ul> 
    13 <!-- 
     13 
    1414<ul> 
    1515 <li><%= link_to("Gérer vos groupes", :controller => "group", :action => "manage") %></li> 
    1616 <li><%= link_to("Ajouter un groupe", :controller => "group", :action => "add") %></li> 
    1717</ul> 
    18 --> 
     18 
    1919<h2>Recherchez</h2> 
    2020<% form_tag({:controller => :users, :action => :find }, :id => "search") do %> 
  • trunk/test/unit/user_test.rb

    r1126 r1130  
    22 
    33class UserTest < Test::Unit::TestCase 
    4   fixtures :users 
     4  fixtures :users, :documents 
    55 
    66        def     test_username  
     
    3636                user = users(:elmo) 
    3737                assert ! user.documents.empty? 
    38                 tags = user.documents.collect{ |d| d.tags } 
     38  end 
     39   
     40  def test_authenticate 
     41                user = users(:elmo) 
     42                 
     43                clear_password = "test" 
     44                user.password = clear_password 
     45                user.save 
     46                 
     47    logged_user = User.authenticate(user.username, clear_password) 
     48    assert_not_nil logged_user 
     49 
     50    assert_equal user, logged_user 
    3951  end 
    4052