From 7cfc16ca58dfb22bc6e9cd519e6ecc7a10435fa1 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 16 Feb 2012 07:11:56 -0500 Subject: Enforce that required attributes can't be set to None in CRUD Update The `required` parameter attribute didn't distinguish between cases where the parameter is not given and all, and where the parameter is given but empty. The case of updating a required attribute couldn't be validated properly, because when it is given but empty, validators don't run. This patch introduces a new flag, 'nonempty', that specifies the parameter can be missing (if not required), but it can't be None. This flag gets added automatically to required parameters in CRUD Update. --- ipalib/crud.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'ipalib/crud.py') diff --git a/ipalib/crud.py b/ipalib/crud.py index b9dfb025..12edbf58 100644 --- a/ipalib/crud.py +++ b/ipalib/crud.py @@ -186,20 +186,29 @@ class Update(PKQuery): for option in super(Update, self).get_options(): yield option for option in self.obj.params_minus_pk(): + new_flags = option.flags attribute = 'virtual_attribute' not in option.flags + if option.required: + # Required options turn into non-required, since not specifying + # them means that they are not changed. + # However, they cannot be empty (i.e. explicitly set to None). + new_flags = new_flags.union(['nonempty']) if 'no_update' in option.flags: continue if 'ask_update' in option.flags: yield option.clone( attribute=attribute, query=False, required=False, - autofill=False, alwaysask=True + autofill=False, alwaysask=True, flags=new_flags, ) elif 'req_update' in option.flags: yield option.clone( attribute=attribute, required=True, alwaysask=False, + flags=new_flags, ) else: - yield option.clone(attribute=attribute, required=False, autofill=False) + yield option.clone(attribute=attribute, required=False, + autofill=False, flags=new_flags, + ) if not self.extra_options_first: for option in super(Update, self).get_options(): yield option -- cgit