Exemplo n.º 1
0
    def render_action_response(self, ar):
        """Builds a JSON response from response information stored in given
        ActionRequest.

        """
        # logger.info("20140430 render_action_response %s", ar.response)
        return views.json_response(ar.response, ar.content_type)
Exemplo n.º 2
0
Arquivo: views.py Projeto: raffas/lino
 def get(self, request, app_label=None, actor=None, pk=None):
     rpt = requested_actor(app_label, actor)
     assert pk is None, 20120814
     ar = rpt.request(request=request)
     rh = ar.ah
     rows = [
         rh.store.row2dict(ar, row, rh.store.list_fields)
         for row in ar.sliced_data_iterator]
     kw = dict(count=ar.get_total_count(), rows=rows)
     kw.update(title=unicode(ar.get_title()))
     return json_response(kw)
Exemplo n.º 3
0
Arquivo: views.py Projeto: raffas/lino
    def put(self, request, app_label=None, actor=None, pk=None):
        rpt = requested_actor(app_label, actor)
        ar = rpt.request(request=request)
        ar.set_selected_pks(pk)
        elem = ar.selected_rows[0]
        rh = ar.ah

        data = http.QueryDict(request.body).get('rows')
        data = json.loads(data)
        a = rpt.get_url_action(rpt.default_list_action_name)
        ar = rpt.request(request=request, action=a)
        ar.renderer = settings.SITE.ui.extjs_renderer
        ar.form2obj_and_save(data, elem, False)
        # Ext.ensible needs list_fields, not detail_fields
        ar.set_response(
            rows=[rh.store.row2dict(ar, elem, rh.store.list_fields)])
        return json_response(ar.response)
Exemplo n.º 4
0
Arquivo: views.py Projeto: cuchac/lino
 def get(self, request, app_label=None, actor=None, pk=None):
     #~ ui = settings.SITE.ui
     rpt = requested_actor(app_label, actor)
     #~ a = rpt.default_action
     assert pk is None, 20120814
     #~ if pk is None:
         #~ elem = None
     #~ else:
         #~ elem = rpt.get_row_by_pk(pk)
     ar = rpt.request(request=request)
     rh = ar.ah
     rows = [
         rh.store.row2dict(ar, row, rh.store.list_fields)
         for row in ar.sliced_data_iterator]
     kw = dict(count=ar.get_total_count(), rows=rows)
     kw.update(title=unicode(ar.get_title()))
     return json_response(kw)
Exemplo n.º 5
0
Arquivo: views.py Projeto: raffas/lino
    def post(self, request, app_label=None, actor=None, pk=None):
        rpt = requested_actor(app_label, actor)
        ar = rpt.request(request=request)

        instance = ar.create_instance()
        # store uploaded files.
        # html forms cannot send files with PUT or GET, only with POST
        if ar.actor.handle_uploaded_files is not None:
            ar.actor.handle_uploaded_files(instance, request)

        data = request.POST.get('rows')
        data = json.loads(data)
        ar.form2obj_and_save(data, instance, True)

        # Ext.ensible needs list_fields, not detail_fields
        ar.set_response(
            rows=[ar.ah.store.row2dict(
                ar, instance, ar.ah.store.list_fields)])
        return json_response(ar.response)
Exemplo n.º 6
0
Arquivo: views.py Projeto: cuchac/lino
def ajax_error(ar, e):
    """
    Utility function that converts a catched exception
    to a user-friendly error message.
    """
    if isinstance(e, exceptions.ValidationError):
        def fieldlabel(name):
            de = ar.ah.actor.get_data_elem(name)
            #~ print 20130423, de
            return force_unicode(getattr(de, 'verbose_name', name))
        #~ logger.info("20130418 ajax_error(%s",e.messages)
        #~ if isinstance(e.messages,dict):
        md = getattr(e, 'message_dict', None)
        if md is not None:
            e = '<br>'.join(["%s : %s" % (fieldlabel(k), v)
                            for k, v in md.items()])
        else:
            e = '<br>'.join(e.messages)
    ar.error(e, alert=True)
    return json_response(ar.response)
