Class: SourcesController
- Inherits:
-
CrmController
- Object
- ActionController::Base
- ApplicationController
- CrmController
- SourcesController
- Includes:
- Controllers::RequireTurboFrame
- Defined in:
- app/controllers/sources_controller.rb
Overview
Controller: sources.
Constant Summary collapse
- TAB_ACTIONS =
Tab fragments never render standalone — non-frame hits redirect to show ?tab=.
%i[tab_details tab_children tab_attributions tab_related].freeze
Constants included from Controllers::ReferenceFindable
Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS
Constants included from Controllers::AnalyticsEvents
Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY
Constants included from Controllers::ErrorRendering
Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES
Instance Method Summary collapse
-
#create ⇒ Object
POST /source.
-
#destroy ⇒ Object
DELETE /source/1.
-
#do_generate_qr ⇒ void
Builds the tagged tracking URL and renders its QR code as a PNG.
-
#edit ⇒ Object
GET /source/1/edit.
-
#generate_qr ⇒ void
Renders the QR code generation form, seeded with the source's UTM defaults.
-
#index ⇒ Object
GET /sources.
-
#lookup ⇒ void
Returns source autocomplete/picker results as JSON.
-
#new ⇒ Object
GET /source/new.
-
#ref_lookup ⇒ Object
GET /sources/ref_lookup.
-
#selection ⇒ Object
GET /sources/selection.
-
#show ⇒ void
Displays a source.
-
#show_attributions ⇒ void
Lists records attributed to a source.
-
#show_children ⇒ void
Lists a source's children.
-
#show_related ⇒ void
Lists videos and sources whose name/description/referral-code match this source.
-
#tab_attributions ⇒ void
Renders the attributions tab fragment.
-
#tab_children ⇒ void
Renders the children tab fragment.
-
#tab_details ⇒ void
Renders the details tab fragment.
-
#tab_related ⇒ Object
Ad-platform campaign syncs + the Pinterest OAuth connection were moved to the admin-only Admin::CampaignIntegrationsController.
-
#update ⇒ Object
PUT /sources/1.
Methods included from Controllers::RequireTurboFrame
require_in_pane_tab_frames, require_turbo_frame
Methods inherited from CrmController
#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie, #touch_employee_last_seen
Methods inherited from ApplicationController
#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y
Methods included from Controllers::ReturnPathHandling
#check_for_return_path, #redirect_to_return_path_or_default
Methods included from Controllers::AnalyticsEvents
#consume_queued_analytics_events, #registration_lead_type, #track_event
Methods included from Controllers::DeviceDetection
Methods included from Controllers::SubdomainDetection
#is_crm_request?, #is_www_request?, #json_request?
Methods included from Controllers::TurboSafeRedirect
Methods included from Controllers::TrackingDetection
#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?
Methods included from Controllers::AcceleratedFileSending
#send_file_accelerated, #send_upload_accelerated
Methods included from Controllers::ErrorRendering
#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback
Methods included from Controllers::TurnstileVerification
#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!
Methods included from Controllers::CloudflareCaching
edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session
Methods included from Controllers::Webpackable
#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?
Methods included from Controllers::Localizable
#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale
Methods included from Controllers::Authenticable
#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak
Methods included from UrlsHelper
#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?
Instance Method Details
#create ⇒ Object
POST /source
89 90 91 92 93 94 95 96 97 98 99 |
# File 'app/controllers/sources_controller.rb', line 89 def create :create, Source @source = Source.new(params[:source]) respond_to do |format| if @source.save format.html { redirect_to(@source) } else format.html { render :new, status: :unprocessable_content } end end end |
#destroy ⇒ Object
DELETE /source/1
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'app/controllers/sources_controller.rb', line 167 def destroy :destroy, Source @source = Source.find(params[:id]) if @source.ok_to_destroy? redirect_url = @source.parent ? source_path(@source.parent) : sources_url @source.destroy else @source.update!(visibility: :archived) flash[:info] = 'Source archived since customers are marked with this source. All descendants were also archived.' redirect_url = source_path(@source) end respond_to do |format| format.html { redirect_to(redirect_url) } end end |
#do_generate_qr ⇒ void
This method returns an undefined value.
Builds the tagged tracking URL and renders its QR code as a PNG.
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'app/controllers/sources_controller.rb', line 118 def do_generate_qr require 'rqrcode' @source = Source.find(params[:id]) @qr = OpenStruct.new(params[:qr] || {}) @qr.url ||= 'https://www.warmlyyours.com/en-US' uri = Addressable::URI.parse(@qr.url) uri.host ||= WEB_HOSTNAME_WITHOUT_PORT uri.scheme ||= 'https' uri.port = APP_PORT_NUMBER unless APP_PORT_NUMBER == 80 qr_opts = { utm_id: @qr.referral_code.presence, utm_source: @qr.utm_source.presence, utm_medium: @qr.utm_medium.presence, utm_campaign: @qr.utm_campaign.presence }.compact uri.query_values = (uri.query_values || {}).merge(qr_opts) @qr_string = uri.to_s qr_code = RQRCode::QRCode.new(@qr_string) size = [(@qr.size || 200).to_i, 400].min @image_blob = qr_code.as_png( bit_depth: 1, border_modules: 4, color_mode: ChunkyPNG::COLOR_GRAYSCALE, color: 'black', file: nil, fill: 'white', module_px_size: 6, resize_exactly_to: false, resize_gte_to: false, size: size ) render :generate_qr end |
#edit ⇒ Object
GET /source/1/edit
79 80 81 82 83 84 85 86 |
# File 'app/controllers/sources_controller.rb', line 79 def edit :update, Source @source = Source.find(params[:id]) @source_id = @source.parent_id respond_to do |format| format.html # new.html.erb end end |
#generate_qr ⇒ void
This method returns an undefined value.
Renders the QR code generation form, seeded with the source's UTM defaults.
104 105 106 107 108 109 110 111 112 113 |
# File 'app/controllers/sources_controller.rb', line 104 def generate_qr @source = Source.find(params[:id]) @qr = OpenStruct.new(params[:qr] || {}) @qr.url = "#{WEB_URL}/#{I18n.locale}" @qr.referral_code = @source.referral_code @qr.utm_source = @source.utm_source.presence || 'magazine' @qr.utm_medium = @source.utm_medium.presence || 'QR' @qr.utm_campaign = @source.utm_campaign.presence || @source.name.parameterize @qr.size = 200 end |
#index ⇒ Object
GET /sources
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'app/controllers/sources_controller.rb', line 14 def index base_sources = if params[:parent_id].present? Source.where(parent_id: params[:parent_id]) elsif params[:q].present? Source.all else Source.roots_sorted end @q = base_sources.ransack(sanitized_search_params) @sources = @q.result.with_children_count @q.sorts = 'full_name asc' if @q.sorts.blank? end |
#lookup ⇒ void
This method returns an undefined value.
Returns source autocomplete/picker results as JSON.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
# File 'app/controllers/sources_controller.rb', line 217 def lookup # Picker visibility: by default only `active` sources show up. Pickers that # opt in with `data: { unrestricted: true }` (search criteria forms, source # admin parent picker) also include `hidden`. Archived sources are never # selectable through this endpoint regardless of role. sources = params[:unrestricted].to_b ? Source.not_archived : Source.visible sources = sources.where.not(id: params[:source_id_not_in]) if params[:source_id_not_in].present? sources = sources.order(:full_name) @results = if params[:source_id] sources.where(id: params[:source_id]) elsif params[:q] sources.lookup(params[:q]) else sources end render json: TomSelect.format_json_results(self, @results, params[:page], params[:per_page], :id, :name_for_select) end |
#new ⇒ Object
GET /source/new
70 71 72 73 74 75 76 |
# File 'app/controllers/sources_controller.rb', line 70 def new :create, Source @source = Source.new @source_id = params[:parent_id] unless params[:parent_id].nil? # This is used for the helper for an existing source @source.parent_id = @source_id @source.referral_code = @source.generate_ref_code end |
#ref_lookup ⇒ Object
GET /sources/ref_lookup
203 204 205 206 207 208 209 210 211 212 |
# File 'app/controllers/sources_controller.rb', line 203 def ref_lookup @sources = Source.(params[:ref_code]) respond_to do |format| if @sources.empty? format.html { render nothing: true } else format.html { render layout: false } end end end |
#selection ⇒ Object
GET /sources/selection
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'app/controllers/sources_controller.rb', line 186 def selection @source = begin Source.find(params[:id]) rescue StandardError nil end @sources = begin Source.(@source) rescue StandardError [] end respond_to do |format| format.html { render(layout: false) } end end |
#show ⇒ void
This method returns an undefined value.
Displays a source.
30 31 32 |
# File 'app/controllers/sources_controller.rb', line 30 def show @source = Source.find(params[:id]) end |
#show_attributions ⇒ void
This method returns an undefined value.
Lists records attributed to a source.
46 47 48 49 |
# File 'app/controllers/sources_controller.rb', line 46 def show_attributions @source = Source.find(params[:id]) render layout: should_render_layout? end |
#show_children ⇒ void
This method returns an undefined value.
Lists a source's children.
37 38 39 40 41 |
# File 'app/controllers/sources_controller.rb', line 37 def show_children @source = Source.find(params[:id]) @source_children = @source.children.with_children_count.order(:full_name) render layout: should_render_layout? end |
#show_related ⇒ void
This method returns an undefined value.
Lists videos and sources whose name/description/referral-code match this source.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'app/controllers/sources_controller.rb', line 54 def @source = Source.find(params[:id]) @r_vids = Video.where( 'title LIKE ? OR youtube_description LIKE ? OR youtube_description LIKE ?', @source.name.present? ? "%#{@source.name}%" : nil, @source.referral_code.present? ? "%#{@source.referral_code}%" : nil, @source.description.present? ? "%#{@source.description}%" : nil ) @sources = Source.where( 'name LIKE ?', @source.name.present? ? "%#{@source.name}%" : nil ) render layout: should_render_layout? end |
#tab_attributions ⇒ void
This method returns an undefined value.
Renders the attributions tab fragment.
265 266 267 268 269 270 271 272 |
# File 'app/controllers/sources_controller.rb', line 265 def tab_attributions @source = Source.find(params[:id]) (:read, @source) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_children ⇒ void
This method returns an undefined value.
Renders the children tab fragment.
250 251 252 253 254 255 256 257 258 259 260 |
# File 'app/controllers/sources_controller.rb', line 250 def tab_children @source = Source.find(params[:id]) (:read, @source) @source_children = @source.children.not_archived.with_children_count.order(:full_name) @archived_children = @source.children.archived.with_children_count.order(:full_name) @archived_count = @archived_children.size respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_details ⇒ void
This method returns an undefined value.
Renders the details tab fragment.
238 239 240 241 242 243 244 245 |
# File 'app/controllers/sources_controller.rb', line 238 def tab_details @source = Source.find(params[:id]) (:read, @source) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_related ⇒ Object
Ad-platform campaign syncs + the Pinterest OAuth connection were moved to
the admin-only Admin::CampaignIntegrationsController.
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'app/controllers/sources_controller.rb', line 276 def @source = Source.find(params[:id]) (:read, @source) @r_vids = Video.where( 'title LIKE ? OR youtube_description LIKE ? OR youtube_description LIKE ?', @source.name.present? ? "%#{@source.name}%" : nil, @source.referral_code.present? ? "%#{@source.referral_code}%" : nil, @source.description.present? ? "%#{@source.description}%" : nil ) @sources = Source.where( 'name LIKE ?', @source.name.present? ? "%#{@source.name}%" : nil ) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#update ⇒ Object
PUT /sources/1
154 155 156 157 158 159 160 161 162 163 164 |
# File 'app/controllers/sources_controller.rb', line 154 def update :update, Source @source = Source.find(params[:id]) respond_to do |format| if @source.update(params[:source]) format.html { redirect_to(@source) } else format.html { render :edit, status: :unprocessable_content } end end end |