Make WordPress Core

Ticket #40672: 40672.2.diff

File 40672.2.diff, 4.2 KB (added by adamsilverstein, 6 years ago)
  • src/wp-includes/js/wp-api.js

    diff --git src/wp-includes/js/wp-api.js src/wp-includes/js/wp-api.js
    index 31886d280b..e114edf12a 100644
     
    12271227                                        routeName = 'me';
    12281228                                }
    12291229
     1230                                var initializeModel = function( attributes, options ) {
     1231                                        wp.api.WPApiBaseModel.prototype.initialize.call( this, attributes, options );
     1232
     1233                                        /**
     1234                                         * Determine if a model requires ?force=true to actually delete them.
     1235                                         */
     1236                                        if (
     1237                                                ! _.isEmpty(
     1238                                                        _.filter(
     1239                                                                this.endpoints,
     1240                                                                function( endpoint ) {
     1241                                                                        return (
     1242
     1243                                                                                // Does the method support DELETE?
     1244                                                                                'DELETE' === endpoint.methods[0] &&
     1245
     1246                                                                                // Exclude models that support trash (Post, Page).
     1247                                                                                (
     1248                                                                                        ! _.isUndefined( endpoint.args.force ) &&
     1249                                                                                        ! _.isUndefined( endpoint.args.force.description ) &&
     1250                                                                                        'Whether to bypass trash and force deletion.' !== endpoint.args.force.description
     1251                                                                                )
     1252                                                                        );
     1253                                                                }
     1254                                                        )
     1255                                                )
     1256                                        ) {
     1257                                                this.requireForceForDelete = true;
     1258                                        }
     1259                                };
     1260
    12301261                                // If the model has a parent in its route, add that to its class name.
    12311262                                if ( '' !== parentName && parentName !== routeName ) {
    12321263                                        modelClassName = wp.api.utils.capitalizeAndCamelCaseDashes( parentName ) + wp.api.utils.capitalizeAndCamelCaseDashes( routeName );
     
    12661297                                                // Include the array of route methods for easy reference.
    12671298                                                methods: modelRoute.route.methods,
    12681299
    1269                                                 initialize: function( attributes, options ) {
    1270                                                         wp.api.WPApiBaseModel.prototype.initialize.call( this, attributes, options );
    1271 
    1272                                                         /**
    1273                                                          * Posts and pages support trashing, other types don't support a trash
    1274                                                          * and require that you pass ?force=true to actually delete them.
    1275                                                          *
    1276                                                          * @todo we should be getting trashability from the Schema, not hard coding types here.
    1277                                                          */
    1278                                                         if (
    1279                                                                 'Posts' !== this.name &&
    1280                                                                 'Pages' !== this.name &&
    1281                                                                 _.includes( this.methods, 'DELETE' )
    1282                                                         ) {
    1283                                                                 this.requireForceForDelete = true;
    1284                                                         }
    1285                                                 }
     1300                                                // Include the array of route endpoints for easy reference.
     1301                                                endpoints: modelRoute.route.endpoints,
     1302
     1303                                                initialize: initializeModel
    12861304                                        } );
    12871305                                } else {
    12881306
     
    13171335                                                name: modelClassName,
    13181336
    13191337                                                // Include the array of route methods for easy reference.
    1320                                                 methods: modelRoute.route.methods
     1338                                                methods: modelRoute.route.methods,
     1339
     1340                                                // Include the array of route endpoints for easy reference.
     1341                                                endpoints: modelRoute.route.endpoints,
     1342
     1343                                                initialize: initializeModel
    13211344                                        } );
    13221345                                }
    13231346
  • tests/qunit/wp-includes/js/wp-api.js

    diff --git tests/qunit/wp-includes/js/wp-api.js tests/qunit/wp-includes/js/wp-api.js
    index e904ccaec8..b4525bd2a6 100644
     
    343343                } );
    344344        });
    345345
     346        // Test that models have the correct requireForceForDelete setting.
     347        var modelsThatNeedrequireForceForDelete = [
     348                {
     349                        name: 'Category',
     350                        expect: true
     351                },
     352                {
     353                        name: 'Comment',
     354                        expect: undefined
     355                },
     356                {
     357                        name: 'Media',
     358                        expect: undefined
     359                },
     360                {
     361                        name: 'Page',
     362                        expect: undefined
     363                },
     364                {
     365                        name: 'PageRevision',
     366                        expect: true
     367                },
     368                {
     369                        name: 'Post',
     370                        expect: undefined
     371                },
     372                {
     373                        name: 'PostRevision',
     374                        expect: true
     375                },
     376                {
     377                        name: 'Status',
     378                        expect: undefined
     379                },
     380                {
     381                        name: 'Tag',
     382                        expect: true
     383                },
     384                {
     385                        name: 'Taxonomy',
     386                        expect: undefined
     387                },
     388                {
     389                        name: 'Type',
     390                        expect: undefined
     391                },
     392                {
     393                        name: 'User',
     394                        expect: true
     395                }
     396        ];
     397
     398        _.each( modelsThatNeedrequireForceForDelete, function( model ) {
     399                QUnit.test( 'Test requireForceForDelete is correct for ' + model.name, function( assert ) {
     400
     401                        var done = assert.async();
     402
     403                        assert.expect( 1 );
     404
     405                        wp.api.loadPromise.done( function() {
     406
     407                                var theModel = new wp.api.models[ model.name ]();
     408
     409                                assert.equal(
     410                                        theModel.requireForceForDelete,
     411                                        model.expect,
     412                                        'wp.api.models.' + model.name + '.requireForceForDelete should be ' + ( model.expect ? 'true' : 'false' ) + '.'
     413                                );
     414
     415                                // Trigger Qunit async completion.
     416                                done();
     417                        } );
     418                } );
     419        } );
     420
     421
    346422} )( window.QUnit );