Skip to content

Commit

Permalink
Initial embedded relationships support 1.0b4
Browse files Browse the repository at this point in the history
  • Loading branch information
escalant3 committed Jan 11, 2014
1 parent aa52b5d commit 0f4cded
Showing 1 changed file with 65 additions and 6 deletions.
71 changes: 65 additions & 6 deletions djangoapp/tasks/static/tasks/js/libs/tastypie_serializer.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,75 @@ DS.DjangoTastypieSerializer = DS.RESTSerializer.extend({

extractSingle: function(store, primaryType, payload, recordId, requestType) {
var newPayload = {};
this.extractEmbeddedFromPayload(store, primaryType, payload);
newPayload[primaryType.typeKey] = payload;

return this._super(store, primaryType, newPayload, recordId, requestType);
},

isEmbedded: function(relOptions) {
return !!relOptions && (relOptions.embedded === 'load' || relOptions.embedded === 'always');
},

extractEmbeddedFromPayload: function(store, type, payload) {
var self = this;
type.eachRelationship(function(key, relationship) {
var relOptions = relationship.options;

if (self.isEmbedded(relOptions)) {
if (relationship.kind === 'hasMany') {
self.extractEmbeddedFromHasMany(store, key, relationship, payload, relOptions);
} else if (relationship.kind === 'belongsTo') {
self.extractEmbeddedFromBelongsTo(store, key, relationship, payload, relOptions);
}
}
});
},

extractEmbeddedFromHasMany: function(store, key, relationship, payload, config) {
var self = this;
var serializer = store.serializerFor(relationship.type.typeKey),
primaryKey = get(this, 'primaryKey');

var ids = [];

if (!payload[key]) {
return;
}

Ember.EnumerableUtils.forEach(payload[key], function(data) {
var embeddedType = store.modelFor(relationship.type.typeKey);

self.extractEmbeddedFromPayload.call(serializer, store, embeddedType, data);

data = serializer.normalize(embeddedType, data, embeddedType.typeKey);

ids.push(serializer.relationshipToResourceUri(relationship, data));
store.push(embeddedType, data);
});

payload[key] = ids;
},

extractEmbeddedFromBelongsTo: function(store, key, relationship, payload, config) {
var serializer = store.serializerFor(relationship.type.typeKey),
primaryKey = get(this, 'primaryKey');

if (!payload[key]) {
return;
}

var data = payload[key];
var embeddedType = store.modelFor(relationship.type.typeKey);

extractEmbeddedFromPayload.call(serializer, store, embeddedType, data);

data = serializer.normalize(embeddedType, data, embeddedType.typeKey);
payload[key] = serializer.relationshipToResourceUri(relationship, data);

store.push(embeddedType, data);
},

relationshipToResourceUri: function (relationship, value){
if (!value)
return value;
Expand Down Expand Up @@ -202,13 +266,8 @@ DS.DjangoTastypieSerializer = DS.RESTSerializer.extend({

var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);

// TODO
function isEmbedded(config) {
return false;
}

if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') {
if (isEmbedded(config)) {
if (this.isEmbedded(config)) {
json[key] = get(record, key).map(function (relation) {
var data = relation.serialize();
return data;
Expand Down

0 comments on commit 0f4cded

Please sign in to comment.