diff --git a/app/core/initialize.coffee b/app/core/initialize.coffee index 0ad7b49da..db5897538 100644 --- a/app/core/initialize.coffee +++ b/app/core/initialize.coffee @@ -23,10 +23,9 @@ definitionSchemas = init = -> return if app if not window.userObject._id - $.ajax('/auth/whoami', {success: (res) -> + $.ajax '/auth/whoami', cache: false, success: (res) -> window.userObject = res init() - }) return app = require 'core/application' diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee index d3a280be5..9805f38bc 100644 --- a/app/lib/simulator/Simulator.coffee +++ b/app/lib/simulator/Simulator.coffee @@ -136,6 +136,7 @@ module.exports = class Simulator extends CocoClass parse: true error: @handleFetchTaskError success: @setupSimulationAndLoadLevel + cache: false handleFetchTaskError: (errorData) => console.error "There was a horrible Error: #{JSON.stringify errorData}" diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 68d72d1cf..bb5e12727 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -367,6 +367,7 @@ class CocoModel extends Backbone.Model me.fetch (success: -> Backbone.Mediator.publish('achievements:new', earnedAchievements: collection)) unless _.isEmpty(collection.models) error: -> console.error 'Miserably failed to fetch unnotified achievements', arguments + cache: false CocoModel.pollAchievements = _.debounce CocoModel.pollAchievements, 500 diff --git a/app/models/User.coffee b/app/models/User.coffee index 03613ce20..be8243069 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -33,6 +33,7 @@ module.exports = class User extends CocoModel @getUnconflictedName: (name, done) -> $.ajax "/auth/name/#{name}", + cache: false success: (data) -> done data.name statusCode: 409: (data) -> response = JSON.parse data.responseText diff --git a/app/views/account/PaymentsView.coffee b/app/views/account/PaymentsView.coffee index 73601bf50..b355c4e42 100644 --- a/app/views/account/PaymentsView.coffee +++ b/app/views/account/PaymentsView.coffee @@ -10,9 +10,9 @@ module.exports = class PaymentsView extends RootView constructor: (options) -> super(options) @payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - @supermodel.loadCollection(@payments, 'payments') + @supermodel.loadCollection(@payments, 'payments', {cache: false}) getRenderData: -> c = super() c.payments = @payments - c \ No newline at end of file + c diff --git a/app/views/account/SubscriptionView.coffee b/app/views/account/SubscriptionView.coffee index 20e683117..7b77ad367 100644 --- a/app/views/account/SubscriptionView.coffee +++ b/app/views/account/SubscriptionView.coffee @@ -20,11 +20,11 @@ module.exports = class SubscriptionView extends RootView constructor: (options) -> super(options) if me.get('stripe') - options = { url: "/db/user/#{me.id}/stripe" } + options = { cache: false, url: "/db/user/#{me.id}/stripe" } options.success = (@stripeInfo) => @supermodel.addRequestResource('payment_info', options).load() @payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - @supermodel.loadCollection(@payments, 'payments') + @supermodel.loadCollection(@payments, 'payments', {cache: false}) getRenderData: -> c = super() diff --git a/app/views/account/UnsubscribeView.coffee b/app/views/account/UnsubscribeView.coffee index 409edc5fe..b098a9a38 100644 --- a/app/views/account/UnsubscribeView.coffee +++ b/app/views/account/UnsubscribeView.coffee @@ -25,11 +25,11 @@ module.exports = class UnsubscribeView extends RootView success = => @$el.find('.progress').hide() @$el.find('#success-alert').show() - me.fetch() + me.fetch cache: false error = => @$el.find('.progress').hide() @$el.find('#fail-alert').show() @$el.find('#unsubscribe-button').show() - $.ajax { url: url, success: success, error: error } + $.ajax { url: url, success: success, error: error, cache: false } diff --git a/app/views/admin/AdministerUserModal.coffee b/app/views/admin/AdministerUserModal.coffee index 4828b7967..171fae00e 100644 --- a/app/views/admin/AdministerUserModal.coffee +++ b/app/views/admin/AdministerUserModal.coffee @@ -6,18 +6,18 @@ module.exports = class AdministerUserModal extends ModalView id: "administer-user-modal" template: template plain: true - + events: 'click #save-changes': 'onSaveChanges' - + constructor: (options, @userHandle) -> super(options) - @user = @supermodel.loadModel(new User({_id:@userHandle}), 'user').model - options = {url: '/stripe/coupons'} - options.success = (@coupons) => + @user = @supermodel.loadModel(new User({_id:@userHandle}), 'user', {cache: false}).model + options = {cache: false, url: '/stripe/coupons'} + options.success = (@coupons) => @couponsResource = @supermodel.addRequestResource('coupon', options) @couponsResource.load() - + getRenderData: -> c = super() stripe = @user.get('stripe') or {} @@ -40,12 +40,12 @@ module.exports = class AdministerUserModal extends ModalView c.none = not (c.free or c.freeUntil or c.coupon) c.user = @user c - + onSaveChanges: -> stripe = _.clone(@user.get('stripe') or {}) delete stripe.free delete stripe.couponID - + selection = @$el.find('input[name="stripe-benefit"]:checked').val() dateVal = @$el.find('#free-until-date').val() couponVal = @$el.find('#coupon-select').val() @@ -53,10 +53,8 @@ module.exports = class AdministerUserModal extends ModalView when 'free' then stripe.free = true when 'free-until' then stripe.free = dateVal when 'coupon' then stripe.couponID = couponVal - + @user.set('stripe', stripe) options = {} options.success = => @hide() @user.patch(options) - - \ No newline at end of file diff --git a/app/views/admin/CLAsView.coffee b/app/views/admin/CLAsView.coffee index 19f99447d..45af0ce46 100644 --- a/app/views/admin/CLAsView.coffee +++ b/app/views/admin/CLAsView.coffee @@ -18,7 +18,7 @@ module.exports = class CLAsView extends RootView constructor: (options) -> super options - @clas = @supermodel.loadCollection(new CLACollection(), 'clas').model + @clas = @supermodel.loadCollection(new CLACollection(), 'clas', {cache: false}).model getRenderData: -> c = super() diff --git a/app/views/admin/FilesView.coffee b/app/views/admin/FilesView.coffee index 2301b5797..8867080fe 100644 --- a/app/views/admin/FilesView.coffee +++ b/app/views/admin/FilesView.coffee @@ -37,6 +37,7 @@ module.exports = class FilesView extends RootView $.ajax url: "/file/#{@currentFolder()}/" success: @onLoadedFiles + cache: false onLoadedFiles: (res) => table = tableTemplate({files:res}) diff --git a/app/views/admin/LevelSessionsView.coffee b/app/views/admin/LevelSessionsView.coffee index 816e869d0..26b8baa3c 100644 --- a/app/views/admin/LevelSessionsView.coffee +++ b/app/views/admin/LevelSessionsView.coffee @@ -16,7 +16,7 @@ module.exports = class LevelSessionsView extends RootView @getLevelSessions() getLevelSessions: -> - @sessions = @supermodel.loadCollection(new LevelSessionCollection(), 'sessions').model + @sessions = @supermodel.loadCollection(new LevelSessionCollection(), 'sessions', {cache: false}).model getRenderData: => c = super() diff --git a/app/views/common/UserView.coffee b/app/views/common/UserView.coffee index 480dfed6c..2c79f5261 100644 --- a/app/views/common/UserView.coffee +++ b/app/views/common/UserView.coffee @@ -17,7 +17,7 @@ module.exports = class UserView extends RootView @user = me @onLoaded() @user = new User _id: @userID - @supermodel.loadModel @user, 'user' + @supermodel.loadModel @user, 'user', cache: false getRenderData: -> context = super() diff --git a/app/views/core/RootView.coffee b/app/views/core/RootView.coffee index c4eeb596c..6558f8c90 100644 --- a/app/views/core/RootView.coffee +++ b/app/views/core/RootView.coffee @@ -39,7 +39,7 @@ module.exports = class RootView extends CocoView earnedAchievement.set('notified', true) earnedAchievement.patch() return if achievement.get('collection') is 'level.sessions' - return if @isIE() # Some bugs in IE right now, TODO fix soon! + #return if @isIE() # Some bugs in IE right now, TODO fix soon! # Maybe working now with not caching achievement fetches in CocoModel? new AchievementPopup achievement: achievement, earnedAchievement: earnedAchievement handleNewAchievements: (e) -> @@ -47,6 +47,7 @@ module.exports = class RootView extends CocoView achievement = new Achievement(_id: earnedAchievement.get('achievement')) achievement.fetch success: (achievement) => @showNewAchievement?(achievement, earnedAchievement) + cache: false logoutAccount: -> Backbone.Mediator.publish("auth:logging-out", {}) diff --git a/app/views/editor/PatchesView.coffee b/app/views/editor/PatchesView.coffee index 576cb6175..7e284ae28 100644 --- a/app/views/editor/PatchesView.coffee +++ b/app/views/editor/PatchesView.coffee @@ -23,7 +23,7 @@ module.exports = class PatchesView extends CocoView load: -> @initPatches() - @patches = @supermodel.loadCollection(@patches, 'patches').model + @patches = @supermodel.loadCollection(@patches, 'patches', {cache: false}).model @listenTo @patches, 'sync', @onPatchesLoaded onPatchesLoaded: -> diff --git a/app/views/ladder/LadderPlayModal.coffee b/app/views/ladder/LadderPlayModal.coffee index ea603d5b4..9509ef9bd 100644 --- a/app/views/ladder/LadderPlayModal.coffee +++ b/app/views/ladder/LadderPlayModal.coffee @@ -195,13 +195,13 @@ class ChallengersData _.extend @, Backbone.Events score = @session?.get('totalScore') or 25 @easyPlayer = new LeaderboardCollection(@level, {order: 1, scoreOffset: score - 5, limit: 1, team: @otherTeam}) - @easyPlayer.fetch() + @easyPlayer.fetch cache: false @listenToOnce(@easyPlayer, 'sync', @challengerLoaded) @mediumPlayer = new LeaderboardCollection(@level, {order: 1, scoreOffset: score, limit: 1, team: @otherTeam}) - @mediumPlayer.fetch() + @mediumPlayer.fetch cache: false @listenToOnce(@mediumPlayer, 'sync', @challengerLoaded) @hardPlayer = new LeaderboardCollection(@level, {order: -1, scoreOffset: score + 5, limit: 1, team: @otherTeam}) - @hardPlayer.fetch() + @hardPlayer.fetch cache: false @listenToOnce(@hardPlayer, 'sync', @challengerLoaded) challengerLoaded: -> diff --git a/app/views/ladder/LadderTabView.coffee b/app/views/ladder/LadderTabView.coffee index b40a20bc7..09389fa9c 100644 --- a/app/views/ladder/LadderTabView.coffee +++ b/app/views/ladder/LadderTabView.coffee @@ -154,7 +154,7 @@ module.exports = class LadderTabView extends CocoView oldLeaderboard.destroy() teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id @leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession, @ladderLimit) - @leaderboardRes = @supermodel.addModelResource(@leaderboards[team.id], 'leaderboard', {}, 3) + @leaderboardRes = @supermodel.addModelResource(@leaderboards[team.id], 'leaderboard', {cache: false}, 3) @leaderboardRes.load() render: -> @@ -165,7 +165,7 @@ module.exports = class LadderTabView extends CocoView team = _.find @teams, name: histogramWrapper.data('team-name') histogramData = null $.when( - $.get("/db/level/#{@level.get('slug')}/histogram_data?team=#{team.name.toLowerCase()}", (data) -> histogramData = data) + $.get "/db/level/#{@level.get('slug')}/histogram_data?team=#{team.name.toLowerCase()}", {cache: false}, (data) -> histogramData = data ).then => @generateHistogram(histogramWrapper, histogramData, team.name.toLowerCase()) unless @destroyed @@ -294,17 +294,17 @@ module.exports.LeaderboardData = LeaderboardData = class LeaderboardData extends console.warn 'Already have top players on', @ if @topPlayers @topPlayers = new LeaderboardCollection(@level, {order: -1, scoreOffset: HIGHEST_SCORE, team: @team, limit: @limit}) promises = [] - promises.push @topPlayers.fetch() + promises.push @topPlayers.fetch cache: false if @session score = @session.get('totalScore') or 10 @playersAbove = new LeaderboardCollection(@level, {order: 1, scoreOffset: score, limit: 4, team: @team}) - promises.push @playersAbove.fetch() + promises.push @playersAbove.fetch cache: false @playersBelow = new LeaderboardCollection(@level, {order: -1, scoreOffset: score, limit: 4, team: @team}) - promises.push @playersBelow.fetch() + promises.push @playersBelow.fetch cache: false level = "#{@level.get('original')}.#{@level.get('version').major}" success = (@myRank) => - promises.push $.ajax "/db/level/#{level}/leaderboard_rank?scoreOffset=#{@session.get('totalScore')}&team=#{@team}", {success} + promises.push $.ajax("/db/level/#{level}/leaderboard_rank?scoreOffset=#{@session.get('totalScore')}&team=#{@team}", cache: false, success: success) @promise = $.when(promises...) @promise.then @onLoad @promise.fail @onFail diff --git a/app/views/ladder/LadderView.coffee b/app/views/ladder/LadderView.coffee index a96b9ff62..02dc9d4f0 100644 --- a/app/views/ladder/LadderView.coffee +++ b/app/views/ladder/LadderView.coffee @@ -37,7 +37,7 @@ module.exports = class LadderView extends RootView constructor: (options, @levelID) -> super(options) @level = @supermodel.loadModel(new Level(_id: @levelID), 'level').model - @sessions = @supermodel.loadCollection(new LevelSessionsCollection(@levelID), 'your_sessions').model + @sessions = @supermodel.loadCollection(new LevelSessionsCollection(@levelID), 'your_sessions', {cache: false}).model @teams = [] @@ -71,7 +71,7 @@ module.exports = class LadderView extends RootView fetchSessionsAndRefreshViews: -> return if @destroyed or application.userIsIdle or (new Date() - 2000 < @lastRefreshTime) or not @supermodel.finished() - @sessions.fetch({'success': @refreshViews}) + @sessions.fetch success: @refreshViews, cache: false refreshViews: => return if @destroyed or application.userIsIdle diff --git a/app/views/ladder/MainLadderView.coffee b/app/views/ladder/MainLadderView.coffee index 20a200126..1de64a187 100644 --- a/app/views/ladder/MainLadderView.coffee +++ b/app/views/ladder/MainLadderView.coffee @@ -19,7 +19,7 @@ module.exports = class LadderHomeView extends RootView super options @levelStatusMap = {} @levelPlayCountMap = {} - @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', null, 0).model + @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', {cache: false}, 0).model @listenToOnce @sessions, 'sync', @onSessionsLoaded @getLevelPlayCounts() diff --git a/app/views/ladder/SimulateTabView.coffee b/app/views/ladder/SimulateTabView.coffee index 21137c846..9672a43df 100644 --- a/app/views/ladder/SimulateTabView.coffee +++ b/app/views/ladder/SimulateTabView.coffee @@ -15,7 +15,7 @@ module.exports = class SimulateTabView extends CocoView constructor: (options) -> super(options) @simulatorsLeaderboardData = new SimulatorsLeaderboardData(me) - @simulatorsLeaderboardDataRes = @supermodel.addModelResource(@simulatorsLeaderboardData, 'top_simulators') + @simulatorsLeaderboardDataRes = @supermodel.addModelResource(@simulatorsLeaderboardData, 'top_simulators', {cache: false}) @simulatorsLeaderboardDataRes.load() require 'vendor/aether-javascript' require 'vendor/aether-python' @@ -77,7 +77,7 @@ module.exports = class SimulateTabView extends CocoView refresh: -> success = (numberOfGamesInQueue) -> $('#games-in-queue').text numberOfGamesInQueue - $.ajax '/queue/messagesInQueueCount', {success} + $.ajax '/queue/messagesInQueueCount', cache: false, success: success updateSimulationStatus: (simulationStatus, sessions) -> if simulationStatus is 'Fetching simulation data!' @@ -131,15 +131,14 @@ class SimulatorsLeaderboardData extends CocoClass unless @me.get('anonymous') score = @me.get('simulatedBy') or 0 queueSuccess = (@numberOfGamesInQueue) => - promises.push $.ajax '/queue/messagesInQueueCount', {success: queueSuccess} + promises.push $.ajax '/queue/messagesInQueueCount', {success: queueSuccess, cache: false} @playersAbove = new SimulatorsLeaderboardCollection({order: 1, scoreOffset: score, limit: 4}) promises.push @playersAbove.fetch() if score @playersBelow = new SimulatorsLeaderboardCollection({order: -1, scoreOffset: score, limit: 4}) promises.push @playersBelow.fetch() success = (@myRank) => - - promises.push $.ajax "/db/user/me/simulator_leaderboard_rank?scoreOffset=#{score}", {success} + promises.push $.ajax("/db/user/me/simulator_leaderboard_rank?scoreOffset=#{score}", cache: false, success: success) @promise = $.when(promises...) @promise.then @onLoad diff --git a/app/views/modal/EmployerSignupModal.coffee b/app/views/modal/EmployerSignupModal.coffee index f7b8c547b..9f120d654 100644 --- a/app/views/modal/EmployerSignupModal.coffee +++ b/app/views/modal/EmployerSignupModal.coffee @@ -75,7 +75,7 @@ module.exports = class EmployerSignupModal extends ModalView handleAgreementSuccess: (result) -> window.tracker?.trackEvent 'Employer Agreed to Contract' - me.fetch() + me.fetch cache: false window.location.reload() handleAgreementFailure: (error) -> @@ -130,7 +130,7 @@ module.exports = class EmployerSignupModal extends ModalView @listenTo me, 'sync', => @render() IN.parse() - me.fetch() + me.fetch cache: false destroy: -> reloadWhenClosed = @reloadWhenClosed diff --git a/app/views/modal/ModelModal.coffee b/app/views/modal/ModelModal.coffee index f074148d9..20465586a 100644 --- a/app/views/modal/ModelModal.coffee +++ b/app/views/modal/ModelModal.coffee @@ -14,7 +14,7 @@ module.exports = class ModelModal extends ModalView @models = options.models for model in @models when not model.loaded @supermodel.loadModel model, 'source_document' - model.fetch() + model.fetch cache: false getRenderData: -> c = super() diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 976f4425a..22dcdc05d 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -62,7 +62,7 @@ module.exports = class CampaignView extends RootView @terrain ?= 'dungeon' @levelStatusMap = {} @levelPlayCountMap = {} - @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', null, 0).model + @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', {cache: false}, 0).model @listenToOnce @sessions, 'sync', @onSessionsLoaded unless @terrain @campaigns = @supermodel.loadCollection(new CampaignsCollection(), 'campaigns', null, 0).model @@ -85,7 +85,7 @@ module.exports = class CampaignView extends RootView console.warn 'Filling in a gap for reward', group, reward earned[group].push(reward) - @supermodel.loadCollection(@earnedAchievements, 'achievements') + @supermodel.loadCollection(@earnedAchievements, 'achievements', {cache: false}) @listenToOnce @campaign, 'sync', @getLevelPlayCounts $(window).on 'resize', @onWindowResize @@ -375,7 +375,7 @@ module.exports = class CampaignView extends RootView sessionURL = "/db/level/#{levelSlug}/session" @preloadedSession = new LevelSession().setURL sessionURL @listenToOnce @preloadedSession, 'sync', @onSessionPreloaded - @preloadedSession = @supermodel.loadModel(@preloadedSession, 'level_session').model + @preloadedSession = @supermodel.loadModel(@preloadedSession, 'level_session', {cache: false}).model @preloadedSession.levelSlug = levelSlug onSessionPreloaded: (session) -> diff --git a/app/views/play/MainPlayView.coffee b/app/views/play/MainPlayView.coffee index 6cb3b4574..4635c634d 100644 --- a/app/views/play/MainPlayView.coffee +++ b/app/views/play/MainPlayView.coffee @@ -19,7 +19,7 @@ module.exports = class MainPlayView extends RootView super options @levelStatusMap = {} @levelPlayCountMap = {} - @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', null, 0).model + @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', {cache: false}, 0).model @listenToOnce @sessions, 'sync', @onSessionsLoaded @getLevelPlayCounts() diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee index 0c0f27025..2530e00d5 100644 --- a/app/views/play/SpectateView.coffee +++ b/app/views/play/SpectateView.coffee @@ -294,6 +294,7 @@ module.exports = class SpectateLevelView extends RootView $.ajax url: randomSessionPairURL type: 'GET' + cache: false complete: (jqxhr, textStatus) -> if textStatus isnt 'success' cb('error', jqxhr.statusText) diff --git a/app/views/play/level/modal/VictoryModal.coffee b/app/views/play/level/modal/VictoryModal.coffee index 502020980..51a0e34ab 100644 --- a/app/views/play/level/modal/VictoryModal.coffee +++ b/app/views/play/level/modal/VictoryModal.coffee @@ -39,7 +39,7 @@ module.exports = class VictoryModal extends ModalView url = "/db/level/#{@level.id}/feedback" @feedback = new LevelFeedback() @feedback.setURL url - @feedback.fetch() + @feedback.fetch cache: false @listenToOnce(@feedback, 'sync', -> @onFeedbackLoaded()) @listenToOnce(@feedback, 'error', -> @onFeedbackNotFound()) diff --git a/app/views/play/modal/LeaderboardTabView.coffee b/app/views/play/modal/LeaderboardTabView.coffee index 33faa4680..7912af634 100644 --- a/app/views/play/modal/LeaderboardTabView.coffee +++ b/app/views/play/modal/LeaderboardTabView.coffee @@ -67,7 +67,7 @@ module.exports = class LeaderboardTabView extends CocoView return if @hasShown @hasShown = true topScores = new TopScoresCollection @level, @scoreType, @timespan - @sessions = @supermodel.loadCollection(topScores, 'sessions', null, 0).model + @sessions = @supermodel.loadCollection(topScores, 'sessions', {cache: false}, 0).model onClickRow: (e) -> sessionID = $(e.target).closest('tr').data 'session-id' diff --git a/app/views/play/modal/PlayAchievementsModal.coffee b/app/views/play/modal/PlayAchievementsModal.coffee index 2601abb2e..a8d6f3640 100644 --- a/app/views/play/modal/PlayAchievementsModal.coffee +++ b/app/views/play/modal/PlayAchievementsModal.coffee @@ -36,9 +36,9 @@ module.exports = class PlayAchievementsModal extends ModalView earnedAchievementsFetcher.setProjection([ 'achievement' ]) achievementsFetcher.skip = 0 - achievementsFetcher.fetch({data: {skip: 0, limit: PAGE_SIZE}}) + achievementsFetcher.fetch cache: false, data: {skip: 0, limit: PAGE_SIZE} earnedAchievementsFetcher.skip = 0 - earnedAchievementsFetcher.fetch({data: {skip: 0, limit: PAGE_SIZE}}) + earnedAchievementsFetcher.fetch cache: false, data: {skip: 0, limit: PAGE_SIZE} @listenTo achievementsFetcher, 'sync', @onAchievementsLoaded @listenTo earnedAchievementsFetcher, 'sync', @onEarnedAchievementsLoaded @@ -53,7 +53,7 @@ module.exports = class PlayAchievementsModal extends ModalView @achievements.add(fetcher.models) if needMore fetcher.skip += PAGE_SIZE - fetcher.fetch({data: {skip: fetcher.skip, limit: PAGE_SIZE}}) + fetcher.fetch cache: false, data: {skip: fetcher.skip, limit: PAGE_SIZE} else @stopListening(fetcher) @onEverythingLoaded() @@ -64,7 +64,7 @@ module.exports = class PlayAchievementsModal extends ModalView @earnedMap[earned.get('achievement')] = earned if needMore fetcher.skip += PAGE_SIZE - fetcher.fetch({data: {skip: fetcher.skip, limit: PAGE_SIZE}}) + fetcher.fetch cache: false, data: {skip: fetcher.skip, limit: PAGE_SIZE} else @stopListening(fetcher) @onEverythingLoaded() diff --git a/app/views/user/JobProfileView.coffee b/app/views/user/JobProfileView.coffee index ae31f5894..9f83db9a3 100644 --- a/app/views/user/JobProfileView.coffee +++ b/app/views/user/JobProfileView.coffee @@ -85,7 +85,7 @@ module.exports = class JobProfileView extends UserView # Mimicking how the VictoryModal fetches LevelFeedback @remark = new UserRemark() @remark.setURL "/db/user/#{@userID}/remark" - @remark.fetch() + @remark.fetch cache: false @listenToOnce @remark, 'sync', @onRemarkLoaded @listenToOnce @remark, 'error', @onRemarkNotFound diff --git a/app/views/user/MainUserView.coffee b/app/views/user/MainUserView.coffee index e5af3b6cc..fdf88a5bd 100644 --- a/app/views/user/MainUserView.coffee +++ b/app/views/user/MainUserView.coffee @@ -15,7 +15,7 @@ class LevelSessionsCollection extends CocoCollection module.exports = class MainUserView extends UserView id: 'user-home' template: template - + events: 'click .more-button': 'onClickMoreButton' @@ -54,11 +54,11 @@ module.exports = class MainUserView extends UserView @supermodel.resetProgress() @levelSessions = new LevelSessionsCollection @user.getSlugOrID() @earnedAchievements = new EarnedAchievementCollection @user.getSlugOrID() - @supermodel.loadCollection @levelSessions, 'levelSessions' - @supermodel.loadCollection @earnedAchievements, 'earnedAchievements' + @supermodel.loadCollection @levelSessions, 'levelSessions', {cache: false} + @supermodel.loadCollection @earnedAchievements, 'earnedAchievements', {cache: false} super() onClickMoreButton: (e) -> panel = $(e.target).closest('.panel') panel.find('tr.hide').removeClass('hide') - panel.find('.panel-footer').remove() \ No newline at end of file + panel.find('.panel-footer').remove() diff --git a/scripts/analytics/mixpanelABGemPrompt.py b/scripts/analytics/mixpanelABGemPrompt.py new file mode 100644 index 000000000..43682f4ea --- /dev/null +++ b/scripts/analytics/mixpanelABGemPrompt.py @@ -0,0 +1,122 @@ +# Calculate gem prompt A/B test results + +# TODO: Why is no-prompt group 50% larger? + +import sys +from mixpanel import Mixpanel + +try: + import json +except ImportError: + import simplejson as json + +# NOTE: mixpanel dates are by day and inclusive +# E.g. '2014-12-08' is any date that day, up to 2014-12-09 12am + +if __name__ == '__main__': + if not len(sys.argv) is 3: + print "Script format: <script> <api_key> <api_secret>" + else: + api_key = sys.argv[1] + api_secret = sys.argv[2] + api = Mixpanel( + api_key = api_key, + api_secret = api_secret + ) + + startDate = '2015-01-15' + startDate = '2014-11-25' + endDate = '2015-02-11' + + print("Requesting data for {0} to {1}".format(startDate, endDate)) + data = api.request(['export'], { + 'event' : ['Started purchase', 'Finished gem purchase'], + 'from_date' : startDate, + 'to_date' : endDate + }) + + userProgressionGroupA = {} + userProgressionGroupB = {} + + lines = data.split('\n') + print "Received %d entries" % len(lines) + for line in lines: + try: + if len(line) is 0: continue + eventData = json.loads(line) + eventName = eventData['event'] + properties = eventData['properties'] + if not eventName in ['Started purchase', 'Finished gem purchase']: + print 'Unexpected event ' + eventName + break + if 'distinct_id' in properties and 'gemPromptGroup' in properties: + userID = properties['distinct_id'] + if properties['gemPromptGroup'] == 'prompt': + if not userID in userProgressionGroupA: + userProgressionGroupA[userID] = { + 'Started purchase': 0, + 'Finished gem purchase': 0 + } + userProgressionGroupA[userID][eventName] += 1 + elif properties['gemPromptGroup'] == 'no-prompt': + if not userID in userProgressionGroupB: + userProgressionGroupB[userID] = { + 'Started purchase': 0, + 'Finished gem purchase': 0 + } + userProgressionGroupB[userID][eventName] += 1 + else: + print "Unexpected group:", properties['gemPromptGroup'] + print properties + print line + break + except: + print "Unexpected error:", sys.exc_info()[0] + print line + break + + try: + started = converted = 0 + startedGroupA = convertedGroupA = 0 + startedGroupB = convertedGroupB = 0 + + # Group A + print("Processing Group A") + for key, item in userProgressionGroupA.iteritems(): + if item['Finished gem purchase'] > 0: + converted += 1 + convertedGroupA += 1 + # TODO: is our distinct_id correct? We hit this at least once. + # if item['Finished gem purchase'] > 1: + # print "User multiple subcription purchases?" + # print item + elif item['Started purchase'] > 0: + started += 1 + startedGroupA += 1 + else: + print "User without any hits?" + print item + break + + # Group B + print("Processing Group B") + for key, item in userProgressionGroupB.iteritems(): + if item['Finished gem purchase'] > 0: + converted += 1 + convertedGroupB += 1 + elif item['Started purchase'] > 0: + started += 1 + startedGroupB += 1 + else: + print "User without any hits?" + print item + break + + print("Overall") + print("started {0} converted {1} rate {2}%".format(started, converted, float(converted) / started * 100)) + print("Group prompt") + print("startedGroupA {0} convertedGroupA {1} rate {2}%".format(startedGroupA, convertedGroupA, float(convertedGroupA) / startedGroupA * 100)) + print("Group no-prompt") + print("startedGroupB {0} convertedGroupB {1} rate {2}%".format(startedGroupB, convertedGroupB, float(convertedGroupB) / startedGroupB * 100)) + except: + print "Unexpected error:", sys.exc_info()[0] diff --git a/scripts/analytics/mongodb/queries/abGemPromptGroup.js b/scripts/analytics/mongodb/queries/abGemPromptGroup.js index cdc0a3a34..79cb78364 100644 --- a/scripts/analytics/mongodb/queries/abGemPromptGroup.js +++ b/scripts/analytics/mongodb/queries/abGemPromptGroup.js @@ -4,11 +4,14 @@ // Usage: // mongo <address>:<port>/<database> <script file> -u <username> -p <password> +// TODO: Why is no-prompt group 50% larger? + load('abTestHelpers.js'); var scriptStartTime = new Date(); try { var startDay = '2014-11-24' + // startDay = '2015-01-15' log("Today is " + new Date().toISOString().substr(0, 10)); log("Start day is " + startDay); diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee index b5232898f..f97403e1d 100644 --- a/server/queues/scoring.coffee +++ b/server/queues/scoring.coffee @@ -124,7 +124,8 @@ module.exports.getTwoGames = (req, res) -> #if userIsAnonymous req then return errors.unauthorized(res, 'You need to be logged in to get games.') humansGameID = req.body.humansGameID ogresGameID = req.body.ogresGameID - ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span', 'dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove'] + #ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span'] # Let's not give any extra simulations to old ladders. + ladderGameIDs = ['dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove'] levelID = _.sample ladderGameIDs sortLimit = 200 unless ogresGameID and humansGameID