diff --git a/app/controllers/cards_controller.rb b/app/controllers/cards_controller.rb index e270692..fa00f01 100644 --- a/app/controllers/cards_controller.rb +++ b/app/controllers/cards_controller.rb @@ -10,12 +10,16 @@ class CardsController < ApplicationController @cards = @cards.sort_by{|e| e[:id]} if can? :read, DoorLog then + Rails.logger.info "CARD STATS:" most_active_count = 0 @most_active_card = nil @cards.each do |card| card_num_R = card.card_number.to_i(16)%32767 - card[:accesses_this_week] = DoorLog.where('key = "R" AND data =? AND created_at > ?', card_num_R, DateTime.now - 7.days).order("created_at DESC").count + Rails.logger.info card_num_R + card[:accesses_this_week] = DoorLog.where('key = "G" AND data =? AND created_at > ?', card_num_R, DateTime.now - 7.days).order("created_at DESC").count + Rails.logger.info card[:accesses_this_week] if(card[:accesses_this_week] > most_active_count) then + Rails.logger.info "ACTIVE" most_active_count = card[:accesses_this_week] @most_active_card = card end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 7a6571b..02cfc23 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -43,6 +43,14 @@ class UsersController < ApplicationController end end + # GET /user_summary/1 + def user_summary + respond_to do |format| + format.html { render :partial => "user_summary" } # show.html.erb + format.json { render :json => @user } + end + end + # GET /users/new # GET /users/new.json def new @@ -84,6 +92,37 @@ class UsersController < ApplicationController end end + # GET /users/merge + def merge_view + @users = @users.sort_by(&:name) + + respond_to do |format| + format.html # merge_view.html.erb + end + end + + # POST /users/merge + def merge_action + @user_to_keep = User.find(params[:user][:to_keep]) + Rails.logger.info "USER TO KEEP:" + Rails.logger.info @user_to_keep.inspect + @user_to_merge = User.find(params[:user][:to_merge]) + Rails.logger.info "USER TO MERGE:" + Rails.logger.info @user_to_merge.inspect + + @user_to_keep.absorb_user(@user_to_merge) + + Rails.logger.info "RESULT:" + Rails.logger.info @user_to_keep.inspect + Rails.logger.info @user_to_keep.cards.inspect + Rails.logger.info @user_to_keep.user_certifications.inspect + Rails.logger.info @user_to_keep.payments.inspect + + respond_to do |format| + format.html { redirect_to @user_to_keep, :notice => 'Users successfully merged.' } + end + end + # DELETE /users/1 # DELETE /users/1.json def destroy diff --git a/app/models/ability.rb b/app/models/ability.rb index 5bb255e..70c3ee7 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -40,8 +40,8 @@ class Ability end # Prevent all destruction for now - cannot :destroy, User - cannot :destroy, Card + #cannot :destroy, User + #cannot :destroy, Card cannot :destroy, Certification cannot :destroy, Mac cannot :destroy, MacLog diff --git a/app/models/user.rb b/app/models/user.rb index b12a900..512a0aa 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -18,6 +18,48 @@ class User < ActiveRecord::Base after_create :send_new_user_email + def absorb_user(user_to_absorb) + # copy all attributes except email, password, name, and anything that isn't blank on the destination + user_to_absorb.attributes.each_pair {|k,v| + unless (v.nil? || k == :id || k == :email || k == :password || k == :name || k == :password_confirmation || k == :hidden || k == 'hidden' || k == :encrypted_password || !self.attributes[k].blank? ) + Rails.logger.info "Updating "+k.to_s+" from "+self[k].to_s + self[k] = v + Rails.logger.info "Updated "+k.to_s+" to "+self[k].to_s + end + } + + self.save! + + user_to_absorb.cards.each {|card| + Rails.logger.info "CARD BEFORE: "+card.inspect + card.user_id = self.id + card.save! + Rails.logger.info "CARD AFTER: "+card.inspect + } + user_to_absorb.user_certifications.each {|user_cert| + Rails.logger.info "CERT BEFORE: "+user_cert.inspect + user_cert.user_id = self.id + user_cert.save! + Rails.logger.info "CERT AFTER: "+user_cert.inspect + } + user_to_absorb.payments.each {|payment| + Rails.logger.info "PAYMENT BEFORE: "+payment.inspect + payment.user_id = self.id + payment.save! + Rails.logger.info "PAYMENT AFTER: "+payment.inspect + } + + user_to_absorb.destroy + end + + def name_with_email_and_visibility + if hidden then + "#{name} (#{email}) HIDDEN" + else + "#{name} (#{email})" + end + end + def name_with_payee_and_member_level if payee.blank? then "#{name} - #{member_level_string}" diff --git a/app/views/cards/index.html.erb b/app/views/cards/index.html.erb index 239c920..02543db 100644 --- a/app/views/cards/index.html.erb +++ b/app/views/cards/index.html.erb @@ -28,7 +28,13 @@ <% if !@cards.blank? %> <% @cards.each do |card| %> - <%= link_to card.user.name, card %> + + <% if card.user.nil? %> + n/a + <% else %> + <%= link_to card.user.name , card %> + <% end %> + <%= card.name %> <%= card.id %> <%= card.card_number %> diff --git a/app/views/users/_user_summary.html.erb b/app/views/users/_user_summary.html.erb new file mode 100644 index 0000000..93e04cd --- /dev/null +++ b/app/views/users/_user_summary.html.erb @@ -0,0 +1,95 @@ +<% user ||= @user #unless @user.blank? %> + +

