codn/adminpanel

View on GitHub
lib/tasks/adminpanel/adminpanel.rake

Summary

Maintainability
Test Coverage
namespace :adminpanel do
  desc 'Interact with adminpanel models :D'

  task :section, [:name, :section, :type] => :environment do |t, args|
    args.with_defaults(:section => "home", :name => "greeting", :type => "")
    puts "Creating #{args[:name]} in #{args[:section]} section" unless Rails.env.test?
    page_name = args[:section].capitalize
    order = Adminpanel::Section.find_by(:page => page_name)

    s = Adminpanel::Section.new(
      name: args[:name].titleize,
      has_description: false,
      description: "",
      key: (args[:name].downcase.tr(' ','_')),
      page: page_name,
      has_image: false
    )

    if order.nil?
      s.order = Adminpanel::Section.count + 1
    else
      s.order = order.order
    end

    args[:type].split(" ").each do |type|
      case type
        when "wysiwyg" || "description"
          s.has_description = true
        when "images"
          s.has_image = true
      end
    end
    s.save
  end

  task user: :environment do |t|
    characters = []
    characters.concat(("a".."z").to_a)
    characters.concat(("A".."Z").to_a)
    characters.concat((0..9).to_a)
    characters.concat(%w[! @ \# $ % ^ & * , _ - + =])
    password = ''
    8.times do
      password = password + "#{characters.sample}"
    end
    puts "Creating/overwriting webmaster@codn.mx with password #{password}" unless Rails.env.test?
    user = Adminpanel::User.find_by_email('webmaster@codn.mx')
    if !user.nil?
      user.delete
    end

    role = Adminpanel::Role.find_by_name('Admin')
    if role.nil?
      role = Adminpanel::Role.new(name: 'Admin')
      role.save
    end
    Adminpanel::User.new(
      email: 'webmaster@codn.mx',
      name: 'Webmaster',
      password: password,
      password_confirmation: password,
      role_id: role.id
    ).save
  end

  task :populate, [:times, :model, :attributes] => :environment do |t, args|
    require 'faker'
    I18n.reload!
    puts "Generating #{args[:times]} records of #{args[:model]}" unless Rails.env.test?

    @model = "adminpanel/#{args[:model]}".classify.constantize

    attributes = args[:attributes].split(" ")

    args[:times].to_i.times do |time|
      instance = @model.new
      attributes.each do |attribute|
        field = attribute.split(":").first
        type = attribute.split(":").second

        case type
          when 'name' #generate a name
            value = Faker::Name.name

          when 'category' || 'category_name' #generate a category name
            value = Faker::Commerce.product_name

          when 'lorem' || 'description' #large paragraph.
            value = Faker::Lorem.paragraph([*1..10].sample)

          when 'number' #generate a number
            value = [*1..7000].sample

          when 'url' #generate an url
            value = Faker::Internet.url
          when 'id' #assign field_id it to a random instance of Adminpanel::field
            field = field.downcase.singularize
            value = "adminpanel/#{field}".classify.constantize.order('RAND()').first.id
            field = "#{field}_id"

          when 'email' #generates a random email
            value = Faker::Internet.email

          when 'lat_mid' #latitude for merida, yucatan, mx.
            value = float_random(21.046929, 20.903954)
          when 'lng_mid' #longitude for merida, yucatan, mx.
            value = float_random(-89.699819, -89.567296)

          when 'lat'
            value = Faker::Address.latitude
          when 'lng'
            value = Faker::Address.longitude

          when 'image' || 'images'
            3.times do
              instance.send("#{@model.name.demodulize.downcase}files").build
            end
          else #no type || not found
            value = Faker::Lorem.words([*1..6].sample).join(' ') #lorem random short sentence

        end

        if(type != 'image')
          instance.send("#{field}=", value)
        end
      end

      instance.save(:validate => false)

      change_dates(instance)
    end

  end
end

private

  def change_dates(instance)
    date = rand(Date.parse('2010-01-01')..Date.today)
    instance.update_attribute(:created_at, date)
    instance.update_attribute(:updated_at, date)
  end

  def float_random(min_number, max_number)
    width = max_number - min_number
    return (rand*width) + min_number
  end