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
8
from inplaceeditform.commons import (get_dict_from_obj, apply_filters,
11
MIMETYPE_RESPONSE = 'text'
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')
19
return _get_http_response({'errors': 'Params insufficient'})
20
if not adaptor.can_edit():
21
return _get_http_response({'errors': 'You can not edit this content'})
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
27
form = form_class(data=new_data, instance=adaptor.obj)
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
33
adaptor.save(value_edit_with_filter)
34
return _get_http_response({'errors': False,
35
'value': adaptor.render_value_edit()})
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})
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')
52
return _get_http_response({'errors': 'Params insufficient'})
53
if not adaptor.can_edit():
54
return _get_http_response({'errors': 'You can not edit this content'})
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})
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)
66
app_label = request_params.get('app_label', None)
67
module_name = request_params.get('module_name', None)
69
if not field_name or not obj_id or not app_label and module_name:
72
contenttype = ContentType.objects.get(app_label=app_label,
75
model_class = contenttype.model_class()
76
obj = get_object_or_404(model_class,
78
adaptor = request_params.get('adaptor', None)
79
class_adaptor = get_adaptor_class(adaptor, obj, field_name)
81
filters_to_show = request_params.get('filters_to_show', None)
83
kwargs = _convert_params_in_config(request_params, ('field_name',
89
config = class_adaptor.get_config(**kwargs)
90
adaptor_field = class_adaptor(request, obj, field_name,
96
def _convert_params_in_config(request_params, exclude_params=None):
97
exclude_params = exclude_params or []
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
106
config[str(key)] = value
107
config['widget_options'] = options_widget
111
def _get_http_response(context, mimetype=MIMETYPE_RESPONSE):
112
return HttpResponse(simplejson.dumps(context),
113
mimetype=MIMETYPE_RESPONSE)