+ Name: + <%= user.name %> +

+ +<% if current_user.admin? then %> +

+ Email: + <%= user.email %> +

+ +

+ Orientation? + <%= user.orientation.strftime("%B %d %Y") unless user.orientation.blank? %> +

+<% end %> + +

+ Waiver? + <%= user.waiver.strftime("%B %d %Y") unless user.waiver.blank? %> +

+ +

+ Current Member? + <%= raw(user.member_status_symbol) %> +

+ +<% if current_user.admin? then %> +

+ Desired Member Level: + <%= user.member_level %> +

+

+ Payment Method: + <%= user.payment_method %> +

+

+ Payee: + <%= user.payee %> +

+

+ Phone: + <%= user.phone %> +

+<% end %> +

+ Current Skills: + <%= simple_format user.current_skills %> +

+

+ Desired Skills: + <%= simple_format user.desired_skills %> +

+

+ Card: + <% if current_user.admin? then %> + <% user.cards.each do |c| %> + <%= link_to c.card_number, c %><%= "," unless c == user.cards.last %> + <% end %> + <% else %> + <%= unless user.cards.blank? then raw("✓") end %> + <% end %> +

+ +Certifications: + + +<% if current_user.admin? then %> +

+ Payments: +

+

+<% end %> + +<% if current_user.admin? then %> +

+ Created: + <%= user.created_at %> +

+

+ Last signed in: + <%= user.current_sign_in_at %> +

+<% end %> diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 6962171..19a48e2 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -3,6 +3,9 @@ <% if can? :create, User %> <%= link_to 'New User', new_user_path %> <% end %> +<% if can? :manage, User %> + | <%= link_to 'Merge Users', users_merge_path %> +<% end %> diff --git a/app/views/users/merge_view.html.erb b/app/views/users/merge_view.html.erb new file mode 100644 index 0000000..b4e5522 --- /dev/null +++ b/app/views/users/merge_view.html.erb @@ -0,0 +1,48 @@ + + +

Merging users

+ +<%= form_tag('/users/merge', :method => :post) do %> +Everything except the email, password, name, id, hidden, and blank values will be moved to the "user to keep" UNLESS there is a value already there. The "user to merge" will be deleted. +
+ + + + + +
+
+ <%= label_tag :user_to_keep, "User to Keep" %>
+ <%= collection_select(:user, :to_keep, @users, :id, :name_with_email_and_visibility, :include_blank => true) %> +
+
+
◀◀ +
+ <%= label_tag :user_to_merge, "User to Merge" %>
+ <%= collection_select(:user, :to_merge, @users, :id, :name_with_email_and_visibility, :include_blank => true) %> +
+
+
+ +
+
+ <%= submit_tag "Merge" %> +
+<% end %> + +<%= link_to 'Back', users_path %> + + diff --git a/config/routes.rb b/config/routes.rb index 606152a..518a30a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,6 +18,9 @@ Dooraccess::Application.routes.draw do end end + match 'user_summary/:id' => 'users#user_summary' # User summary view + match 'users/merge' => 'users#merge_view', :via => :get # Merge view + match 'users/merge' => 'users#merge_action', :via => :post # Merge action resources :users match 'users/create' => 'users#create', :via => :post # Use POST users/create instead of POST users to avoid devise conflict