var model = DS.Model.extend({
  annotations: DS.attr(),
  tags: DS.attr(),
  description: DS.attr('string'),
  due: DS.attr('date'),
  entry: DS.attr('date'),
  modified: DS.attr('date'),
  priority: DS.attr('string'),
  resource_uri: DS.attr('string'),
  start: DS.attr('date'),
  wait: DS.attr('date'),
  scheduled: DS.attr('date'),
  'status': DS.attr('string'),
  urgency: DS.attr('number'),
  uuid: DS.attr('string'),
  depends: DS.attr('string'),
  blocks: DS.attr('string'),
  project: DS.attr('string'),
  imask: DS.attr('number'),
  udas: DS.attr(),

  editable: function(){
    if (this.get('status') == 'pending') {
      return true;
    }
    return false;
  }.property('status'),

  icon: function() {
    if (this.get('status') == 'completed') {
      return 'fa-check-circle-o';
    } else if (this.get('start')) {
      return 'fa-asterisk';
    } else if (this.get('due')) {
      return 'fa-clock-o';
    } else {
      return 'fa-circle-o';
    }
  }.property('status', 'start', 'due'),

  taskwarrior_class: function() {
    var value = '';
    if (this.get('start')) {
      value = 'active';
    } else if (this.get('is_blocked')) {
      value = 'blocked';
    } else if (this.get('is_blocking')) {
      value = 'blocking';
    } else if (moment(this.get('due')).isBefore(moment())) {
      value = 'overdue';
    } else if (moment().format('L') === moment(this.get('due')).format('L')) {
      value = 'due__today';
    } else if ( // Truncate date to date only
        moment(
          moment().format('YYYYMMDD'),
          'YYYYMMDD'
        ).add('days', 7).isAfter(this.get('due'))
    ) {
      value = 'due';
    } else if (this.get('imask')) {
      value = 'recurring';
    } else if (this.get('priority') == 'H') {
      value = 'pri__H';
    } else if (this.get('priority') == 'M') {
      value = 'pri__M';
    } else if (this.get('priority') == 'L') {
      value = 'pri__L';
    } else if (this.get('tags')) {
      value = 'tagged';
    }
    return value;
  }.property('status', 'urgency', 'start', 'due', 'is_blocked', 'is_blocking'),

  is_blocked: function() {
    return this.get('dependent_tickets').any(
      function(item, idx, enumerable) {
        if ($.inArray(item.get('status'), ['completed', 'deleted']) > -1) {
          return false;
        }
        return true;
      }
    );
  }.property('dependent_tickets'),

  is_blocking: function() {
    return this.get('blocked_tickets').any(
      function(item, idx, enumerable) {
        if ($.inArray(item.get('status'), ['completed', 'deleted']) > -1) {
          return false;
        }
        return true;
      }
    );
  }.property('blocked_tickets'),

  processed_annotations: function() {
    var value = this.get('annotations');
    if (value) {
      for (var i = 0; i < value.length; i++) {
        value[i] = {
          entry: new Date(Ember.Date.parse(value[i].entry)),
          description: value[i].description
        };
      }
    } else {
      return [];
    }
    return value;
  }.property('annotations'),

  processed_udas: function() {
    var value = [];
    for(var v in this.get('udas')) {
      value.push(this.get('udas')[v]);
    }
    return value;
  }.property('udas'),

  get_values_async: function(value, values) {
    var ticket_ids = value.split(',');
    var add_value_to_values = function(value) {
      values.pushObject(value);
    };
    for (var i = 0; i < ticket_ids.length; i++) {
      this.store.find('task', ticket_ids[i]).then(
        add_value_to_values.bind(this)
      );
    }
  },

  _string_field_to_data: function(field_name) {
    var value = this.get(field_name);
    var values = [];
    if (value) {
      Ember.run.scheduleOnce(
        'afterRender', this, 'get_values_async', value, values
      );
    }
    return values;
  },

  dependent_tickets: function(){
    return this._string_field_to_data('depends');
  }.property('depends'),

  blocked_tickets: function(){
    return this._string_field_to_data('blocks');
  }.property('blocks'),

  as_json: function() {
    return JSON.stringify(this.store.serialize(this));
  }.property()
});

module.exports = model;

@@ -3212,52 +3212,132 @@
 %0A%0A  
-get_values_async: function(value, values
+_string_field_to_data: function(field_name) %7B%0A    var value = this.get(field_name);%0A    var values = %5B%5D;%0A    if (value
 ) %7B%0A
+  
     
@@ -3367,24 +3367,48 @@
 split(',');%0A
+      var pushed = 0;%0A  
     var add_
@@ -3445,24 +3445,26 @@
 ue) %7B%0A      
+  
 values.pushO
@@ -3473,24 +3473,26 @@
 ect(value);%0A
+  
     %7D;%0A    f
@@ -3486,24 +3486,26 @@
      %7D;%0A    
+  
 for (var i =
@@ -3534,24 +3534,26 @@
 gth; i++) %7B%0A
+  
       this.s
@@ -3599,16 +3599,18 @@
         
+  
 add_valu
@@ -3642,248 +3642,20 @@
     
-);%0A    %7D%0A  %7D,%0A%0A  _string_field_to_data: function(field_name) %7B%0A    var value = this.get(field_name);%0A    var values = %5B%5D;%0A    if (value) %7B%0A      Ember.run.scheduleOnce(%0A        'afterRender', this, 'get_values_async', value, values%0A      );
+  );%0A      %7D
 %0A   
@@ -3717,32 +3717,72 @@
 on()%7B%0A    return
+ DS.PromiseArray.create(%7B%0A      promise:
  this._string_fi
@@ -3803,16 +3803,23 @@
 epends')
+%0A    %7D)
 ;%0A  %7D.pr
@@ -3875,24 +3875,64 @@
 %7B%0A    return
+ DS.PromiseArray.create(%7B%0A      promise:
  this._strin
@@ -3956,16 +3956,23 @@
 blocks')
+%0A    %7D)
 ;%0A  %7D.pr

Return a promise rather than the actual result.