# HG changeset patch # User Sverre Rabbelier # Date 1240058232 0 # Node ID ccbc8bb5ce86f30efc42137dc02af5cb0a2b3848 # Parent e2c6e6722d691fe47bdbd0bd0011cc723bac9ee3 Split edit and create into different methods This makes removes unneeded responsibility from the edit view and makes it possible to more tightly restrict the usage of the edit and create views to only creating/editing. Patch by: Sverre Rabbelier diff -r e2c6e6722d69 -r ccbc8bb5ce86 app/soc/views/models/base.py --- a/app/soc/views/models/base.py Sat Apr 18 12:36:55 2009 +0000 +++ b/app/soc/views/models/base.py Sat Apr 18 12:37:12 2009 +0000 @@ -283,6 +283,7 @@ new_params = dicts.merge(params, self._params) + # redirect to scope selection view if ('scope_view' in new_params) and ('scope_path' not in kwargs): view = new_params['scope_view'].view redirect = new_params['scope_redirect'] @@ -292,14 +293,57 @@ params = new_params logic = params['logic'] - # Create page is an edit page with no key fields - empty_kwargs = {} - fields = logic.getKeyFieldNames() - for field in fields: - empty_kwargs[field] = None + context = helper.responses.getUniversalContext(request) + helper.responses.useJavaScript(context, params['js_uses_all']) + context['page_name'] = page_name + + if request.method == 'POST': + return self.createPost(request, context, params) + else: + return self.createGet(request, context, params, kwargs) + + def createGet(self, request, context, params, seed): + """See editGet. + + Handles generating the patch to create new entities. + """ + + self._editSeed(request, seed) + + if seed: + # pass the seed through the context to _constructResponse + # it will be popped before dispatching to Django + context['seed'] = seed + form = params['create_form'](initial=seed) + else: + form = params['create_form']() - return self.edit(request, access_type, page_name=page_name, - params=params, seed=kwargs, **empty_kwargs) + return self._constructResponse(request, None, context, form, params) + + def createPost(self, request, context, params): + """See editPost. + + Handles the creation of new entities. + """ + + form = params['create_form'](request.POST) + + if not form.is_valid(): + return self._constructResponse(request, None, context, form, params) + + _, fields = forms.collectCleanedFields(form) + self._editPost(request, None, fields) + + logic = params['logic'] + entity = logic.updateOrCreateFromFields(fields) + + page_params = params['edit_params'] + params['suffix'] = entity.key().id_or_name() + + request.path = params['edit_redirect'] % params + + return helper.responses.redirectToChangedSuffix( + request, None, params=page_params) @decorators.merge_params @decorators.check_access @@ -338,25 +382,23 @@ context = helper.responses.getUniversalContext(request) helper.responses.useJavaScript(context, params['js_uses_all']) context['page_name'] = page_name - entity = None try: - if all(kwargs.values()): - entity = logic.getFromKeyFieldsOr404(kwargs) + entity = logic.getFromKeyFieldsOr404(kwargs) except out_of_band.Error, error: - if not seed: - error.message_fmt = ( - error.message_fmt + self.DEF_CREATE_NEW_ENTITY_MSG_FMT % { - 'entity_type_lower' : params['name'].lower(), - 'entity_type' : params['name'], - 'create' : params['missing_redirect']}) - return helper.responses.errorResponse( - error, request, template=params['error_public'], context=context) + msg = self.DEF_CREATE_NEW_ENTITY_MSG_FMT % { + 'entity_type_lower' : params['name'].lower(), + 'entity_type' : params['name'], + 'create' : params['missing_redirect'] + } + error.message_fmt = error.message_fmt + msg + return helper.responses.errorResponse( + error, request, context=context) if request.method == 'POST': return self.editPost(request, entity, context, params=params) else: - return self.editGet(request, entity, context, seed, params=params) + return self.editGet(request, entity, context, params=params) @decorators.merge_params def editPost(self, request, entity, context, params=None): @@ -390,38 +432,27 @@ logic = params['logic'] - if entity: - form = params['edit_form'](request.POST) - else: - form = params['create_form'](request.POST) + form = params['edit_form'](request.POST) if not form.is_valid(): return self._constructResponse(request, entity, context, form, params) - key_name, fields = forms.collectCleanedFields(form) + fields = forms.collectCleanedFields(form) self._editPost(request, entity, fields) - if not key_name: - key_name = logic.getKeyNameFromFields(fields) - - entity = logic.updateOrCreateFromKeyName(fields, key_name) - - if not entity: - return http.HttpResponseRedirect('/') + entity = logic.updateEntityProperties(entity, fields) page_params = params['edit_params'] params['suffix'] = entity.key().id_or_name() request.path = params['edit_redirect'] % params - # redirect to (possibly new) location of the entity - # (causes 'Profile saved' message to be displayed) return helper.responses.redirectToChangedSuffix( request, None, params=page_params) @decorators.merge_params - def editGet(self, request, entity, context, seed, params=None): + def editGet(self, request, entity, context, params=None): """Processes GET requests for the specified entity. Params usage: @@ -464,31 +495,15 @@ if (not entity) or (not is_self_referrer): return http.HttpResponseRedirect(request.path) - if entity: - # note: no message will be displayed if parameter is not present - context['notice'] = requests.getSingleIndexedParamValue( - request, params['submit_msg_param_name'], - values=params['save_message']) - - # populate form with the existing entity - form = params['edit_form'](instance=entity) - - if 'key_name' in form.fields: - form.fields['key_name'].initial = entity.key().id_or_name() + # note: no message will be displayed if parameter is not present + context['notice'] = requests.getSingleIndexedParamValue( + request, params['submit_msg_param_name'], + values=params['save_message']) - self._editGet(request, entity, form) - else: - seed = seed if seed else {} - dicts.merge(seed, request.GET) - self._editSeed(request, seed) + # populate form with the existing entity + form = params['edit_form'](instance=entity) - if seed: - # pass the seed through the context to _constructResponse - # it will be popped before dispatching to Django - context['seed'] = seed - form = params['create_form'](initial=seed) - else: - form = params['create_form']() + self._editGet(request, entity, form) return self._constructResponse(request, entity, context, form, params)