app/soc/views/models/base.py
changeset 2204 ccbc8bb5ce86
parent 2193 0b6ec4a223cf
child 2205 77273200ab4f
equal deleted inserted replaced
2203:e2c6e6722d69 2204:ccbc8bb5ce86
   281       kwargs: not used for create()
   281       kwargs: not used for create()
   282     """
   282     """
   283 
   283 
   284     new_params = dicts.merge(params, self._params)
   284     new_params = dicts.merge(params, self._params)
   285 
   285 
       
   286     # redirect to scope selection view
   286     if ('scope_view' in new_params) and ('scope_path' not in kwargs):
   287     if ('scope_view' in new_params) and ('scope_path' not in kwargs):
   287       view = new_params['scope_view'].view
   288       view = new_params['scope_view'].view
   288       redirect = new_params['scope_redirect']
   289       redirect = new_params['scope_redirect']
   289       return self.select(request, view, redirect,
   290       return self.select(request, view, redirect,
   290                          params=params, page_name=page_name, **kwargs)
   291                          params=params, page_name=page_name, **kwargs)
   291 
   292 
   292     params = new_params
   293     params = new_params
   293     logic = params['logic']
   294     logic = params['logic']
   294 
   295 
   295     # Create page is an edit page with no key fields
   296     context = helper.responses.getUniversalContext(request)
   296     empty_kwargs = {}
   297     helper.responses.useJavaScript(context, params['js_uses_all'])
   297     fields = logic.getKeyFieldNames()
   298     context['page_name'] = page_name
   298     for field in fields:
   299 
   299       empty_kwargs[field] = None
   300     if request.method == 'POST':
   300 
   301       return self.createPost(request, context, params)
   301     return self.edit(request, access_type, page_name=page_name,
   302     else:
   302                      params=params, seed=kwargs, **empty_kwargs)
   303       return self.createGet(request, context, params, kwargs)
       
   304 
       
   305   def createGet(self, request, context, params, seed):
       
   306     """See editGet.
       
   307 
       
   308     Handles generating the patch to create new entities.
       
   309     """
       
   310 
       
   311     self._editSeed(request, seed)
       
   312 
       
   313     if seed:
       
   314       # pass the seed through the  context to _constructResponse
       
   315       # it will be popped before dispatching to Django
       
   316       context['seed'] = seed
       
   317       form = params['create_form'](initial=seed)
       
   318     else:
       
   319       form = params['create_form']()
       
   320 
       
   321     return self._constructResponse(request, None, context, form, params)
       
   322 
       
   323   def createPost(self, request, context, params):
       
   324     """See editPost.
       
   325 
       
   326     Handles the creation of new entities.
       
   327     """
       
   328 
       
   329     form = params['create_form'](request.POST)
       
   330 
       
   331     if not form.is_valid():
       
   332       return self._constructResponse(request, None, context, form, params)
       
   333 
       
   334     _, fields = forms.collectCleanedFields(form)
       
   335     self._editPost(request, None, fields)
       
   336 
       
   337     logic = params['logic']
       
   338     entity = logic.updateOrCreateFromFields(fields)
       
   339 
       
   340     page_params = params['edit_params']
       
   341     params['suffix'] = entity.key().id_or_name()
       
   342 
       
   343     request.path = params['edit_redirect'] % params
       
   344 
       
   345     return helper.responses.redirectToChangedSuffix(
       
   346         request, None, params=page_params)
   303 
   347 
   304   @decorators.merge_params
   348   @decorators.merge_params
   305   @decorators.check_access
   349   @decorators.check_access
   306   def edit(self, request, access_type,
   350   def edit(self, request, access_type,
   307            page_name=None, params=None, seed=None, **kwargs):
   351            page_name=None, params=None, seed=None, **kwargs):
   336     logic = params['logic']
   380     logic = params['logic']
   337 
   381 
   338     context = helper.responses.getUniversalContext(request)
   382     context = helper.responses.getUniversalContext(request)
   339     helper.responses.useJavaScript(context, params['js_uses_all'])
   383     helper.responses.useJavaScript(context, params['js_uses_all'])
   340     context['page_name'] = page_name
   384     context['page_name'] = page_name
   341     entity = None
       
   342 
   385 
   343     try:
   386     try:
   344       if all(kwargs.values()):
   387       entity = logic.getFromKeyFieldsOr404(kwargs)
   345         entity = logic.getFromKeyFieldsOr404(kwargs)
       
   346     except out_of_band.Error, error:
   388     except out_of_band.Error, error:
   347       if not seed:
   389       msg = self.DEF_CREATE_NEW_ENTITY_MSG_FMT % {
   348         error.message_fmt = (
   390           'entity_type_lower' : params['name'].lower(),
   349           error.message_fmt + self.DEF_CREATE_NEW_ENTITY_MSG_FMT % {
   391           'entity_type' : params['name'],
   350             'entity_type_lower' : params['name'].lower(),
   392           'create' : params['missing_redirect']
   351             'entity_type' : params['name'],
   393           }
   352             'create' : params['missing_redirect']})
   394       error.message_fmt = error.message_fmt + msg
   353         return helper.responses.errorResponse(
   395       return helper.responses.errorResponse(
   354             error, request, template=params['error_public'], context=context)
   396           error, request, context=context)
   355 
   397 
   356     if request.method == 'POST':
   398     if request.method == 'POST':
   357       return self.editPost(request, entity, context, params=params)
   399       return self.editPost(request, entity, context, params=params)
   358     else:
   400     else:
   359       return self.editGet(request, entity, context, seed, params=params)
   401       return self.editGet(request, entity, context, params=params)
   360 
   402 
   361   @decorators.merge_params
   403   @decorators.merge_params
   362   def editPost(self, request, entity, context, params=None):
   404   def editPost(self, request, entity, context, params=None):
   363     """Processes POST requests for the specified entity.
   405     """Processes POST requests for the specified entity.
   364 
   406 
   388       params: required, a dict with params for this View
   430       params: required, a dict with params for this View
   389     """
   431     """
   390 
   432 
   391     logic = params['logic']
   433     logic = params['logic']
   392 
   434 
   393     if entity:
   435     form = params['edit_form'](request.POST)
   394       form = params['edit_form'](request.POST)
       
   395     else:
       
   396       form = params['create_form'](request.POST)
       
   397 
   436 
   398     if not form.is_valid():
   437     if not form.is_valid():
   399       return self._constructResponse(request, entity, context, form, params)
   438       return self._constructResponse(request, entity, context, form, params)
   400 
   439 
   401     key_name, fields = forms.collectCleanedFields(form)
   440     fields = forms.collectCleanedFields(form)
   402 
   441 
   403     self._editPost(request, entity, fields)
   442     self._editPost(request, entity, fields)
   404 
   443 
   405     if not key_name:
   444     entity = logic.updateEntityProperties(entity, fields)
   406       key_name = logic.getKeyNameFromFields(fields)
       
   407 
       
   408     entity = logic.updateOrCreateFromKeyName(fields, key_name)
       
   409 
       
   410     if not entity:
       
   411       return http.HttpResponseRedirect('/')
       
   412 
   445 
   413     page_params = params['edit_params']
   446     page_params = params['edit_params']
   414     params['suffix'] = entity.key().id_or_name()
   447     params['suffix'] = entity.key().id_or_name()
   415 
   448 
   416     request.path = params['edit_redirect'] % params
   449     request.path = params['edit_redirect'] % params
   417 
   450 
   418     # redirect to (possibly new) location of the entity
       
   419     # (causes 'Profile saved' message to be displayed)
       
   420     return helper.responses.redirectToChangedSuffix(
   451     return helper.responses.redirectToChangedSuffix(
   421         request, None, params=page_params)
   452         request, None, params=page_params)
   422 
   453 
   423   @decorators.merge_params
   454   @decorators.merge_params
   424   def editGet(self, request, entity, context, seed, params=None):
   455   def editGet(self, request, entity, context, params=None):
   425     """Processes GET requests for the specified entity.
   456     """Processes GET requests for the specified entity.
   426 
   457 
   427     Params usage:
   458     Params usage:
   428       The params dictionary is passed to _constructResponse, see the
   459       The params dictionary is passed to _constructResponse, see the
   429       docstring  of _constructResponse on how it uses it.
   460       docstring  of _constructResponse on how it uses it.
   462 
   493 
   463     if request.GET.get(params['submit_msg_param_name']):
   494     if request.GET.get(params['submit_msg_param_name']):
   464       if (not entity) or (not is_self_referrer):
   495       if (not entity) or (not is_self_referrer):
   465         return http.HttpResponseRedirect(request.path)
   496         return http.HttpResponseRedirect(request.path)
   466 
   497 
   467     if entity:
   498     # note: no message will be displayed if parameter is not present
   468       # note: no message will be displayed if parameter is not present
   499     context['notice'] = requests.getSingleIndexedParamValue(
   469       context['notice'] = requests.getSingleIndexedParamValue(
   500         request, params['submit_msg_param_name'],
   470           request, params['submit_msg_param_name'],
   501         values=params['save_message'])
   471           values=params['save_message'])
   502 
   472 
   503     # populate form with the existing entity
   473       # populate form with the existing entity
   504     form = params['edit_form'](instance=entity)
   474       form = params['edit_form'](instance=entity)
   505 
   475 
   506     self._editGet(request, entity, form)
   476       if 'key_name' in form.fields:
       
   477         form.fields['key_name'].initial = entity.key().id_or_name()
       
   478 
       
   479       self._editGet(request, entity, form)
       
   480     else:
       
   481       seed = seed if seed else {}
       
   482       dicts.merge(seed, request.GET)
       
   483       self._editSeed(request, seed)
       
   484 
       
   485       if seed:
       
   486         # pass the seed through the  context to _constructResponse
       
   487         # it will be popped before dispatching to Django
       
   488         context['seed'] = seed
       
   489         form = params['create_form'](initial=seed)
       
   490       else:
       
   491         form = params['create_form']()
       
   492 
   507 
   493     return self._constructResponse(request, entity, context, form, params)
   508     return self._constructResponse(request, entity, context, form, params)
   494 
   509 
   495   @decorators.merge_params
   510   @decorators.merge_params
   496   @decorators.check_access
   511   @decorators.check_access