56 lines
2.0 KiB
Ruby
56 lines
2.0 KiB
Ruby
# Farmbot Device models all data related to an actual FarmBot in the real world.
|
|
class Device < ApplicationRecord
|
|
DEFAULT_MAX_LOGS = 100
|
|
DEFAULT_MAX_IMAGES = 100
|
|
TIMEZONES = TZInfo::Timezone.all_identifiers
|
|
BAD_TZ = "%{value} is not a valid timezone"
|
|
|
|
has_many :users
|
|
has_many :farm_events, dependent: :destroy
|
|
has_many :points, dependent: :destroy
|
|
has_many :logs, dependent: :destroy
|
|
has_many :sequences, dependent: :destroy
|
|
has_many :regimens, dependent: :destroy
|
|
has_many :peripherals, dependent: :destroy
|
|
has_many :tools, dependent: :destroy
|
|
has_many :images, dependent: :destroy
|
|
has_many :webcam_feeds, dependent: :destroy
|
|
has_many :sensor_readings, dependent: :destroy
|
|
validates :timezone, inclusion: { in: TIMEZONES,
|
|
message: BAD_TZ,
|
|
allow_nil: true }
|
|
validates_presence_of :name
|
|
[FbosConfig, FirmwareConfig, WebAppConfig].map do |klass|
|
|
name = klass.table_name.singularize.to_sym
|
|
has_one name, dependent: :destroy
|
|
define_method(name) { super() || klass.create!(device: self) }
|
|
end
|
|
# Give the user back the amount of logs they are allowed to view.
|
|
def limited_log_list
|
|
logs.all.last(max_log_count || DEFAULT_MAX_LOGS)
|
|
end
|
|
|
|
def self.current
|
|
RequestStore.store[:device]
|
|
end
|
|
|
|
def self.current=(dev)
|
|
RequestStore.store[:device] = dev
|
|
end
|
|
|
|
# Sets Device.current to `self` and returns it to the previous value when
|
|
# finished running block. Usually this is unecessary, but may be required in
|
|
# background jobs. If you are not receiving auto_sync data on your client,
|
|
# you probably need to use this method.
|
|
def auto_sync_transaction
|
|
prev = Device.current
|
|
Device.current = self
|
|
yield
|
|
Device.current = prev
|
|
end
|
|
|
|
def tz_offset_hrs
|
|
Time.now.in_time_zone(self.timezone || "UTC").utc_offset / 1.hour
|
|
end
|
|
end
|