Merge branch 'master' into 13122-redesign-add-buttons

pull/13215/head
Carlos Matallín 7 years ago
commit 78d68d7b95

@ -7,8 +7,9 @@ module Carto
ssl_required :create
before_filter :current_viewer_avaliable,
:load_event, only: :create
skip_before_filter :api_authorization_required
before_filter :load_event, only: :create
rescue_from Carto::LoadError,
Carto::UnauthorizedError,
@ -22,17 +23,15 @@ module Carto
private
def current_viewer_avaliable
raise Carto::UnauthorizedError.new unless current_viewer
end
def load_event
event_name = params[:name]
raise Carto::UnprocesableEntityError.new('name not provided') unless event_name
modulized_name = "Carto::Tracking::Events::#{event_name.parameterize('_').camelize}"
@event = modulized_name.constantize.new(current_viewer.id, params[:properties])
@event = Carto::Tracking::Events::SegmentEvent.build(params[:name], current_viewer.try(:id), params[:properties])
@event ||= modulized_name.constantize.new(current_viewer.try(:id), params[:properties])
rescue NameError
raise Carto::LoadError.new("Event not found: #{event_name}")
end

@ -26,6 +26,8 @@ module Carto
layout false
def show
@viz_owner_base_url = @visualization.user.public_url
@layers_data = visualization_for_presentation.layers.map do |l|
Carto::Api::LayerPresenter.new(l).to_embed_poro
end

@ -40,6 +40,7 @@
var layersData = <%= safe_js_object @layers_data.to_json %>;
var stateJSON = <%= safe_js_object @state.to_json %>;
var authTokens = <%= safe_js_object @auth_tokens.to_json %>;
var baseURL = '<%= @viz_owner_base_url %>';
var mapzenApiKey = '<%= mapzen_api_key %>';
</script>
<%= javascript_include_tag 'common.js' %>

