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 |