84 lines
3.3 KiB
Ruby
84 lines
3.3 KiB
Ruby
module Foodsoft
|
|
# Variable expansions for user-specified texts.
|
|
#
|
|
# This is used in wiki-pages and the footer, for example, to allow foodcoops
|
|
# to show dynamic information in the text.
|
|
#
|
|
# Plugins can modify the variables by means of the `#variables` accessor.
|
|
# Please be thoughful when choosing names as to avoid collisions.
|
|
# Do not put non-public info in variables.
|
|
module ExpansionVariables
|
|
ACTIVE_MONTHS = 3
|
|
|
|
# @return [Hash] Variables and their values
|
|
cattr_accessor :variables
|
|
|
|
# Hash of variables. Note that keys are Strings.
|
|
@@variables = {
|
|
'scope' => -> { FoodsoftConfig.scope },
|
|
'name' => -> { FoodsoftConfig[:name] },
|
|
'contact.street' => -> { FoodsoftConfig[:contact][:street] },
|
|
'contact.zip_code' => -> { FoodsoftConfig[:contact][:zip_code] },
|
|
'contact.city' => -> { FoodsoftConfig[:contact][:city] },
|
|
'contact.country' => -> { FoodsoftConfig[:contact][:country] },
|
|
'contact.email' => -> { FoodsoftConfig[:contact][:email] },
|
|
'contact.phone' => -> { FoodsoftConfig[:contact][:phone] },
|
|
'price_markup' => -> { FoodsoftConfig[:price_markup] },
|
|
'homepage' => -> { FoodsoftConfig[:homepage] },
|
|
|
|
'help_url' => -> { FoodsoftConfig[:help_url] },
|
|
'applepear_url' => -> { FoodsoftConfig[:applepear_url] },
|
|
|
|
'foodsoft.url' => -> { FoodsoftConfig[:foodsoft_url] },
|
|
'foodsoft.version' => Foodsoft::VERSION,
|
|
'foodsoft.revision' => Foodsoft::REVISION,
|
|
|
|
'user_count' => -> { User.undeleted.count },
|
|
'ordergroup_count' => -> { Ordergroup.undeleted.count },
|
|
'active_ordergroup_count' => -> { active_ordergroup_count },
|
|
'supplier_count' => -> { Supplier.undeleted.count },
|
|
'active_supplier_count' => -> { active_supplier_count },
|
|
'active_suppliers' => -> { active_suppliers },
|
|
'first_order_date' => -> { I18n.l Order.first.try { |o| o.starts.to_date } }
|
|
}
|
|
|
|
# Return expanded variable
|
|
# @return [String] Expanded variable
|
|
def self.get(var)
|
|
s = @@variables[var.to_s]
|
|
s.respond_to?(:call) ? s.call : s.to_s
|
|
end
|
|
|
|
# Expand variables in a string
|
|
# @param str [String] String to expand variables in
|
|
# @param options [Hash<String, String>] Extra variables to expand
|
|
# @return [String] Expanded string
|
|
def self.expand(str, options = {})
|
|
str.gsub(/{{([._a-zA-Z0-9]+)}}/) do
|
|
options[::Regexp.last_match(1)] || self.get(::Regexp.last_match(1))
|
|
end
|
|
end
|
|
|
|
# @return [Number] Number of ordergroups that have been active in the past 3 months
|
|
def self.active_ordergroup_count
|
|
GroupOrder
|
|
.where('updated_on > ?', ACTIVE_MONTHS.months.ago)
|
|
.select(:ordergroup_id).distinct.count
|
|
end
|
|
|
|
# @return [Number] Number of suppliers that has been ordered from in the past 3 months
|
|
def self.active_supplier_count
|
|
Order
|
|
.where('starts > ?', ACTIVE_MONTHS.months.ago)
|
|
.select(:supplier_id).distinct.count
|
|
end
|
|
|
|
# @return [String] Comma-separated list of suppliers that has been ordered from in the past 3 months
|
|
def self.active_suppliers
|
|
Supplier.joins(:orders)
|
|
.where('orders.starts > ?', ACTIVE_MONTHS.months.ago)
|
|
.order(:name).select(:name).distinct
|
|
.map(&:name).join(', ')
|
|
end
|
|
end
|
|
end
|