@ -13,7 +13,6 @@ module.exports = Backbone.Model.extend({
},
initialize: function (attrs, opts) {
if (!opts.userId) { throw new Error('userId is required'); }
if (!opts.visId) { throw new Error('visId is required'); }
if (!opts.configModel) { throw new Error('configModel is required'); }

@ -9,7 +9,6 @@ module.exports = (function () {
return {
init: function (opts) {
if (!opts) { throw new Error('visId, userId and configModel are required'); }
if (!opts.userId) { throw new Error('userId is required'); }
if (!opts.visId) { throw new Error('visId is required'); }
if (!opts.configModel) { throw new Error('configModel is required'); }

@ -0,0 +1,94 @@
var helper = require('../../../../../javascripts/cartodb/helpers/map_options');
function getFBstatus (gl) {
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
switch (status) {
case gl.FRAMEBUFFER_COMPLETE:
return 'FRAMEBUFFER_COMPLETE';
case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT';
case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT';
case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS';
case gl.FRAMEBUFFER_UNSUPPORTED:
return 'FRAMEBUFFER_UNSUPPORTED';
case gl.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
return 'FRAMEBUFFER_INCOMPLETE_MULTISAMPLE';
case gl.RENDERBUFFER_SAMPLES:
return 'RENDERBUFFER_SAMPLES';
default:
return 'Unkown Framebuffer status';
}
}
function getWebGLsupport (canvas) {
var support = {
webgl1: '?',
OES_texture_float: '-',
EXT_blend_minmax: '-',
MAX_RENDERBUFFER_SIZE: '-',
renderToFloat: '-',
mobile: helper.isMobileDevice(),
userAgent: navigator.userAgent
};
var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) {
support.webgl1 = false;
return support;
} else {
support.webgl1 = true;
}
var OES_texture_float = gl.getExtension('OES_texture_float');
support.OES_texture_float = !!OES_texture_float;
var EXT_blend_minmax = gl.getExtension('EXT_blend_minmax');
support.EXT_blend_minmax = !!EXT_blend_minmax;
support.MAX_RENDERBUFFER_SIZE = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
var aux1x1FB = gl.createFramebuffer();
var aux1x1TEX = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, aux1x1TEX);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,
1, 1, 0, gl.RGBA, gl.FLOAT,
null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.bindFramebuffer(gl.FRAMEBUFFER, aux1x1FB);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, aux1x1TEX, 0);
// Check FB completeness
support.renderToFloat = getFBstatus(gl);
return support;
}
module.exports = {
getWebGLStats: function () {
var testCanvas = document.createElement('canvas');
var stats;
testCanvas.style.position = 'absolute';
testCanvas.style.top = '0';
testCanvas.style.left = '0';
testCanvas.style.zIndex = '-1';
testCanvas.style.width = '1px';
testCanvas.style.height = '1px';
testCanvas.style.pointerEvents = 'none';
document.body.appendChild(testCanvas);
try {
stats = getWebGLsupport(testCanvas);
} catch (error) {
stats = {
error: error
};
}
return stats;
}
};

@ -41,6 +41,7 @@ var DeepInsightsIntegrations = require('./deep-insights-integrations');
var EditFeatureOverlay = require('./deep-insights-integration/edit-feature-overlay');
var Notifier = require('./components/notifier/notifier');
var MetricsTracker = require('./components/metrics/metrics-tracker');
var WebGLMetrics = require('./components/metrics/webgl-metrics');
var FeedbackButtonView = require('./editor/feedback/feedback-button-view');
var SettingsOptions = require('./data/map-settings');
var SettingsView = require('./editor/editor-settings-view');
@ -336,6 +337,10 @@ var mapCreation = function () {
editFeatureOverlay: editFeatureOverlay
});
if (Math.random() < 0.3) {
MetricsTracker.track('WebGL stats', WebGLMetrics.getWebGLStats());
}
// Expose things after Map initialization
window.deepInsightsIntegrations = deepInsightsIntegrations;
window.styleManager = styleManager;

@ -1,6 +1,9 @@
var ConfigModel = require('./data/config-model');
var deepInsights = require('cartodb-deep-insights.js');
var LayerStyleCollection = require('./embed/style-collection');
var EmbedIntegrations = require('./embed/embed-integrations');
var MetricsTracker = require('./components/metrics/metrics-tracker');
var WebGLMetrics = require('./components/metrics/webgl-metrics');
var _ = require('underscore');
var URLStateHelper = require('cartodb-deep-insights.js/src/api/url-helper.js');
@ -17,6 +20,7 @@ var dashboardOpts = {
};
var stateJSON = window.stateJSON;
var layersData = window.layersData;
var configModel = new ConfigModel({ base_url: window.baseURL });
var stateFromURL = URLStateHelper.getStateFromCurrentURL();
if (stateFromURL && !_.isEmpty(stateFromURL)) {
@ -32,6 +36,11 @@ if (stateFromURL && !_.isEmpty(stateFromURL)) {
var layerStyleCollection = new LayerStyleCollection();
layerStyleCollection.resetByLayersData(layersData);
MetricsTracker.init({
visId: vizJSON.id,
configModel: configModel
});
deepInsights.createDashboard('#dashboard', vizJSON, dashboardOpts, function (error, dashboard) {
if (error) {
console.error('Dashboard has some errors:', error);
@ -47,6 +56,10 @@ deepInsights.createDashboard('#dashboard', vizJSON, dashboardOpts, function (err
layerStyleCollection: layerStyleCollection
});
if (Math.random() < 0.02) {
MetricsTracker.track('WebGL stats', WebGLMetrics.getWebGLStats());
}
window.embedIntegrations = embedIntegrations;
});

@ -9,10 +9,6 @@ describe('components/metrics/metrics-tracker', function () {
MetricsTracker.init();
}).toThrowError('visId, userId and configModel are required');
expect(function () {
MetricsTracker.init({ visId: 'paco' });
}).toThrowError('userId is required');
expect(function () {
MetricsTracker.init({ userId: 'vis' });
}).toThrowError('visId is required');

@ -280,6 +280,39 @@ module Carto
required_properties :user_id, :visualization_id, :type
end
# Models a generic event for segment.
class SegmentEvent < Event
include Carto::Tracking::Services::Segment
attr_reader :name
private_class_method :new
# Just pass any hash at `properties` and it will be sent to Segment.
def self.build(name, reporter_id, properties)
new(name, reporter_id, properties) if EVENTS.include?(name)
end
private
EVENTS = ['WebGL stats'].freeze
def initialize(name, reporter_id, properties)
@name = name
@properties = properties
@format = SegmentFormat.new(@properties)
@reporter = Carto::User.where(id: reporter_id).first
end
end
class SegmentFormat < Carto::Tracking::Formats::Internal
def to_segment
data = super
data[:data_properties] = to_hash
data
end
end
end
end
end

@ -23,7 +23,7 @@ module Carto
record_class_name.constantize.find(record_id)
rescue
record_id ? (raise Carto::LoadError.new("#{record_class_name} not found")) : nil
record_id ? (raise Carto::LoadError.new("#{record_class_name} not found. Id: #{record_id}")) : nil
end
def to_hash
@ -31,7 +31,7 @@ module Carto
end
def to_segment
user = fetch_record!(:user)
user = @hash['user_id'].present? ? fetch_record!(:user) : nil
visualization = fetch_record!(:visualization)
widget = fetch_record!(:widget)

@ -8,7 +8,7 @@ module Carto
segment_job = Resque::TrackingJobs::SendSegmentEvent
supplied_properties = @format.to_segment
Resque.enqueue(segment_job, @reporter.id, name, supplied_properties)
Resque.enqueue(segment_job, @reporter.try(:id), name, supplied_properties)
end
def segment_api_key

@ -5,13 +5,15 @@ require 'hubspot/events_api'
module Resque
module TrackingJobs
module SendSegmentEvent
ANONYMOUS_SEGMENT_USER_ID = '00000000-0000-0000-0000-000000000000'.freeze
@queue = :tracker
def self.perform(user_id, name, properties)
return unless segment_api_key = Cartodb.get_config(:segment, 'api_key')
segment = Segment::Analytics.new(write_key: segment_api_key)
segment.track(user_id: user_id, event: name, properties: properties)
segment.track(user_id: user_id || ANONYMOUS_SEGMENT_USER_ID, event: name, properties: properties)
segment.flush
rescue => exception
CartoDB::Logger.warning(message: 'Can\'t report to Segment',

@ -1,6 +1,6 @@
{
"name": "cartodb-ui",
"version": "4.10.113.13122",
"version": "4.10.116.13122",
"description": "CARTO UI frontend",
"repository": {
"type": "git",

@ -26,6 +26,8 @@ describe Carto::Api::MetricsController do
user_properties = { user_id: user_id, api_key: @user.api_key }
Carto::Tracking::Events::Event.descendants.each do |event_class|
next unless event_class.public_methods.include?(:new)
event = event_class.new(user_id, user_id: user_id)
event_class.any_instance.stubs(:report!)
@ -48,9 +50,9 @@ describe Carto::Api::MetricsController do
describe 'validations' do
it 'should require properties' do
Carto::Tracking::Events::Event.descendants.each do |event_class|
event = event_class.new(@user.id, {})
next unless event_class.public_methods.include?(:new)
puts "Testing #{event_class}"
event = event_class.new(@user.id, {})
unless event.required_properties.empty?
post_json metrics_url, name: event.name, properties: {} do |response|

Loading…
Cancel
Save