Django

Code

Changeset 1797

Show
Ignore:
Timestamp:
12/29/05 15:42:39 (3 years ago)
Author:
rjwittams
Message:

magic-removal: Some validation fixes.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/contrib/admin/views/stages/change.py

    r1777 r1797  
    5050        #save a copy of the data to use for errors later.  
    5151        data = new_data.copy() 
    52          
    5352        manipulator.do_html2python(new_data) 
    5453        #update the manipulator with the effects of previous commands. 
     
    5655        #get the errors on the updated shape of the manipulator 
    5756        #HACK - validators should not work on POSTED data directly...  
    58         errors = manipulator.get_validation_errors(data) 
     57         
    5958        if request.POST.has_key("_preview"): 
    60             pass 
     59            errors = manipulator.get_validation_errors(data) 
    6160        elif request.POST.has_key("command"): 
    6261            command_name = request.POST.get("command") 
    6362            manipulator.do_command(command_name) 
    64             new_data = manipulator.flatten_data() 
    65         elif errors: 
     63            errors = manipulator.get_validation_errors(data) 
    6664            new_data = manipulator.flatten_data() 
    6765        else: 
    68             new_object = manipulator.save_from_update() 
    69             log_change_message(request.user, opts, manipulator, new_object) 
    70             msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': opts.verbose_name, 'obj': new_object} 
    71             pk_value = getattr(new_object, opts.pk.attname) 
    72             if request.POST.has_key("_continue"): 
    73                 request.user.add_message(msg + ' ' + _("You may edit it again below.")) 
    74                 if request.REQUEST.has_key('_popup'): 
    75                     return HttpResponseRedirect(request.path + "?_popup=1") 
     66            errors = manipulator.get_validation_errors(data) 
     67            if errors: 
     68                new_data = manipulator.flatten_data() 
     69            else: 
     70                new_object = manipulator.save_from_update() 
     71                log_change_message(request.user, opts, manipulator, new_object) 
     72                msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': opts.verbose_name, 'obj': new_object} 
     73                pk_value = getattr(new_object, opts.pk.attname) 
     74                if request.POST.has_key("_continue"): 
     75                    request.user.add_message(msg + ' ' + _("You may edit it again below.")) 
     76                    if request.REQUEST.has_key('_popup'): 
     77                        return HttpResponseRedirect(request.path + "?_popup=1") 
     78                    else: 
     79                        return HttpResponseRedirect(request.path) 
     80                elif request.POST.has_key("_saveasnew"): 
     81                    request.user.add_message(_('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': opts.verbose_name, 'obj': new_object}) 
     82                    return HttpResponseRedirect("../../%s/" % pk_value) 
     83                elif request.POST.has_key("_addanother"): 
     84                    request.user.add_message(msg + ' ' + (_("You may add another %s below.") % opts.verbose_name)) 
     85                    return HttpResponseRedirect("../../add/") 
    7686                else: 
    77                     return HttpResponseRedirect(request.path) 
    78             elif request.POST.has_key("_saveasnew"): 
    79                 request.user.add_message(_('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': opts.verbose_name, 'obj': new_object}) 
    80                 return HttpResponseRedirect("../../%s/" % pk_value) 
    81             elif request.POST.has_key("_addanother"): 
    82                 request.user.add_message(msg + ' ' + (_("You may add another %s below.") % opts.verbose_name)) 
    83                 return HttpResponseRedirect("../../add/") 
    84             else: 
    85                 request.user.add_message(msg) 
    86                 return HttpResponseRedirect("../../") 
     87                    request.user.add_message(msg) 
     88                    return HttpResponseRedirect("../../") 
    8789    else:  
    8890        # Populate new_data with a "flattened" version of the current data. 
  • django/branches/magic-removal/django/core/formfields.py

    r1772 r1797  
    5656        errors = {} 
    5757        for field in self.fields: 
    58             if field.is_required and not new_data.get(field.field_name, False): 
    59                 errors.setdefault(field.field_name, []).append(gettext_lazy('This field is required.')) 
    60                 continue 
    61             try: 
    62                 validator_list = field.validator_list 
    63                 if hasattr(self, 'validate_%s' % field.field_name): 
    64                     validator_list.append(getattr(self, 'validate_%s' % field.field_name)) 
    65                 for validator in validator_list: 
    66                     if field.is_required or new_data.get(field.field_name, False) or hasattr(validator, 'always_test'): 
    67                         try: 
    68                             if hasattr(field, 'requires_data_list'): 
    69                                 validator(new_data.getlist(field.field_name), new_data) 
    70                             else: 
    71                                 validator(new_data.get(field.field_name, ''), new_data) 
    72                         except validators.ValidationError, e: 
    73                             errors.setdefault(field.field_name, []).extend(e.messages) 
    74             # If a CriticalValidationError is raised, ignore any other ValidationErrors 
    75             # for this particular field 
    76             except validators.CriticalValidationError, e: 
    77                 errors.setdefault(field.field_name, []).extend(e.messages) 
     58            errors.update(field.get_validation_errors(new_data)) 
     59            val_name = 'validate_%s' % field.field_name 
     60            if hasattr(self, val_name): 
     61                val = getattr(self, val_name) 
     62                try: 
     63                    field.run_validator(new_data, val) 
     64                except (validators.ValidationError, validators.CriticalValidationError), e: 
     65                    errors.setdefault(field.field_name, []).extend(e.messages) 
     66                 
     67#            if field.is_required and not new_data.get(field.field_name, False): 
     68#                errors.setdefault(field.field_name, []).append(gettext_lazy('This field is required.')) 
     69#                continue 
     70#            try: 
     71#                validator_list = field.validator_list 
     72#                if hasattr(self, 'validate_%s' % field.field_name): 
     73#                    validator_list.append(getattr(self, 'validate_%s' % field.field_name)) 
     74#                for validator in validator_list: 
     75#                    if field.is_required or new_data.get(field.field_name, False) or hasattr(validator, 'always_test'): 
     76#                        try: 
     77#                            if hasattr(field, 'requires_data_list'): 
     78#                                validator(new_data.getlist(field.field_name), new_data) 
     79#                            else: 
     80#                                validator(new_data.get(field.field_name, ''), new_data) 
     81#                        except validators.ValidationError, e: 
     82#                            errors.setdefault(field.field_name, []).extend(e.messages) 
     83#            # If a CriticalValidationError is raised, ignore any other ValidationErrors 
     84#            # for this particular field 
     85#            except validators.CriticalValidationError, e: 
     86#                errors.setdefault(field.field_name, []).extend(e.messages) 
    7887        return errors 
    7988 
     
    9099        expected to deal with invalid input. 
    91100        """ 
     101        print "converting for ", self, self.fields 
    92102        for field in self.fields: 
    93103            field.convert_post_data(new_data) 
     
    315325                converted_data = d 
    316326            new_data.setlist(name, converted_data) 
    317 #        else: 
    318 #            try: 
    319 #               # individual fields deal with None values themselves 
    320 #               new_data.setlist(name, [self.__class__.html2python(None)]) 
    321 #            except EmptyValue: 
    322 #               new_data.setlist(name, []) 
     327        else: 
     328            try: 
     329               #individual fields deal with None values themselves 
     330               new_data.setlist(name, [self.__class__.html2python(None)]) 
     331            except EmptyValue: 
     332               new_data.setlist(name, []) 
     333 
     334 
     335    def run_validator(self, new_data, validator): 
     336        if self.is_required or new_data.get(self.field_name, False) or hasattr(validator, 'always_test'): 
     337            if hasattr(self, 'requires_data_list'): 
     338                validator(new_data.getlist(self.field_name), new_data) 
     339            else: 
     340                validator(new_data.get(self.field_name, ''), new_data) 
     341 
     342    def get_validation_errors(self, new_data): 
     343        errors = {} 
     344        if self.is_required and not new_data.get(self.field_name, False): 
     345            errors.setdefault(self.field_name, []).append(gettext_lazy('This field is required.')) 
     346            return errors 
     347        try: 
     348            for validator in self.validator_list: 
     349                try: 
     350                   self.run_validator(new_data, validator) 
     351                except validators.ValidationError, e: 
     352                    errors.setdefault(self.field_name, []).extend(e.messages) 
     353        # If a CriticalValidationError is raised, ignore any other ValidationErrors 
     354        # for this particular field 
     355        except validators.CriticalValidationError, e: 
     356            errors.setdefault(self.field_name, []).extend(e.messages) 
     357        return errors 
    323358 
    324359    def get_id(self): 
  • django/branches/magic-removal/django/db/models/base.py

    r1767 r1797  
    11import django.db.models.manipulators 
    22import django.db.models.manager 
    3 from django.db.models.fields import AutoField, ImageField 
     3from django.db.models.fields import AutoField, ImageField, Admin 
    44from django.db.models.fields.related import OneToOne, ManyToOne 
    55from django.db.models.related import RelatedObject 
     
    2121    from sets import Set as set 
    2222 
    23 attribute_transforms = {
     23attribute_transforms = { 'Admin': lambda cls: Admin(**cls.__dict__)
    2424 
    2525class ModelBase(type): 
  • django/branches/magic-removal/django/db/models/fields/__init__.py

    r1780 r1797  
    727727     
    728728    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): 
    729         return [HiddenField(name_prefix + self.name)  ] 
     729        return [formfields.HiddenField(name_prefix + self.name)  ] 
    730730 
    731731    def contribute_to_class(self, cls, name): 
     
    820820            new_fieldset_list.append(FieldSet(name, classes, opts.get_field, line_specs)) 
    821821        return new_fieldset_list 
     822 
     823    def contribute_to_class(self, cls, name): 
     824        cls._meta.admin = self 
  • django/branches/magic-removal/django/db/models/manipulators.py

    r1780 r1797  
    100100                self.children[f] = manipulators 
    101101        self.needs_deletion = False 
     102        self.ignore_errors = False 
    102103 
    103104    def get_fields(self): 
    104         if self.needs_deletion
     105        if self.needs_deletion
    105106            return [] 
    106107        else: 
    107             l = list(self.fields_) 
    108             for child_manips in self.children.values(): 
    109                 for manip in child_manips: 
    110                     if manip:  
    111                         l.extend(manip.fields) 
    112             return l 
     108            return self.fields_ 
     109            #l = list(self.fields_) 
     110            #for child_manips in self.children.values(): 
     111            #    for manip in child_manips: 
     112            #        if manip:  
     113            #            l.extend(manip.fields) 
     114            #return l 
    113115 
    114116    fields = property(get_fields) 
     117 
     118    def get_validation_errors(self, new_data): 
     119        "Returns dictionary mapping field_names to error-message lists" 
     120        if self.needs_deletion or self.ignore_errors:  
     121            return {} 
     122         
     123        errors = super(AutomaticManipulator, self).get_validation_errors(new_data) 
     124         
     125        for manips in self.children.values(): 
     126            errors.update(manips.get_validation_errors(new_data)) 
     127        return errors 
     128     
     129    def do_html2python(self, new_data): 
     130        super(AutomaticManipulator, self).do_html2python(new_data) 
     131        for child in self.children.values(): 
     132            child.do_html2python(new_data) 
    115133 
    116134    def get_original_value(self, field): 
     
    359377            for index, obj_data in items: 
    360378                child_manip = self.add_child(index) 
     379                #HACK: this data will not have been converted to python form yet.  
     380                #child_manip.do_html2python(obj_data) 
    361381                child_manip._fill_data(obj_data) 
    362382     
     
    385405        # TODO: page.forward, page.back, page.n, swap.n.m 
    386406            if command_name == "add": 
    387                 self.add_child() 
     407                child_manip = self.add_child() 
     408                # Don't show validation stuff for things just added.  
     409                child_manip.ignore_errors = True 
    388410            elif command_name == "swap": 
    389411                order_field = self.model._meta.order_with_respect_to 
     
    418440        prefix = '%s%s.' % (self.name_prefix, index ) 
    419441        child_manip = man_class(self.follow, self.name_parts + ( str(index), )  ) 
     442         
    420443        self[index] = child_manip 
    421444        return child_manip 
     
    428451                new_data.update(manip_data) 
    429452        return new_data 
     453     
     454    def get_validation_errors(self, new_data): 
     455        "Returns dictionary mapping field_names to error-message lists" 
     456        errors = {} 
     457        for manip in self: 
     458            if manip: 
     459                errors.update(manip.get_validation_errors(new_data)) 
     460        return errors 
     461     
     462    def do_html2python(self, new_data): 
     463        print "coll: ", self 
     464        for manip in self: 
     465            if manip: 
     466                manip.do_html2python(new_data) 
    430467 
    431468def manipulator_validator_unique_together(field_name_list, opts, self, field_data, all_data):