Exemplo n.º 7
0
Arquivo: views.py Projeto: raffas/lino
    def get(self, request, app_label=None, actor=None):
        ar = action_request(app_label, actor, request, request.GET, True)
        ar.renderer = settings.SITE.ui.extjs_renderer
        rh = ar.ah

        fmt = request.GET.get(
            ext_requests.URL_PARAM_FORMAT,
            ar.bound_action.action.default_format)

        if fmt == ext_requests.URL_FORMAT_JSON:
            rows = [rh.store.row2list(ar, row)
                    for row in ar.sliced_data_iterator]
            total_count = ar.get_total_count()
            for row in ar.create_phantom_rows():
                d = rh.store.row2list(ar, row)
                rows.append(d)
                total_count += 1
            kw = dict(count=total_count,
                      rows=rows,
                      success=True,
                      no_data_text=ar.no_data_text,
                      title=unicode(ar.get_title()))
            if ar.actor.parameters:
                kw.update(
                    param_values=ar.actor.params_layout.params_store.pv2dict(
                        ar.param_values))
            return json_response(kw)

        if fmt == ext_requests.URL_FORMAT_HTML:
            after_show = ar.get_status()

            sp = request.GET.get(
                ext_requests.URL_PARAM_SHOW_PARAMS_PANEL, None)
            if sp is not None:
                #~ after_show.update(show_params_panel=sp)
                after_show.update(
                    show_params_panel=ext_requests.parse_boolean(sp))

            if isinstance(ar.bound_action.action, actions.InsertRow):
                elem = ar.create_instance()
                #~ print 20120630
                #~ print elem.national_id
                rec = ar.elem2rec_insert(rh, elem)
                after_show.update(data_record=rec)

            kw = dict(on_ready=
                      ar.renderer.action_call(
                          ar.request,
                          ar.bound_action, after_show))
            #~ print '20110714 on_ready', params
            kw.update(title=ar.get_title())
            return http.HttpResponse(ar.renderer.html_page(request, **kw))

        if fmt == 'csv':
            #~ response = HttpResponse(mimetype='text/csv')
            charset = settings.SITE.csv_params.get('encoding', 'utf-8')
            response = http.HttpResponse(
                content_type='text/csv;charset="%s"' % charset)
            if False:
                response['Content-Disposition'] = \
                    'attachment; filename="%s.csv"' % ar.actor
            else:
                #~ response = HttpResponse(content_type='application/csv')
                response['Content-Disposition'] = \
                    'inline; filename="%s.csv"' % ar.actor

            #~ response['Content-Disposition'] = 'attachment; filename=%s.csv' % ar.get_base_filename()
            w = ucsv.UnicodeWriter(response, **settings.SITE.csv_params)
            w.writerow(ar.ah.store.column_names())
            if True:  # 20130418 : also column headers, not only internal names
                column_names = None
                fields, headers, cellwidths = ar.get_field_info(column_names)
                w.writerow(headers)

            for row in ar.data_iterator:
                w.writerow([unicode(v) for v in rh.store.row2list(ar, row)])
            return response

        if fmt == ext_requests.URL_FORMAT_PRINTER:
            if ar.get_total_count() > MAX_ROW_COUNT:
                raise Exception(_("List contains more than %d rows") %
                                MAX_ROW_COUNT)
            response = http.HttpResponse(
                content_type='text/html;charset="utf-8"')
            doc = xghtml.Document(force_unicode(ar.get_title()))
            doc.body.append(E.h1(doc.title))
            t = doc.add_table()
            #~ settings.SITE.ui.ar2html(ar,t,ar.data_iterator)
            ar.dump2html(t, ar.data_iterator)
            doc.write(response, encoding='utf-8')
            return response

        return settings.SITE.ui.run_action(ar)
