Merge pull request #39 from rickcarlino/master

May 11th
pull/40/head
Rick Carlino 2014-05-11 15:59:03 -07:00
commit 6a9c003882
10 changed files with 355 additions and 284 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,12 @@
# Because of strong parameters in Rails 4 and the fact that our Devise
# registration form has non-standard user fields (User#name), we need to
# override the Devise::RegistrationsController
# override the Devise::RegistrationsController. If we didn't do this, we would
# not be able to save fields such as 'name' when a user registers for the site.
class RegistrationsController < Devise::RegistrationsController
before_filter :update_sanitized_params, if: :devise_controller?
#See: http://stackoverflow.com/questions/17384289
# /unpermitted-parameters-adding-new-fields-to-devise-in-rails-4-0
def update_sanitized_params
devise_parameter_sanitizer.for(:sign_up) do |user|
user.permit(:name, :email, :password, :password_confirmation)

View File

@ -0,0 +1,6 @@
# FarmbotDevice models all data related to an actual FarmBot in the real world.
# This is useful for caching things like SkyNey IDs, owner users, work logs, etc
class FarmbotDevice
include Mongoid::Document
belongs_to :user
end

View File

@ -1,43 +1,27 @@
class User
include Mongoid::Document
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
## Database authenticatable
field :email, type: String, default: ""
has_many :farmbot_devices, dependent: :destroy
field :name, type: String
validates_uniqueness_of :name
validates_presence_of :name
field :email, type: String, default: ""
validates_uniqueness_of :email
validates_presence_of :email
# BEGIN DEVISE CRAP ==========================================================
devise :database_authenticatable, :registerable, :recoverable, :rememberable,
:trackable, :validatable #, :omniauthable
field :encrypted_password, type: String, default: ""
## Recoverable
field :reset_password_token, type: String
field :reset_password_sent_at, type: Time
## Rememberable
field :remember_created_at, type: Time
## Trackable
field :sign_in_count, type: Integer, default: 0
field :current_sign_in_at, type: Time
field :last_sign_in_at, type: Time
field :current_sign_in_ip, type: String
field :last_sign_in_ip, type: String
## Confirmable
# field :confirmation_token, type: String
# field :confirmed_at, type: Time
# field :confirmation_sent_at, type: Time
# field :unconfirmed_email, type: String # Only if using reconfirmable
## Lockable
# field :failed_attempts, type: Integer, default: 0
# Only if lock strategy is :failed_attempts
# field :unlock_token, type: String
# Only if unlock strategy is :email or :both
# field :locked_at, type: Time
# The username.
field :name, type: String
validates_uniqueness_of :name
validates_presence_of :name
# END DEVISE CRAP ============================================================
end

View File

