class AdminsController < Admin::AdminController use_bootstrap_for :user_search, :weekly_user_stats, :stats, :correlations def user_search if params[:admins_controller_user_search] search_params = params.require(:admins_controller_user_search) .permit(:username, :email, :guid, :under13) @search = UserSearch.new(search_params) @users = @search.perform end @search ||= UserSearch.new @users ||= [] end def admin_inviter inviter = InvitationCode.default_inviter_or(current_user) email = params[:identifier] user = User.find_by_email(email) unless user EmailInviter.new(email, inviter).send! flash[:notice] = "invitation sent to #{email}" else flash[:notice]= "error sending invite to #{email}" end redirect_to user_search_path, :notice => flash[:notice] end def add_invites InvitationCode.find_by_token(params[:invite_code_id]).add_invites! redirect_to user_search_path end def weekly_user_stats @created_users_by_week = Hash.new{ |h,k| h[k] = [] } @created_users = User.where("username IS NOT NULL and created_at IS NOT NULL") @created_users.find_each do |u| week = u.created_at.beginning_of_week.strftime("%Y-%m-%d") @created_users_by_week[week] << u.username end @selected_week = params[:week] || @created_users_by_week.keys.first @counter = @created_users_by_week[@selected_week].count end def stats @popular_tags = ActsAsTaggableOn::Tagging.joins(:tag).limit(50).count(:group => :tag, :order => 'count(taggings.id) DESC') case params[:range] when "week" range = 1.week @segment = t('admins.stats.week') when "2weeks" range = 2.weeks @segment = t('admins.stats.2weeks') when "month" range = 1.month @segment = t('admins.stats.month') else range = 1.day @segment = t('admins.stats.daily') end [Post, Comment, AspectMembership, User].each do |model| create_hash(model, :range => range) end @posts_per_day = Post.count(:group => "DATE(created_at)", :conditions => ["created_at >= ?", Date.today - 21.days], :order => "DATE(created_at) ASC") @most_posts_within = @posts_per_day.values.max.to_f @user_count = User.count #@posts[:new_public] = Post.where(:type => ['StatusMessage','ActivityStreams::Photo'], # :public => true).order('created_at DESC').limit(15).all end def correlations @correlations_hash = Statistics.new.generate_correlations end private def percent_change(today, yesterday) sprintf( "%0.02f", ((today-yesterday) / yesterday.to_f)*100).to_f end def create_hash(model, opts={}) opts[:range] ||= 1.day plural = model.to_s.underscore.pluralize eval(<<DATA @#{plural} = { :day_before => #{model}.where(:created_at => ((Time.now.midnight - #{opts[:range]*2})..Time.now.midnight - #{opts[:range]})).count, :yesterday => #{model}.where(:created_at => ((Time.now.midnight - #{opts[:range]})..Time.now.midnight)).count } @#{plural}[:change] = percent_change(@#{plural}[:yesterday], @#{plural}[:day_before]) DATA ) end # TODO action needed after rails4 update class UserSearch #include ActiveModel::Model # rails4 include ActiveModel::Conversion include ActiveModel::Validations include ActiveModel::MassAssignmentSecurity attr_accessor :username, :email, :guid, :under13 validate :any_searchfield_present? def initialize(attributes={}) assign_attributes(attributes) yield(self) if block_given? end def assign_attributes(values, options={}) sanitize_for_mass_assignment(values, options[:as]).each do |k, v| send("#{k}=", v) end end # TODO remove this once ActiveModel is included def persisted? false end def any_searchfield_present? if %w(username email guid under13).all? { |attr| self.send(attr).blank? } errors.add :base, "no fields for search set" end end def perform #return User.none unless valid? # rails4 return [] unless valid? users = User.arel_table people = Person.arel_table profiles = Profile.arel_table res = User.joins(person: :profile) res = res.where(users[:username].matches("%#{username}%")) unless username.blank? res = res.where(users[:email].matches("%#{email}%")) unless email.blank? res = res.where(people[:guid].matches("%#{guid}%")) unless guid.blank? res = res.where(profiles[:birthday].gt(Date.today-13.years)) if under13 == '1' res end end end