Exemplo n.º 8
0
Arquivo: views.py Projeto: raffas/lino
    def get(self, request, app_label=None, actor=None, pk=None):
        ui = settings.SITE.ui
        rpt = requested_actor(app_label, actor)

        action_name = request.GET.get(ext_requests.URL_PARAM_ACTION_NAME,
                                      rpt.default_elem_action_name)
        ba = rpt.get_url_action(action_name)
        if ba is None:
            raise http.Http404("%s has no action %r" % (rpt, action_name))

        if pk and pk != '-99999' and pk != '-99998':
            #~ ar = ba.request(request=request,selected_pks=[pk])
            #~ print 20131004, ba.actor
            ar = ba.request(request=request)

            ar.set_selected_pks(pk)
            elem = ar.selected_rows[0]
            if elem is None:
                raise http.Http404(
                    "%s has no row with primary key %r" % (rpt, pk))
        else:
            ar = ba.request(request=request)
            elem = None

        ar.renderer = ui.extjs_renderer
        ah = ar.ah

        fmt = request.GET.get(
            ext_requests.URL_PARAM_FORMAT, ba.action.default_format)

        if ba.action.opens_a_window:

            if fmt == ext_requests.URL_FORMAT_JSON:
                if pk == '-99999':
                    elem = ar.create_instance()
                    datarec = ar.elem2rec_insert(ah, elem)
                elif pk == '-99998':
                    elem = ar.create_instance()
                    datarec = elem2rec_empty(ar, ah, elem)
                else:
                    datarec = ar.elem2rec_detailed(elem)

                return json_response(datarec)

            after_show = ar.get_status(record_id=pk)

            tab = request.GET.get(ext_requests.URL_PARAM_TAB, None)
            if tab is not None:
                tab = int(tab)
                after_show.update(active_tab=tab)

            return http.HttpResponse(
                ui.extjs_renderer.html_page(
                    request, ba.action.label,
                    on_ready=ui.extjs_renderer.action_call(
                        request, ba, after_show)))

        if isinstance(ba.action, actions.RedirectAction):
            target = ba.action.get_target_url(elem)
            if target is None:
                raise http.Http404("%s failed for %r" % (ba, elem))
            return http.HttpResponseRedirect(target)

        if pk == '-99998':
            assert elem is None
            elem = ar.create_instance()
            ar.selected_rows = [elem]

        return settings.SITE.ui.run_action(ar)
Exemplo n.º 9
0
Arquivo: views.py Projeto: cuchac/lino
    else:

        ar.response.update(message=_("%s : nothing to save.") %
                           dd.obj2unicode(elem))

    elem.after_ui_save(ar)

    if restful:
        # restful mode (used only for Ext.ensible) needs list_fields, not
        # detail_fields
        ar.response.update(
            rows=[rh.store.row2dict(ar, elem, rh.store.list_fields)])
    elif file_upload:
        ar.response.update(record_id=elem.pk)
        return json_response(ar.response, content_type='text/html')
    else:  # 20120814
        #~ logger.info("20120816 %r", ar.action)
        #~ if isinstance(ar.bound_action.action,actions.GridEdit):
        # ~ if ar.bound_action.action.action_name in ('put','post'): # grid.on_afteredit
            #~ kw.update(rows=[rh.store.row2list(ar,elem)])
        #~ else:
            #~ kw.update(data_record=elem2rec_detailed(ar,elem))
        """
        TODO: in fact we need *either* `rows` (when this was called from a Grid)
        *or* `data_record` (when this was called from a form).
        But how to find out which one is needed?
        """
        ar.response.update(rows=[rh.store.row2list(ar, elem)])
        ar.response.update(data_record=elem2rec_detailed(ar, elem))
    #~ logger.info("20120208 form2obj_and_save --> %r",kw)