mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-26 05:55:15 +00:00
Merge branch 'master' into 2-0-stable-oct
This commit is contained in:
@@ -42,7 +42,7 @@ module Discourse
|
||||
if BOOLS.include? k
|
||||
val = ["true", "false"].include?(val) ? val == "true" : nil
|
||||
end
|
||||
sso.send("#{k}=", val)
|
||||
sso.public_send("#{k}=", val)
|
||||
end
|
||||
|
||||
decoded_hash.each do |k,v|
|
||||
@@ -87,9 +87,9 @@ module Discourse
|
||||
def unsigned_payload
|
||||
payload = {}
|
||||
ACCESSORS.each do |k|
|
||||
next if (val = send k) == nil
|
||||
next if (val = public_send k) == nil
|
||||
|
||||
payload[k] = val
|
||||
payload[k] = val
|
||||
end
|
||||
|
||||
if @custom_fields
|
||||
|
||||
@@ -12,7 +12,7 @@ module OpenFoodNetwork
|
||||
args.each do |arg|
|
||||
type = types[arg.class]
|
||||
next unless type
|
||||
send("#{type}=", arg)
|
||||
public_send("#{type}=", arg)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -24,16 +24,6 @@ module OpenFoodNetwork
|
||||
customer_preferred_ship_address || user_preferred_ship_address || fallback_ship_address
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def types
|
||||
{
|
||||
String => "email",
|
||||
Customer => "customer",
|
||||
Spree::User => "user"
|
||||
}
|
||||
end
|
||||
|
||||
def email=(arg)
|
||||
@email ||= arg
|
||||
end
|
||||
@@ -46,6 +36,16 @@ module OpenFoodNetwork
|
||||
@user ||= arg
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def types
|
||||
{
|
||||
String => "email",
|
||||
Customer => "customer",
|
||||
Spree::User => "user"
|
||||
}
|
||||
end
|
||||
|
||||
def customer_preferred_bill_address
|
||||
customer.andand.bill_address
|
||||
end
|
||||
|
||||
@@ -58,6 +58,41 @@ module OpenFoodNetwork
|
||||
end
|
||||
end
|
||||
|
||||
def per_item_enterprise_fee_applicators_for(variant)
|
||||
fees = []
|
||||
|
||||
return [] unless @order_cycle && @distributor
|
||||
|
||||
@order_cycle.exchanges_carrying(variant, @distributor).each do |exchange|
|
||||
exchange.enterprise_fees.per_item.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, variant, exchange.role)
|
||||
end
|
||||
end
|
||||
|
||||
@order_cycle.coordinator_fees.per_item.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, variant, 'coordinator')
|
||||
end
|
||||
|
||||
fees
|
||||
end
|
||||
|
||||
def per_order_enterprise_fee_applicators_for(order)
|
||||
fees = []
|
||||
|
||||
return fees unless @order_cycle && order.distributor
|
||||
|
||||
@order_cycle.exchanges_supplying(order).each do |exchange|
|
||||
exchange.enterprise_fees.per_order.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, nil, exchange.role)
|
||||
end
|
||||
end
|
||||
|
||||
@order_cycle.coordinator_fees.per_order.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, nil, 'coordinator')
|
||||
end
|
||||
|
||||
fees
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -104,41 +139,5 @@ module OpenFoodNetwork
|
||||
line_item = OpenStruct.new variant: variant, quantity: 1, price: variant.price, amount: variant.price
|
||||
enterprise_fee.compute_amount(line_item)
|
||||
end
|
||||
|
||||
def per_item_enterprise_fee_applicators_for(variant)
|
||||
fees = []
|
||||
|
||||
return [] unless @order_cycle && @distributor
|
||||
|
||||
@order_cycle.exchanges_carrying(variant, @distributor).each do |exchange|
|
||||
exchange.enterprise_fees.per_item.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, variant, exchange.role)
|
||||
end
|
||||
end
|
||||
|
||||
@order_cycle.coordinator_fees.per_item.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, variant, 'coordinator')
|
||||
end
|
||||
|
||||
fees
|
||||
end
|
||||
|
||||
def per_order_enterprise_fee_applicators_for(order)
|
||||
fees = []
|
||||
|
||||
return fees unless @order_cycle && order.distributor
|
||||
|
||||
@order_cycle.exchanges_supplying(order).each do |exchange|
|
||||
exchange.enterprise_fees.per_order.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, nil, exchange.role)
|
||||
end
|
||||
end
|
||||
|
||||
@order_cycle.coordinator_fees.per_order.each do |enterprise_fee|
|
||||
fees << OpenFoodNetwork::EnterpriseFeeApplicator.new(enterprise_fee, nil, 'coordinator')
|
||||
end
|
||||
|
||||
fees
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
13
lib/open_food_network/error_logger.rb
Normal file
13
lib/open_food_network/error_logger.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
# Our error logging API currently wraps Bugsnag.
|
||||
# It makes us more flexible if we wanted to replace Bugsnag or change logging
|
||||
# behaviour.
|
||||
module OpenFoodNetwork
|
||||
module ErrorLogger
|
||||
# Tries to escalate the error to a developer.
|
||||
# If Bugsnag is configured, it will notify it. It would be nice to implement
|
||||
# some kind of fallback.
|
||||
def self.notify(error)
|
||||
Bugsnag.notify(error)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -4,18 +4,18 @@
|
||||
module OpenFoodNetwork
|
||||
module Paperclippable
|
||||
def self.included(base)
|
||||
base.send :extend, ActiveModel::Naming
|
||||
base.send :extend, ActiveModel::Callbacks
|
||||
base.send :include, ActiveModel::Validations
|
||||
base.send :include, Paperclip::Glue
|
||||
base.extend(ActiveModel::Naming)
|
||||
base.extend(ActiveModel::Callbacks)
|
||||
base.include(ActiveModel::Validations)
|
||||
base.include(Paperclip::Glue)
|
||||
|
||||
# Paperclip required callbacks
|
||||
base.send :define_model_callbacks, :save, only: [:after]
|
||||
base.send :define_model_callbacks, :commit, only: [:after]
|
||||
base.send :define_model_callbacks, :destroy, only: [:before, :after]
|
||||
base.define_model_callbacks(:save, only: [:after])
|
||||
base.define_model_callbacks(:commit, only: [:after])
|
||||
base.define_model_callbacks(:destroy, only: [:before, :after])
|
||||
|
||||
# Initialise an ID
|
||||
base.send :attr_accessor, :id
|
||||
base.__send__(:attr_accessor, :id)
|
||||
base.instance_variable_set :@id, 1
|
||||
end
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'open_food_network/scope_variant_to_hub'
|
||||
|
||||
module OpenFoodNetwork
|
||||
class ProductsAndInventoryReportBase
|
||||
attr_reader :params
|
||||
|
||||
@@ -17,31 +17,26 @@
|
||||
module OpenFoodNetwork
|
||||
class ProductsCacheRefreshment
|
||||
def self.refresh(distributor, order_cycle)
|
||||
unless pending_job? distributor, order_cycle
|
||||
enqueue_job distributor, order_cycle
|
||||
end
|
||||
job = refresh_job(distributor, order_cycle)
|
||||
enqueue_job(job) unless pending_job?(job)
|
||||
end
|
||||
|
||||
def self.refresh_job(distributor, order_cycle)
|
||||
RefreshProductsCacheJob.new(distributor.id, order_cycle.id)
|
||||
end
|
||||
private_class_method :refresh_job
|
||||
|
||||
private
|
||||
|
||||
def self.pending_job?(distributor, order_cycle)
|
||||
# To inspect each job, we need to deserialize the payload.
|
||||
# This is slow, and if it's a problem in practice, we could pre-filter in SQL
|
||||
# for handlers matching the class name, distributor id and order cycle id.
|
||||
|
||||
def self.pending_job?(job)
|
||||
Delayed::Job.
|
||||
where(locked_at: nil).
|
||||
map(&:payload_object).
|
||||
select { |j|
|
||||
j.class == RefreshProductsCacheJob &&
|
||||
j.distributor_id == distributor.id &&
|
||||
j.order_cycle_id == order_cycle.id
|
||||
}.any?
|
||||
where(handler: job.to_yaml).
|
||||
exists?
|
||||
end
|
||||
private_class_method :pending_job?
|
||||
|
||||
def self.enqueue_job(distributor, order_cycle)
|
||||
Delayed::Job.enqueue RefreshProductsCacheJob.new(distributor.id, order_cycle.id), priority: 10
|
||||
def self.enqueue_job(job)
|
||||
Delayed::Job.enqueue job, priority: 10
|
||||
end
|
||||
private_class_method :enqueue_job
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,7 +8,7 @@ module OpenFoodNetwork
|
||||
end
|
||||
|
||||
def scope(product)
|
||||
product.send :extend, OpenFoodNetwork::ScopeProductToHub::ScopeProductToHub
|
||||
product.extend(OpenFoodNetwork::ScopeProductToHub::ScopeProductToHub)
|
||||
product.instance_variable_set :@hub, @hub
|
||||
product.instance_variable_set :@variant_overrides, @variant_overrides
|
||||
end
|
||||
|
||||
@@ -6,7 +6,7 @@ module OpenFoodNetwork
|
||||
end
|
||||
|
||||
def scope(variant)
|
||||
variant.send :extend, OpenFoodNetwork::ScopeVariantToHub::ScopeVariantToHub
|
||||
variant.extend(OpenFoodNetwork::ScopeVariantToHub::ScopeVariantToHub)
|
||||
variant.instance_variable_set :@hub, @hub
|
||||
variant.instance_variable_set :@variant_override, @variant_overrides[variant]
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'open_food_network/scope_variant_to_hub'
|
||||
|
||||
# Used to return a set of variants which match the criteria provided
|
||||
# A query string is required, which will be match to the name and/or SKU of a product
|
||||
# Further restrictions on the schedule, order_cycle or distributor through which the
|
||||
|
||||
@@ -24,6 +24,11 @@ module OpenFoodNetwork
|
||||
end
|
||||
end
|
||||
|
||||
def rules
|
||||
return @rules unless @rules.nil?
|
||||
@rules = rule_class.prioritised.for(enterprise)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def reject?(element)
|
||||
@@ -38,11 +43,6 @@ module OpenFoodNetwork
|
||||
false
|
||||
end
|
||||
|
||||
def rules
|
||||
return @rules unless @rules.nil?
|
||||
@rules = rule_class.prioritised.for(enterprise)
|
||||
end
|
||||
|
||||
def customer_rules
|
||||
return @customer_matched_rules unless @customer_matched_rules.nil?
|
||||
@customer_matched_rules = rules.select{ |rule| customer_tags_match?(rule) }
|
||||
|
||||
@@ -20,7 +20,9 @@ module Spree
|
||||
let!(:current_api_user) do
|
||||
user = create(:user)
|
||||
user.spree_roles = []
|
||||
enterprises.each { |e| user.enterprise_roles.create(enterprise: send(e)) }
|
||||
enterprises.each do |enterprise|
|
||||
user.enterprise_roles.create(enterprise: public_send(enterprise))
|
||||
end
|
||||
user.save!
|
||||
user
|
||||
end
|
||||
|
||||
5
lib/spree/core/controller_helpers/auth_decorator.rb
Normal file
5
lib/spree/core/controller_helpers/auth_decorator.rb
Normal file
@@ -0,0 +1,5 @@
|
||||
Spree::Core::ControllerHelpers::Auth.class_eval do
|
||||
def require_login_then_redirect_to(url)
|
||||
redirect_to root_path(anchor: "login?after_login=#{url}")
|
||||
end
|
||||
end
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'open_food_network/scope_variant_to_hub'
|
||||
|
||||
Spree::Core::ControllerHelpers::Order.class_eval do
|
||||
def current_order_with_scoped_variants(create_order_if_necessary = false)
|
||||
order = current_order_without_scoped_variants(create_order_if_necessary)
|
||||
|
||||
@@ -17,7 +17,7 @@ module Stripe
|
||||
attrs = source_attrs_from(response)
|
||||
@payment.source.update_attributes!(attrs)
|
||||
else
|
||||
@payment.send(:gateway_error, response.message)
|
||||
@payment.__send__(:gateway_error, response.message)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ module Stripe
|
||||
|
||||
def handle
|
||||
return :unknown unless known_event?
|
||||
send(event_mappings[@event.type])
|
||||
__send__(event_mappings[@event.type])
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
require 'csv'
|
||||
|
||||
namespace :openfoodnetwork do
|
||||
|
||||
namespace :dev do
|
||||
desc 'export users to CSV'
|
||||
task export_users: :environment do
|
||||
CSV.open('db/users.csv', 'wb') do |csv|
|
||||
csv << user_header
|
||||
users.each do |user|
|
||||
csv << user_row(user)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
desc 'import users from CSV'
|
||||
task import_users: :environment do
|
||||
ActionMailer::Base.delivery_method = :test
|
||||
|
||||
CSV.foreach('db/users.csv') do |row|
|
||||
next if row[0] == 'encrypted_password'
|
||||
|
||||
create_user_from row
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def users
|
||||
# Skip some spambot users
|
||||
Spree::User.all.reject { |u| u.email =~ /example.net/ }
|
||||
end
|
||||
|
||||
def user_header
|
||||
["encrypted_password", "password_salt", "email", "remember_token", "persistence_token", "reset_password_token", "perishable_token", "sign_in_count", "failed_attempts", "last_request_at", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "login", "created_at", "updated_at", "authentication_token", "unlock_token", "locked_at", "remember_created_at", "reset_password_sent_at",
|
||||
|
||||
"role_name",
|
||||
|
||||
"ship_address_firstname", "ship_address_lastname", "ship_address_address1", "ship_address_address2", "ship_address_city", "ship_address_zipcode", "ship_address_phone", "ship_address_state", "ship_address_country", "ship_address_created_at", "ship_address_updated_at", "ship_address_company",
|
||||
|
||||
"bill_address_firstname", "bill_address_lastname", "bill_address_address1", "bill_address_address2", "bill_address_city", "bill_address_zipcode", "bill_address_phone", "bill_address_state", "bill_address_country", "bill_address_created_at", "bill_address_updated_at", "bill_address_company",]
|
||||
end
|
||||
|
||||
def user_row(user)
|
||||
sa = user.orders.last.andand.ship_address
|
||||
ba = user.orders.last.andand.bill_address
|
||||
|
||||
[user.encrypted_password, user.password_salt, user.email, user.remember_token, user.persistence_token, user.reset_password_token, user.perishable_token, user.sign_in_count, user.failed_attempts, user.last_request_at, user.current_sign_in_at, user.last_sign_in_at, user.current_sign_in_ip, user.last_sign_in_ip, user.login, user.created_at, user.updated_at, user.authentication_token, user.unlock_token, user.locked_at, user.remember_created_at, user.reset_password_sent_at,
|
||||
|
||||
user.spree_roles.first.andand.name,
|
||||
|
||||
sa.andand.firstname, sa.andand.lastname, sa.andand.address1, sa.andand.address2, sa.andand.city, sa.andand.zipcode, sa.andand.phone, sa.andand.state, sa.andand.country, sa.andand.created_at, sa.andand.updated_at, sa.andand.company,
|
||||
|
||||
ba.andand.firstname, ba.andand.lastname, ba.andand.address1, ba.andand.address2, ba.andand.city, ba.andand.zipcode, ba.andand.phone, ba.andand.state, ba.andand.country, ba.andand.created_at, ba.andand.updated_at, ba.andand.company,]
|
||||
end
|
||||
|
||||
def create_user_from(row)
|
||||
user = Spree::User.create!({password: 'changeme123', password_confirmation: 'changeme123', email: row[2], remember_token: row[3], persistence_token: row[4], reset_password_token: row[5], perishable_token: row[6], sign_in_count: row[7], failed_attempts: row[8], last_request_at: row[9], current_sign_in_at: row[10], last_sign_in_at: row[11], current_sign_in_ip: row[12], last_sign_in_ip: row[13], login: row[14], created_at: row[15], updated_at: row[16], authentication_token: row[17], unlock_token: row[18], locked_at: row[19], remember_created_at: row[20], reset_password_sent_at: row[21]}, without_protection: true)
|
||||
|
||||
user.update_column :encrypted_password, row[0]
|
||||
user.update_column :password_salt, row[1]
|
||||
|
||||
# Safer if we don't make new users into admins
|
||||
#role = Spree::Role.find_by_name row[24]
|
||||
#user.spree_roles << role if role
|
||||
|
||||
sa_state = Spree::State.find_by_name row[30]
|
||||
sa_country = Spree::Country.find_by_name row[31]
|
||||
sa = Spree::Address.create!({firstname: row[23], lastname: row[24], address1: row[25], address2: row[26], city: row[27], zipcode: row[28], phone: row[29], state: sa_state, country: sa_country, created_at: row[32], updated_at: row[33], company: row[34]}, without_protection: true)
|
||||
user.update_column :ship_address_id, sa.id
|
||||
|
||||
ba_state = Spree::State.find_by_name row[42]
|
||||
ba_country = Spree::Country.find_by_name row[43]
|
||||
ba = Spree::Address.create!({firstname: row[35], lastname: row[36], address1: row[37], address2: row[38], city: row[39], zipcode: row[40], phone: row[41], state: ba_state, country: ba_country, created_at: row[44], updated_at: row[45], company: row[46]}, without_protection: true)
|
||||
user.update_column :bill_address_id, ba.id
|
||||
rescue ActiveRecord::RecordInvalid => e
|
||||
puts "#{row[2]} - #{e.message}"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user