mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-11 08:11:21 -05:00
300c81e72b
* Restrict patch handling properly * Fix #3860, CS 2 description * i18nCoverage is updated when new translations are auto-accepted * Course patches are listed on PendingPatchesView properly * 'Artisan' permission allows editing course translations
112 lines
3.8 KiB
CoffeeScript
112 lines
3.8 KiB
CoffeeScript
RootView = require 'views/core/RootView'
|
|
template = require 'templates/admin/pending-patches-view'
|
|
CocoCollection = require 'collections/CocoCollection'
|
|
Patch = require 'models/Patch'
|
|
|
|
class PendingPatchesCollection extends CocoCollection
|
|
url: '/db/patch?view=pending'
|
|
model: Patch
|
|
|
|
module.exports = class PendingPatchesView extends RootView
|
|
id: 'pending-patches-view'
|
|
template: template
|
|
|
|
constructor: (options) ->
|
|
super options
|
|
@nameMap = {}
|
|
@patches = @supermodel.loadCollection(new PendingPatchesCollection(), 'patches', {cache: false}).model
|
|
|
|
onLoaded: ->
|
|
super()
|
|
@loadUserNames()
|
|
@loadAllModelNames()
|
|
|
|
getRenderData: ->
|
|
c = super()
|
|
c.patches = []
|
|
if @supermodel.finished()
|
|
comparator = (m) -> m.target.collection + ' ' + m.target.original
|
|
patches = _.sortBy (_.clone(patch.attributes) for patch in @patches.models), comparator
|
|
c.patches = _.uniq patches, comparator
|
|
for patch in c.patches
|
|
patch.creatorName = @nameMap[patch.creator] or patch.creator
|
|
if name = @nameMap[patch.target.original]
|
|
patch.name = name
|
|
patch.slug = _.string.slugify name
|
|
patch.url = '/editor/' + switch patch.target.collection
|
|
when 'level', 'achievement', 'article', 'campaign', 'poll'
|
|
"#{patch.target.collection}/#{patch.slug}"
|
|
when 'thang_type'
|
|
"thang/#{patch.slug}"
|
|
when 'level_system', 'level_component'
|
|
"level/items?#{patch.target.collection}=#{patch.slug}"
|
|
when 'course'
|
|
"course/#{patch.slug}"
|
|
else
|
|
console.log "Where do we review a #{patch.target.collection} patch?"
|
|
''
|
|
c
|
|
|
|
loadUserNames: ->
|
|
# Only fetch the names for the userIDs we don't already have in @nameMap
|
|
ids = []
|
|
for patch in @patches.models
|
|
unless id = patch.get('creator')
|
|
console.error 'Found bad user ID in malformed patch', patch
|
|
continue
|
|
ids.push id unless @nameMap[id]
|
|
ids = _.uniq ids
|
|
return unless ids.length
|
|
|
|
success = (nameMap) =>
|
|
return if @destroyed
|
|
for patch in @patches.models
|
|
creatorID = patch.get 'creator'
|
|
continue if @nameMap[creatorID]
|
|
creator = nameMap[creatorID]
|
|
name = creator?.name
|
|
name ||= creator.firstName + ' ' + creator.lastName if creator?.firstName
|
|
name ||= "Anonymous #{creatorID.substr(18)}" if creator
|
|
name ||= '<bad patch data>'
|
|
if name.length > 21
|
|
name = name.substr(0, 18) + '...'
|
|
@nameMap[creatorID] = name
|
|
@render()
|
|
|
|
userNamesRequest = @supermodel.addRequestResource 'user_names', {
|
|
url: '/db/user/-/names'
|
|
data: {ids: ids}
|
|
method: 'POST'
|
|
success: success
|
|
}, 0
|
|
userNamesRequest.load()
|
|
|
|
loadAllModelNames: ->
|
|
allPatches = (p.attributes for p in @patches.models)
|
|
allPatches = _.groupBy allPatches, (p) -> p.target.collection
|
|
@loadCollectionModelNames collection, patches for collection, patches of allPatches
|
|
|
|
loadCollectionModelNames: (collection, patches) ->
|
|
ids = (patch.target.original for patch in patches when not @nameMap[patch.target.original])
|
|
ids = _.uniq ids
|
|
return unless ids.length
|
|
success = (nameMapArray) =>
|
|
return if @destroyed
|
|
nameMap = {}
|
|
for model in nameMapArray
|
|
nameMap[model.original or model._id] = model.name
|
|
for patch in patches
|
|
original = patch.target.original
|
|
name = nameMap[original]
|
|
if name and name.length > 60
|
|
name = name.substr(0, 57) + '...'
|
|
@nameMap[original] = name
|
|
@render()
|
|
|
|
modelNamesRequest = @supermodel.addRequestResource 'patches', {
|
|
url: "/db/#{collection.replace('_', '.')}/names"
|
|
data: {ids: ids}
|
|
method: 'POST'
|
|
success: success
|
|
}, 0
|
|
modelNamesRequest.load()
|