~pexego/openobject-addons/6.1-pexego-sale_commission

« back to all changes in this revision

Viewing changes to django_pos/apps/inplaceeditform/views.py

  • Committer: Santi Argueso (Pexego)
  • Date: 2013-02-06 17:03:36 UTC
  • mfrom: (10.1.6 pexego-addons_6.1)
  • Revision ID: santiago@pexego.es-20130206170336-ml430s6p9jknun0j
[MERGE]

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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:
 
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
 
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_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})
 
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:
 
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})
 
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)