Wild Keeper Spotlight: Vicki Tozer - Keep Nature Wild

What are you looking for?

Wild Keeper Spotlight: Vicki Tozer

  • 3 min read

Wild Keeper Spotlight: Vicki Tozer

Meet third term Wild Keeper, Vicki! She resides in Arizona, but is currently in Washington. She has always loved nature and grew up with the occasional family camping trip along with a few hikes with friends in high school. She reflects that, "it was in college that I really became “outdoorsy”. I had the opportunity to take an outdoor leadership training course my sophomore year where I became Leave No Trace certified, learned to kayak, canoe, rock climb, use a map/compass and navigate off trail. After completing this course I was hired on to help lead trips with my colleges Outdoor Adventures program. I met so many amazing people, got to experience so many amazing things, and I learned invaluable skills that I still use to this day when I go on any outdoorsy related trips."

Vicki shares that her favorite ways to experience the outdoors is by camping, hiking, backpacking, paddling, surfing, and scuba diving. She shared that her new goal is to take a mountaineering course!

When we asked Vicki if she's experienced any challenges within the outdoor industry, she said yes. "As someone who has worked in the outdoor industry and conservation field there is a lot of sexism and misogyny. There have been many times my knowledge, skills, and abilities have been questioned by men which is incredibly frustrating. Having a lot of amazing women mentors and friends within the outdoor community has really helped with this. We remind each other every day that we are strong, capable, and meant to be in outdoor spaces. Being part of communities like KNW that are accepting of EVERYONE and encourage diversity are so helpful for people of all backgrounds to feel welcome in the outdoors."

Something that deeply shapes Vicki's connection to nature is that her background is in ecology and environmental science. She shares that it "has really shaped my relationship with nature and the outdoors. A lot of my jobs have been heavily field focused meaning I spend a majority of my time out observing wildlife, collecting data, monitoring ecosystems. I develop a deep connection with these spaces and I feel a great need to protect them. So even when I am out enjoying nature in my free time I am always thinking about the geological and biological processes that have shaped these wild spaces and how incredibly lucky we are to get to experience them. And with this privilege comes the responsibility to protect our natural world for the current and future generations of all living things on this planet."

 Learn more about Vicki and her Wild Keeping below! 

Keep Nature Wild: If you had to choose between mountains, desert or forest, what would you choose?

Vicki: Mountains!

KNW: What is your favorite adventure snack?

V: Good ol' classic trail mix

KNW: What is one thing you'd love to bring more awareness to in the outdoor space?

V: Leave no trace. I encourage every person who spends a lot of time outdoors to read up on leave no trace and even take a course if it’s available! University of Arizona has a free LNT course for students and I’m sure other universities do too! I love that more and more people are getting outside but I’ve also seen a lot of people trashing places, deliberately ignoring signs and going off trail into restoration areas for pictures, having fires when there are fire restrictions in place. I think a lot of people just don’t know, but taking the time to read up on outdoor etiquette can help protect these places and make sure everyone can enjoy them.

KNW: What is your favorite thing about being a Wild Keeper?

V: The community! I have met so many awesome people both in person and virtually. Being a part of a group is so encouraging and keeps me motivated to get out there and pick up trash!

KNW: What has picking up trash outdoors done for you? 

V: Picking up trash outdoors reminds me that we all can have an impact and make a difference. During earth month I regularly picked up litter around my neighborhood and I noticed each time I went out it was a little bit cleaner each time. Sometimes individual actions don’t seem so important in the grand scheme of things but it is actually really easy to make a huge impact locally and picking up trash is such an easy way to do this.

KNW: Roughly how many pounds do you think you've picked up since you became a Wild Keeper?

V: I went real hard in April during the earth month challenge so I’m going to guesstimate 150 pounds.

KNW: What goals do you have for this year? (or beyond?)

V: One of my goals this year is to do 52 hikes and I’m absolutely crushing it! And one day (when I’m not traveling) I’d like to host a clean up with KNW!

 