@ -1,256 +1,264 @@
<ul class="button-group even-4">
<li><a href="#" class="button secondary"> Wed, Aug 21, 2:36 PM <span>74</span></a></li>
<li><a href="#" class="button secondary"> $4.12/day <span>Water </span></a></li>
<li><a href="#" class="button secondary"> $0.73/day <span>Pesticide </span></a></li>
<li><a href="#" class="button secondary"> $1.19/day <span>Fertilizer </span></a></li>
<li><a href="#" class="button secondary"> Wed, Aug 21, 2:36 PM <span>74</span></a>
</li>
<li><a href="#" class="button secondary"> $4.12/day <span>Water </span></a>
</li>
<li><a href="#" class="button secondary"> $0.73/day <span>Pesticide </span></a>
</li>
<li><a href="#" class="button secondary"> $1.19/day <span>Fertilizer </span></a>
</li>
</ul>
<div class="container">
<!-- Side Bar -->
<div class="large-6 columns">
<div class="panel clearfix">
<div class="large-4 columns">
<h6>Farmbot</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel1">Genesis Tracks</a>
<div id="panel1" class="content">
<p>Model: Genesis Tracks v2.6</p>
<p>Length: 36 meters</p>
<p>Width: 2 meters</p>
<p>Height: 18 centimeters</p>
<p>Installation date: 9/6/2013</p>
</div>
</dd>
<dd>
<a href="#panel2">Genesis Gantry</a>
<div id="panel2" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd>
<a href="#panel3">Richmond Cross Slide</a>
<div id="panel3" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel4">Custom Tool Mount</a>
<div id="panel4" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
</div>
<!-- end large-4 -->
<div class="large-4 columns">
<h6>Tools</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel5">Genesis Seed Injector</a>
<div id="panel5" class="content">
</div>
</dd>
<dd class="">
<a href="#panel6">FarmBot Pro Nozzle</a>
<div id="panel6" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd>
<a href="#panel7">Precision Burner</a>
<div id="panel7" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel8">Alain Tiller</a>
<div id="panel8" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
<!-- Side Bar -->
<div class="large-6 columns">
<div class="panel clearfix">
<div class="large-4 columns">
<h6>Farmbot</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel1">Genesis Tracks</a>
<div id="panel1" class="content">
<p>Model: Genesis Tracks v2.6</p>
<p>Length: 36 meters </p>
<p>Width: 2 meters</p>
<p>Height: 18 centimeters</p>
<p>Installation date: 9/6/2013</p>
</div>
<!-- end large-4 -->
<div class="large-4 columns">
<h6>Sensors</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel9">Ambient Temperature</a>
<div id="panel9" class="content">
</div>
</dd>
<dd>
<a href="#panel10">Moisture Meter</a>
<div id="panel10" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel11">Genesis pH</a>
<div id="panel11" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
</div>
<!-- end large-4 -->
</div>
</dd>
<dd>
<a href="#panel2">Genesis Gantry</a>
<div id="panel2" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd>
<a href="#panel3">Richmond Cross Slide</a>
<div id="panel3" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel4">Custom Tool Mount</a>
<div id="panel4" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
</div><!-- end large-4 -->
<div class="large-4 columns">
<h6>Tools</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel5">Genesis Seed Injector</a>
<div id="panel5" class="content">
</div>
</dd>
<dd class="">
<a href="#panel6">FarmBot Pro Nozzle</a>
<div id="panel6" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd>
<a href="#panel7">Precision Burner</a>
<div id="panel7" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel8">Alain Tiller</a>
<div id="panel8" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
</div><!-- end large-4 -->
<div class="large-4 columns">
<h6>Sensors</h6>
<dl class="accordion" data-accordion="">
<dd class="">
<a href="#panel9">Ambient Temperature</a>
<div id="panel9" class="content">
</div>
</dd>
<dd>
<a href="#panel10">Moisture Meter</a>
<div id="panel10" class="content">
Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
<dd class="">
<a href="#panel11">Genesis pH</a>
<div id="panel11" class="content">
Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
</dd>
</dl>
</div><!-- end large-4 -->
</div> <!-- End Panel -->
<div class="panel">
<div class="container clearfix">
<div class="large-4 columns">Gantry (X)</div>
<div class="large-4 columns"><span class="label round success"><i class="fi-plus"></i></span> 46 <span class="label round alert"><i class="fi-minus"></i></span></div>
<div class="large-4 columns">Jog to: </div>
</div>
<br>
<div class="container clearfix">
<div class="large-4 columns">Cross-Slide (Y)</div>
<div class="large-4 columns"><span class="label round success"><i class="fi-plus"></i></span> 46 <span class="label round alert"><i class="fi-minus"></i></span></div>
<div class="large-4 columns">Jog to: </div>
</div>
<br>
<div class="container clearfix">
<div class="large-4 columns">Tool Mount (Z)</div>
<div class="large-4 columns"><span class="label round success"><i class="fi-plus"></i></span> 46 <span class="label round alert"><i class="fi-minus"></i></span></div>
<div class="large-4 columns">Jog to: </div>
</div>
<br><br>
<ul class="button-group even-3">
<li><a href="#" class="button small">Jog to Home</a></li>
<li><a href="#" class="button small">Calibrate</a></li>
<li><a href="#" class="button small alert">Shutdown</a></li>
</ul>
</div> <!-- End Panel -->
<a href="#" data-reveal-id="myModal" data-reveal="">
<div class="panel callout radius">
<h6>View System Information</h6>
</div>
</a>
<!-- End Panel -->
<div class="panel">
<div class="container clearfix">
<div class="large-4 columns">Gantry (X)</div>
<div class="large-4 columns">
<span class="label round success"><i class="fi-plus"></i>
</span>46
<span class="label round alert"><i class="fi-minus"></i>
</span>
</div>
<!-- End Side Bar -->
<div class="large-4 columns">Jog to:</div>
</div>
<br>
<div class="container clearfix">
<div class="large-4 columns">Cross-Slide (Y)</div>
<div class="large-4 columns">
<span class="label round success"><i class="fi-plus"></i>
</span>46
<span class="label round alert"><i class="fi-minus"></i>
</span>
</div>
<div class="large-4 columns">Jog to:</div>
</div>
<br>
<div class="container clearfix">
<div class="large-4 columns">Tool Mount (Z)</div>
<div class="large-4 columns">
<span class="label round success"><i class="fi-plus"></i>
</span>46
<span class="label round alert"><i class="fi-minus"></i>
</span>
</div>
<div class="large-4 columns">Jog to:</div>
</div>
<br>
<br>
<ul class="button-group even-3">
<li><a href="#" class="button small">Jog to Home</a>
</li>
<li><a href="#" class="button small">Calibrate</a>
</li>
<li><a href="#" class="button small alert">Shutdown</a>
</li>
</ul>
</div>
<!-- End Panel -->
<a href="#" data-reveal-id="myModal" data-reveal="">
<div class="panel callout radius">
<h6>View System Information</h6>
</div>
</a>
</div>
<!-- End Side Bar -->
<div id="myModal" class="reveal-modal" data-reveal="" style="display: none; opacity: 1; visibility: hidden; top: -665px;">
<h2>System Information</h2>
<p>Next operation in: 9 minutes (Watering)</p>
<a class="close-reveal-modal">×</a>
</div>
<!-- Thumbnails -->
<div class="large-6 columns">
<div class="panel">
<nav class="top-bar" data-topbar="">
<ul class="title-area">
<li class="name">
<h1><a href="#">Resource Usage</a>
</h1>
</li>
<li class="toggle-topbar menu-icon"><a href="#">Menu</a>
</li>
</ul>
<section class="top-bar-section">
<!-- Right Nav Section -->
<ul class="right">
<li class="has-dropdown not-click">
<a href="#">Plot 1: Nitrogen Fertilizer</a>
<ul class="dropdown">
<li class="title back js-generated">
<h5><a href="javascript:void(0)">Back</a>
</h5>
</li>
<li><a href="#">First link in dropdown</a>
</li>
</ul>
</li>
<li class="has-dropdown not-click">
<a href="#">Plot 2: Water</a>
<ul class="dropdown">
<li class="title back js-generated">
<h5><a href="javascript:void(0)">Back</a>
</h5>
</li>
<li><a href="#">First link in dropdown</a>
</li>
</ul>
</li>
</ul>
</section>
</nav>
<div class="panel-chart">
<img src="http://placehold.it/1000x400&amp;text=Graph">
</div>
</div>
<!-- end panel -->
<div class="panel">
<nav class="top-bar" data-topbar="">
<ul class="title-area">
<li class="name">
<h1><a href="#">Finances</a>
</h1>
</li>
<li class="toggle-topbar menu-icon"><a href="#">Menu</a>
</li>
</ul>
<section class="top-bar-section">
<!-- Right Nav Section -->
<ul class="right">
<li class="has-dropdown not-click">
<a href="#">Plot 1: Revenue</a>
<ul class="dropdown">
<li class="title back js-generated">
<h5><a href="javascript:void(0)">Back</a>
</h5>
</li>
<li><a href="#">First link in dropdown</a>
</li>
</ul>
</li>
<li class="has-dropdown not-click">
<a href="#">Plot 2: Expenditures</a>
<ul class="dropdown">
<li class="title back js-generated">
<h5><a href="javascript:void(0)">Back</a>
</h5>
</li>
<li><a href="#">First link in dropdown</a>
</li>
</ul>
</li>
</ul>
</section>
</nav>
<div class="panel-chart">
<img src="http://placehold.it/1000x400&amp;text=Graph">
</div>
</div>
<!-- end panel -->
</div>
<!-- End Thumbnails -->
<div id="myModal" class="reveal-modal" data-reveal="" style="display: none; opacity: 1; visibility: hidden; top: -665px;">
<h2>System Information</h2>
<p>Next operation in: 9 minutes (Watering)</p>
<a class="close-reveal-modal">×</a>
</div>
<!-- Thumbnails -->
<div class="large-6 columns">
<div class="panel">
<nav class="top-bar" data-topbar="">
<ul class="title-area">
<li class="name">
<h1><a href="#">Resource Usage</a></h1>
</li>
<li class="toggle-topbar menu-icon"><a href="#">Menu</a></li>
</ul>
<section class="top-bar-section">
<!-- Right Nav Section -->
<ul class="right">
<li class="has-dropdown not-click">
<a href="#">Plot 1: Nitrogen Fertilizer</a>
<ul class="dropdown"><li class="title back js-generated"><h5><a href="javascript:void(0)">Back</a></h5></li>
<li><a href="#">First link in dropdown</a></li>
</ul>
</li>
<li class="has-dropdown not-click">
<a href="#">Plot 2: Water</a>
<ul class="dropdown"><li class="title back js-generated"><h5><a href="javascript:void(0)">Back</a></h5></li>
<li><a href="#">First link in dropdown</a></li>
</ul>
</li>
</ul>
</section></nav>
<div class="panel-chart"><img src="http://placehold.it/1000x400&amp;text=Graph"></div>
</div><!-- end panel -->
<div class="panel">
<nav class="top-bar" data-topbar="">
<ul class="title-area">
<li class="name">
<h1><a href="#">Finances</a></h1>
</li>
<li class="toggle-topbar menu-icon"><a href="#">Menu</a></li>
</ul>
<section class="top-bar-section">
<!-- Right Nav Section -->
<ul class="right">
<li class="has-dropdown not-click">
<a href="#">Plot 1: Revenue</a>
<ul class="dropdown"><li class="title back js-generated"><h5><a href="javascript:void(0)">Back</a></h5></li>
<li><a href="#">First link in dropdown</a></li>
</ul>
</li>
<li class="has-dropdown not-click">
<a href="#">Plot 2: Expenditures</a>
<ul class="dropdown"><li class="title back js-generated"><h5><a href="javascript:void(0)">Back</a></h5></li>
<li><a href="#">First link in dropdown</a></li>
</ul>
</li>
</ul>
</section></nav>
<div class="panel-chart"><img src="http://placehold.it/1000x400&amp;text=Graph"></div>
</div><!-- end panel -->
</div><!-- End Thumbnails -->
</div><!-- End Container -->
<!-- End Container -->

