Index: modules/node/content_types.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/content_types.inc,v
retrieving revision 1.79
diff -u -r1.79 content_types.inc
--- modules/node/content_types.inc	1 Jul 2009 12:10:32 -0000	1.79
+++ modules/node/content_types.inc	2 Jul 2009 12:20:24 -0000
@@ -182,13 +182,18 @@
     '#default_value' => variable_get('node_submitted_' . $type->type, TRUE),
     '#description' => t('Enable the <em>submitted by Username on date</em> text.'),
   );
-  $form['display']['teaser_length'] = array(
-    '#type' => 'select', 
-    '#title' => t('Length of trimmed posts'),
-    '#default_value' => variable_get('teaser_length_' . $type->type, 600),
-    '#options' => drupal_map_assoc(array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000), '_node_characters'),
-    '#description' => t("The maximum number of characters used in the trimmed version of a post. Drupal will use this setting to determine at which offset long posts should be trimmed. The trimmed version of a post is typically used as a teaser when displaying the post on the main page, in XML feeds, etc. To disable teasers, set to 'Unlimited'.")
-  );
+  // We don't need a teaser length if the content type has no body
+  if ($type->has_body) {
+    $instance = field_info_instance('body', $type->type);
+    $summary_length = $instance['settings']['summary_length'] ? $instance['settings']['summary_length'] : 600;
+    $form['display']['teaser_length'] = array(
+      '#type' => 'select', 
+      '#title' => t('Length of trimmed posts'),
+      '#default_value' => $summary_length,
+      '#options' => drupal_map_assoc(array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000), '_node_characters'),
+      '#description' => t("The maximum number of characters used in the trimmed version of a post. Drupal will use this setting to determine at which offset long posts should be trimmed. The trimmed version of a post is typically used as a teaser when displaying the post on the main page, in XML feeds, etc. To disable teasers, set to 'Unlimited'.")
+    );
+  }
   $form['old_type'] = array(
     '#type' => 'value',
     '#value' => $type->type,
@@ -309,6 +314,7 @@
   $type->custom = $form_state['values']['custom'];
   $type->modified = TRUE;
   $type->locked = $form_state['values']['locked'];
+  $type->summary_length = $form_state['values']['teaser_length'];
 
   if ($op == t('Reset to defaults')) {
     node_type_reset($type);
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1077
diff -u -r1.1077 node.module
--- modules/node/node.module	2 Jul 2009 04:27:23 -0000	1.1077
+++ modules/node/node.module	2 Jul 2009 12:20:25 -0000
@@ -465,7 +465,10 @@
         'bundle' => $type->type,
         'label' => $type->body_label,
         'widget_type' => 'text_textarea_with_summary',
-        'settings' => array('display_summary' => TRUE),
+        'settings' => array(
+          'display_summary' => TRUE,
+          'summary_length' => 600,
+        ),
 
         // With no UI in core, we have to define default
         // formatters for the teaser and full view.
@@ -487,6 +490,7 @@
     else {
       $instance['label'] = $type->body_label;
       $instance['settings']['display_summary'] = TRUE;
+      $instance['settings']['summary_length'] = $type->summary_length;
       field_update_instance($instance);
     }
   }
Index: modules/field/modules/text/text.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v
retrieving revision 1.14
diff -u -r1.14 text.module
--- modules/field/modules/text/text.module	1 Jul 2009 12:10:32 -0000	1.14
+++ modules/field/modules/text/text.module	2 Jul 2009 12:20:23 -0000
@@ -68,7 +68,7 @@
       'label' => t('Long text and summary'),
       'description' => t('This field stores long text in the database along with optional summary text.'),
       'settings' => array('max_length' => ''),
-      'instance_settings' => array('text_processing' => 1, 'display_summary' => 0),
+      'instance_settings' => array('text_processing' => 1, 'display_summary' => 0, 'summary_length' => 600),
       'default_widget' => 'text_textarea_with_summary',
       'default_formatter' => 'text_summary_or_trimmed',
     ),
@@ -214,9 +214,9 @@
         }
       }
       else {
-        $item[$delta]['safe'] = check_plain($item['value']);
+        $items[$delta]['safe'] = check_plain($item['value']);
         if ($field['type'] == 'text_with_summary') {
-          $item[$delta]['safe_summary'] = check_plain($item['summary']);
+          $items[$delta]['safe_summary'] = check_plain($item['summary']);
         }
       }
     }
@@ -300,7 +300,10 @@
 function theme_field_formatter_text_trimmed($element) {
   $field = field_info_field($element['#field_name']);
   $instance = field_info_instance($element['#field_name'], $element['#bundle']);
-  return text_summary($element['#item']['safe'], $instance['settings']['text_processing'] ? $element['#item']['format'] : NULL);
+  // @todo
+  // Make the size depend on the build type.
+  $size = $instance['settings']['summary_length'];
+  return text_summary($element['#item']['safe'], $instance['settings']['text_processing'] ? $element['#item']['format'] : NULL, $size);
 }
 
 /**
@@ -317,7 +320,9 @@
     return $element['#item']['safe_summary'];
   }
   else {
-    $size = variable_get('teaser_length_' . $element['#bundle'], 600);
+    // @todo
+    // Make the size depend on the build type.
+    $size = $instance['settings']['summary_length'];
     return text_summary($element['#item']['safe'], $instance['settings']['text_processing'] ? $element['#item']['format'] : NULL, $size);
   }
 }
