source: inplaceeditform/trunk/inplaceeditform/views.py @ 707

Revision 707, 4.7 KB checked in by pmartin, 2 years ago (diff)

Fixes #559 Delete the login_required. Create the classes
SuperUserPermEditInline? and AdminDjangoPermEditInline?

Line 
1# -*- coding: utf-8 -*-
2from django.contrib.contenttypes.models import ContentType
3from django.http import HttpResponse
4from django.forms import ValidationError
5from django.shortcuts import get_object_or_404
6from django.utils import simplejson
7
8from inplaceeditform.commons import (get_dict_from_obj, apply_filters,
9                                     get_adaptor_class)
10
11MIMETYPE_RESPONSE = 'text'
12
13
14def 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
47def 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
61def _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
96def _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
111def _get_http_response(context, mimetype=MIMETYPE_RESPONSE):
112    return HttpResponse(simplejson.dumps(context),
113                        mimetype=MIMETYPE_RESPONSE)
Note: See TracBrowser for help on using the repository browser.