class Campaign def initialize(condition, *qualifiers) @condition = (condition.to_s + '?').to_sym @qualifiers = PostCartAmountQualifier ? [] : [] rescue qualifiers.compact @line_item_selector = qualifiers.last unless @line_item_selector qualifiers.compact.each do |qualifier| is_multi_select = qualifier.instance_variable_get(:@conditions).is_a?(Array) if is_multi_select qualifier.instance_variable_get(:@conditions).each do |nested_q| @post_amount_qualifier = nested_q if nested_q.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end else @post_amount_qualifier = qualifier if qualifier.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end end if @qualifiers.empty? end def qualifies?(cart) return true if @qualifiers.empty? @unmodified_line_items = cart.line_items.map do |item| new_item = item.dup new_item.instance_variables.each do |var| val = item.instance_variable_get(var) new_item.instance_variable_set(var, val.dup) if val.respond_to?(:dup) end new_item end if @post_amount_qualifier @qualifiers.send(@condition) do |qualifier| is_selector = false if qualifier.is_a?(Selector) || qualifier.instance_variable_get(:@conditions).any? { |q| q.is_a?(Selector) } is_selector = true end rescue nil if is_selector raise "Missing line item match type" if @li_match_type.nil? cart.line_items.send(@li_match_type) { |item| qualifier.match?(item) } else qualifier.match?(cart, @line_item_selector) end end end def run_with_hooks(cart) before_run(cart) if respond_to?(:before_run) run(cart) after_run(cart) end def after_run(cart) @discount.apply_final_discount if @discount && @discount.respond_to?(:apply_final_discount) revert_changes(cart) unless @post_amount_qualifier.nil? || @post_amount_qualifier.match?(cart) end def revert_changes(cart) cart.instance_variable_set(:@line_items, @unmodified_line_items) end end class ConditionalDiscount < Campaign def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts) super(condition, customer_qualifier, cart_qualifier) @line_item_selector = line_item_selector @discount = discount @items_to_discount = max_discounts == 0 ? nil : max_discounts end def run(cart) raise "Campaign requires a discount" unless @discount return unless qualifies?(cart) applicable_items = cart.line_items.select { |item| @line_item_selector.nil? || @line_item_selector.match?(item) } applicable_items = applicable_items.sort_by { |item| item.variant.price } applicable_items.each do |item| break if @items_to_discount == 0 if (!@items_to_discount.nil? && item.quantity > @items_to_discount) discounted_items = item.split(take: @items_to_discount) @discount.apply(discounted_items) cart.line_items << discounted_items @items_to_discount = 0 else @discount.apply(item) @items_to_discount -= item.quantity if !@items_to_discount.nil? end end end end class Qualifier def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end def compare_amounts(compare, comparison_type, compare_to) case comparison_type when :greater_than return compare > compare_to when :greater_than_or_equal return compare >= compare_to when :less_than return compare < compare_to when :less_than_or_equal return compare <= compare_to when :equal_to return compare == compare_to else raise "Invalid comparison type" end end end class CountryCodeQualifier < Qualifier def initialize(match_type, country_codes) @invert = match_type == :not_one @country_codes = country_codes.map(&:upcase) end def match?(cart, selector = nil) shipping_address = cart.shipping_address return false if shipping_address&.country_code.nil? @invert ^ @country_codes.include?(shipping_address.country_code.upcase) end end class CartAmountQualifier < Qualifier def initialize(behaviour, comparison_type, amount) @behaviour = behaviour @comparison_type = comparison_type @amount = Money.new(cents: amount * 100) end def match?(cart, selector = nil) total = cart.subtotal_price if @behaviour == :item || @behaviour == :diff_item total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.line_price : Money.zero) end end case @behaviour when :cart, :item compare_amounts(total, @comparison_type, @amount) when :diff_cart compare_amounts(cart.subtotal_price_was - @amount, @comparison_type, total) when :diff_item original_line_total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.original_line_price : Money.zero) end compare_amounts(original_line_total - @amount, @comparison_type, total) end end end class AndSelector def initialize(*conditions) @conditions = conditions.compact end def match?(item, selector = nil) @conditions.all? do |condition| if selector condition.match?(item, selector) else condition.match?(item) end end end end class Selector def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end end class LineItemPropertiesSelector < Selector def initialize(target_properties) @target_properties = target_properties end def match?(line_item) line_item_props = line_item.properties @target_properties.all? do |key, value| next unless line_item_props.has_key?(key) true if line_item_props[key].downcase == value.downcase end end end class VariantIdSelector < Selector def initialize(match_type, variant_ids) @invert = match_type == :not_one @variant_ids = variant_ids.map { |id| id.to_i } end def match?(line_item) @invert ^ @variant_ids.include?(line_item.variant.id) end end class PercentageDiscount def initialize(percent, message) @discount = (100 - percent) / 100.0 @message = message end def apply(line_item) line_item.change_line_price(line_item.line_price * @discount, message: @message) end end CAMPAIGNS = [ ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :is_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ), ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :not_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ) ].freeze CAMPAIGNS.each do |campaign| campaign.run_with_hooks(Input.cart) end Output.cart = Input.cart