diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index b743d81369..c550716090 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -821,7 +821,7 @@ def change_stage_new(request, app_label, module_name, object_id): fill_extra_context(opts, app_label, c, change=True) - return render_to_response('admin_change_form', context_instance=c); + return render_to_response('admin_change_form', context_instance=c) change_stage_new = staff_member_required(change_stage_new) def _get_template(opts, app_label, add=False, change=False, show_delete=False, form_url=''): diff --git a/django/core/formfields.py b/django/core/formfields.py index 03760e0e19..58a3c0cc14 100644 --- a/django/core/formfields.py +++ b/django/core/formfields.py @@ -116,7 +116,7 @@ class FormWrapper: data = field.extract_data(self.data) return FormFieldWrapper(field, data, self.error_dict.get(field.field_name, [])) if self.edit_inline: - self.fill_inline_collections() + self.fill_inline_collections() for inline_collection in self._inline_collections: if inline_collection.name == key: return inline_collection @@ -126,15 +126,13 @@ class FormWrapper: def fill_inline_collections(self): if not self._inline_collections: ic = [] - related_objects = self.manipulator.get_inline_related_objects_wrapped() + related_objects = self.manipulator.get_related_objects() for rel_obj in related_objects: data = rel_obj.extract_data(self.data) inline_collection = InlineObjectCollection(self.manipulator, rel_obj, data, self.error_dict) ic.append(inline_collection) self._inline_collections = ic - - def has_errors(self): return self.error_dict != {} diff --git a/django/core/meta/__init__.py b/django/core/meta/__init__.py index d2c901c3f0..6c65eb1eaf 100644 --- a/django/core/meta/__init__.py +++ b/django/core/meta/__init__.py @@ -156,20 +156,22 @@ class RelatedObject(object): self.name = opts.module_name self.var_name = opts.object_name.lower() - def flatten_data(self,obj = None): + def flatten_data(self,follow, obj = None): new_data = {} rel_instances = self.get_list(obj) - for i, rel_instance in enumerate(rel_instances): instance_data = {} + for f in self.opts.fields + self.opts.many_to_many: - field_data = f.flatten_data(rel_instance) - #if hasattr(f, 'editable') and f.editable and f != self.field: - for name, value in field_data.items(): - instance_data['%s.%d.%s' % (self.var_name, i, name)] = value - new_data.update(instance_data) + #TODO fix for recursive manipulators. + fol = follow.get(f.name, None ) + if fol: + field_data = f.flatten_data(fol,rel_instance) + for name, value in field_data.items(): + instance_data['%s.%d.%s' % (self.var_name, i, name)] = value + new_data.update(instance_data) - return new_data + return new_data def extract_data(self, data): "Pull out the data meant for inline objects of this class, ie anything starting with our module name" @@ -426,6 +428,11 @@ class Options: def get_all_related_objects_wrapped(self): return [RelatedObject(self, opts, field) for opts, field in self.get_all_related_objects()] + def get_followed_related_objects(self, follow=None): + if follow == None: + follow = self.get_follow() + return [f for f in self.get_all_related_objects_wrapped() if follow.get(f.name, None) ] + def get_data_holders(self, follow=None): if follow == None : follow = self.get_follow() @@ -1529,7 +1536,7 @@ def get_manipulator(opts, klass, extra_methods, add=False, change=False): man.__module__ = MODEL_PREFIX + '.' + opts.module_name # Set this explicitly, as above. man.__init__ = curry(manipulator_init, opts, add, change) man.save = curry(manipulator_save, opts, klass, add, change) - man.get_inline_related_objects_wrapped = curry(manipulator_get_inline_related_objects_wrapped, opts, klass, add, change) + man.get_related_objects = curry(manipulator_get_related_objects, opts, klass, add, change) man.flatten_data = curry(manipulator_flatten_data, opts, klass, add, change) for field_name_list in opts.unique_together: setattr(man, 'isUnique%s' % '_'.join(field_name_list), curry(manipulator_validator_unique_together, field_name_list, opts)) @@ -1762,14 +1769,15 @@ def manipulator_save(opts, klass, add, change, self, new_data): getattr(new_object, 'set_%s_order' % rel_opts.object_name.lower())(order) return new_object -def manipulator_get_inline_related_objects_wrapped(opts, klass, add, change, self): - return opts.get_inline_related_objects_wrapped() +def manipulator_get_related_objects(opts, klass, add, change, self): + return opts.get_followed_related_objects(self.follow) def manipulator_flatten_data(opts, klass, add, change, self): new_data = {} obj = change and self.original_object or None for f in opts.get_data_holders(self.follow): - new_data.update(f.flatten_data(obj)) + fol = self.follow.get(f.name) + new_data.update(f.flatten_data(fol, obj)) return new_data def manipulator_validator_unique_together(field_name_list, opts, self, field_data, all_data): diff --git a/django/core/meta/fields.py b/django/core/meta/fields.py index 8a0337e90e..9dd9b9e0da 100644 --- a/django/core/meta/fields.py +++ b/django/core/meta/fields.py @@ -283,12 +283,13 @@ class Field(object): else: return self.get_default() - def flatten_data(self, obj = None): + def flatten_data(self, follow, obj = None): """ Returns a dictionary mapping the field's manipulator field names to its "flattened" string values for the admin view. Obj is the instance to extract the values from. """ + return { self.get_db_column(): self._get_val_from_obj(obj)} def get_follow(self, override=None): @@ -361,7 +362,7 @@ class DateField(Field): def get_manipulator_field_objs(self): return [formfields.DateField] - def flatten_data(self, obj = None): + def flatten_data(self, follow, obj = None): val = self._get_val_from_obj(obj) return {self.get_db_column(): (val is not None and val.strftime("%Y-%m-%d") or '')} @@ -394,7 +395,7 @@ class DateTimeField(DateField): return datetime.datetime.combine(d, t) return self.get_default() - def flatten_data(self,obj = None): + def flatten_data(self,follow, obj = None): val = self._get_val_from_obj(obj) date_field, time_field = self.get_manipulator_field_names('') return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''), @@ -591,7 +592,7 @@ class TimeField(Field): def get_manipulator_field_objs(self): return [formfields.TimeField] - def flatten_data(self,obj = None): + def flatten_data(self,follow, obj = None): val = self._get_val_from_obj(obj) return {self.get_db_column(): (val is not None and val.strftime("%H:%M:%S") or '')} @@ -661,7 +662,7 @@ class ForeignKey(Field): else: return int(value) - def flatten_data(self, obj = None): + def flatten_data(self, follow, obj = None): if not obj: # In required many-to-one fields with only one available choice, # select that one available choice. Note: We have to check that @@ -671,7 +672,7 @@ class ForeignKey(Field): choice_list = self.get_choices_default() if len(choice_list) == 2: return { self.name : choice_list[1][0] } - return Field.flatten_data(self, obj) + return Field.flatten_data(self, follow, obj) class ManyToManyField(Field): def __init__(self, to, **kwargs): @@ -716,7 +717,7 @@ class ManyToManyField(Field): len(badkeys) == 1 and badkeys[0] or tuple(badkeys), len(badkeys) == 1 and "is" or "are") - def flatten_data(self, obj = None): + def flatten_data(self, follow, obj = None): new_data = {} if obj: get_list_func = getattr(obj, 'get_%s_list' % self.rel.singular)