| 1 | # -*- coding: utf-8 -*- |
|---|
| 2 | from django.contrib.contenttypes.models import ContentType |
|---|
| 3 | from django.http import HttpResponse |
|---|
| 4 | from django.forms import ValidationError |
|---|
| 5 | from django.shortcuts import get_object_or_404 |
|---|
| 6 | from django.utils import simplejson |
|---|
| 7 | |
|---|
| 8 | from inplaceeditform.commons import (get_dict_from_obj, apply_filters, |
|---|
| 9 | get_adaptor_class) |
|---|
| 10 | |
|---|
| 11 | MIMETYPE_RESPONSE = 'text' |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | def save_ajax(request): |
|---|
| 15 | if not request.method == 'POST': |
|---|
| 16 | return _get_http_response({'errors': 'It is not a POST request'}) |
|---|
| 17 | adaptor = _get_adaptor(request, 'POST') |
|---|
| 18 | if not adaptor.can_edit(): |
|---|
| 19 | return _get_http_response({'errors': 'You can not edit this content'}) |
|---|
| 20 | if not adaptor: |
|---|
| 21 | return _get_http_response({'errors': 'Params insufficient'}) |
|---|
| 22 | value = adaptor.loads_to_post(request) |
|---|
| 23 | new_data = get_dict_from_obj(adaptor.obj) |
|---|
| 24 | form_class = adaptor.get_form_class() |
|---|
| 25 | field_name = adaptor.field_name |
|---|
| 26 | |
|---|
| 27 | form = form_class(data=new_data, instance=adaptor.obj) |
|---|
| 28 | try: |
|---|
| 29 | value_edit = adaptor.get_value_editor(value) |
|---|
| 30 | value_edit_with_filter = apply_filters(value_edit, adaptor.filters_to_edit) |
|---|
| 31 | new_data[field_name] = value_edit_with_filter |
|---|
| 32 | if form.is_valid(): |
|---|
| 33 | adaptor.save(value_edit_with_filter) |
|---|
| 34 | return _get_http_response({'errors': False, |
|---|
| 35 | 'value': adaptor.render_value()}) |
|---|
| 36 | messages = [] # The error is for another field that you are editing |
|---|
| 37 | for field_name_error, errors_field in form.errors.items(): |
|---|
| 38 | for error in errors_field: |
|---|
| 39 | messages.append("%s: %s" % (field_name_error, unicode(error))) |
|---|
| 40 | message_i18n = ','.join(messages) |
|---|
| 41 | return _get_http_response({'errors': message_i18n}) |
|---|
| 42 | except ValidationError, error: # The error is for a field that you are editing |
|---|
| 43 | message_i18n = ', '.join([u"%s" % m for m in error.messages]) |
|---|
| 44 | return _get_http_response({'errors': message_i18n}) |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | def get_field(request): |
|---|
| 48 | if not request.method == 'GET': |
|---|
| 49 | return _get_http_response({'errors': 'It is not a GET request'}) |
|---|
| 50 | adaptor = _get_adaptor(request, 'GET') |
|---|
| 51 | if not adaptor.can_edit(): |
|---|
| 52 | return _get_http_response({'errors': 'You can not edit this content'}) |
|---|
| 53 | if not adaptor: |
|---|
| 54 | return _get_http_response({'errors': 'Params insufficient'}) |
|---|
| 55 | field_render = adaptor.render_field() |
|---|
| 56 | field_media_render = adaptor.render_media_field() |
|---|
| 57 | return _get_http_response({'field_render': field_render, |
|---|
| 58 | 'field_media_render': field_media_render}) |
|---|
| 59 | |
|---|
| 60 | |
|---|
| 61 | def _get_adaptor(request, method='GET'): |
|---|
| 62 | request_params = getattr(request, method) |
|---|
| 63 | field_name = request_params.get('field_name', None) |
|---|
| 64 | obj_id = request_params.get('obj_id', None) |
|---|
| 65 | |
|---|
| 66 | app_label = request_params.get('app_label', None) |
|---|
| 67 | module_name = request_params.get('module_name', None) |
|---|
| 68 | |
|---|
| 69 | if not field_name or not obj_id or not app_label and module_name: |
|---|
| 70 | return None |
|---|
| 71 | |
|---|
| 72 | contenttype = ContentType.objects.get(app_label=app_label, |
|---|
| 73 | model=module_name) |
|---|
| 74 | |
|---|
| 75 | model_class = contenttype.model_class() |
|---|
| 76 | obj = get_object_or_404(model_class, |
|---|
| 77 | pk=obj_id) |
|---|
| 78 | adaptor = request_params.get('adaptor', None) |
|---|
| 79 | class_adaptor = get_adaptor_class(adaptor, obj, field_name) |
|---|
| 80 | |
|---|
| 81 | filters_to_show = request_params.get('filters_to_show', None) |
|---|
| 82 | |
|---|
| 83 | kwargs = _convert_params_in_config(request_params, ('field_name', |
|---|
| 84 | 'obj_id', |
|---|
| 85 | 'app_label', |
|---|
| 86 | 'module_name', |
|---|
| 87 | 'filters_to_show', |
|---|
| 88 | 'adaptor')) |
|---|
| 89 | config = class_adaptor.get_config(**kwargs) |
|---|
| 90 | adaptor_field = class_adaptor(request, obj, field_name, |
|---|
| 91 | filters_to_show, |
|---|
| 92 | config) |
|---|
| 93 | return adaptor_field |
|---|
| 94 | |
|---|
| 95 | |
|---|
| 96 | def _convert_params_in_config(request_params, exclude_params=None): |
|---|
| 97 | exclude_params = exclude_params or [] |
|---|
| 98 | config = {} |
|---|
| 99 | options_widget = {} |
|---|
| 100 | for key, value in request_params.items(): |
|---|
| 101 | if key not in exclude_params: |
|---|
| 102 | if key.startswith('__widget_'): |
|---|
| 103 | key = key.replace('__widget_', '') |
|---|
| 104 | options_widget[key] = value |
|---|
| 105 | else: |
|---|
| 106 | config[str(key)] = value |
|---|
| 107 | config['widget_options'] = options_widget |
|---|
| 108 | return config |
|---|
| 109 | |
|---|
| 110 | |
|---|
| 111 | def _get_http_response(context, mimetype=MIMETYPE_RESPONSE): |
|---|
| 112 | return HttpResponse(simplejson.dumps(context), |
|---|
| 113 | mimetype=MIMETYPE_RESPONSE) |
|---|