View File

@ -0,0 +1,47 @@
.row
.large-12.columns
%h1 Manage FarmBot Device Settings
%form
%fieldset
%legend FarmBot Settings
.row
.large-12.columns
%label Friendly Name
%input{placeholder: "Franny the FarmBot", type: "text"}/
.row
.large-6.columns
%label Skynet UUID
%input{placeholder: "ad698900-2546-11e3-87fb-c560cb0ca47b", type: "text"}/
.large-6.columns
%label Skynet Security Token
%input{placeholder: "4bbd2jm242dl5wmimbwz4rvlu77m0a4i", type: "text"}/
.row
.large-12.columns
%button.button
%i.fi-check{style: 'font-size: 18px;'}
Store Settings
%table
%thead
%tr
%th{width: '90%'} Friendly Name
%th{width: '5%'} Delete
%th{width: '5%'} Edit
%tbody
%tr
%td
Franny the Farmbot
%td
%button.tiny.alert.button
%i.fi-x{style: 'font-size: 18px;'}
%td
%button.tiny.button
%i.fi-wrench{style: 'font-size: 18px;'}
%tr
%td
The Cabbage Patch Kid
%td
%button.tiny.alert.button
%i.fi-x{style: 'font-size: 18px;'}
%td
%button.tiny.button
%i.fi-wrench{style: 'font-size: 18px;'}

View File

@ -1,4 +0,0 @@
<ul>
<li><%= link_to 'New User', new_user_registration_path %></li>
<li><%= link_to 'Edit Settings', edit_user_registration_path %></li>
</ul>

View File

@ -0,0 +1,6 @@
# Read about factories at https://github.com/thoughtbot/factory_girl
FactoryGirl.define do
factory :farmbot_device do
end
end

View File

@ -0,0 +1,22 @@
require 'spec_helper'
describe FarmbotDevice do
let(:user) { FactoryGirl.create(:user) }
let(:device){ FactoryGirl.create(:farmbot_device, user: user)}
it 'is associated with a user' do
expect(device.user).to be_kind_of(User)
expect(user.farmbot_devices).to be_kind_of(Array)
expect(user.farmbot_devices.first).to be_kind_of(FarmbotDevice)
end
it 'destroys dependant devices' do
bot_id = device.id
user_id = user.id
user.destroy
user_results = User.where(id: user_id).first
bot_results = FarmbotDevice.where(id: bot_id).first
expect(bot_results).to be_nil
expect(user_results).to be_nil
end
end