Example #1
0
File: views.py Project: cuchac/lino
def choices_for_field(request, actor, field):
    """
    Return the choices for the given field and the given web request
    (whose requesting actor has already been identified and is given
    as `actor`).
    """
    #~ logger.info("20120202 %r",field)
    chooser = choosers.get_for_field(field)
    if chooser:
        qs = chooser.get_request_choices(request, actor)
        assert isiterable(qs), \
            "%s.%s_choices() returned %r which is not iterable." % (
                actor.model, field.name, qs)
        if chooser.simple_values:
            def row2dict(obj, d):
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj)
                d[ext_requests.CHOICES_VALUE_FIELD] = obj
                return d
        elif chooser.instance_values:
            # same code as for ForeignKey
            def row2dict(obj, d):
                d[ext_requests.CHOICES_TEXT_FIELD] = actor.get_choices_text(
                    obj, request, field)
                d[ext_requests.CHOICES_VALUE_FIELD] = obj.pk
                return d
        else:  # values are (value,text) tuples
            def row2dict(obj, d):
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj[1])
                d[ext_requests.CHOICES_VALUE_FIELD] = obj[0]
                return d
    elif field.choices:
        qs = field.choices

        def row2dict(obj, d):
            if type(obj) is list or type(obj) is tuple:
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj[1])
                d[ext_requests.CHOICES_VALUE_FIELD] = obj[0]
            else:
                d[ext_requests.CHOICES_TEXT_FIELD] = actor.get_choices_text(
                    obj, request, field)
                d[ext_requests.CHOICES_VALUE_FIELD] = unicode(obj)
            return d

    elif isinstance(field, models.ForeignKey):
        m = field.rel.to
        #~ t = getattr(m,'_lino_choices_table',m.get_default_table())
        t = m.get_default_table()
        qs = t.request(request=request).data_iterator
        #~ logger.info('20120710 choices_view(FK) %s --> %s',t,qs)

        def row2dict(obj, d):
            d[ext_requests.CHOICES_TEXT_FIELD] = actor.get_choices_text(
                obj, request, field)
            d[ext_requests.CHOICES_VALUE_FIELD] = obj.pk
            return d
    else:
        raise http.Http404("No choices for %s" % fldname)
    return (qs, row2dict)
Example #2
0
 def __init__(self,rh,action,main,**kw):
     self.rh = rh
     self.value_template = "new Lino.%s.FormPanel(ww,%%s)" % self.rh.report
     self.main = main
     kw.update(
       #~ items=main,
       #~ autoScroll=True,
       #~ autoHeight=True,
       layout='fit',
     )
     if not isinstance(action,reports.InsertRow):
         kw.update(has_navigator=rh.report.has_navigator)
         
     on_render = []
     elems_by_field = {}
     field_elems = []
     for e in main.active_children:
         if isinstance(e,FieldElement):
             field_elems.append(e)
             l = elems_by_field.get(e.field.name,None)
             if l is None:
                 l = []
                 elems_by_field[e.field.name] = l
             l.append(e)
         
     for e in field_elems:
         #~ if isinstance(e,FileFieldElement):
             #~ kw.update(fileUpload=True)
         chooser = choosers.get_for_field(e.field)
         if chooser:
             #~ logger.debug("20100615 %s.%s has chooser", self.lh.layout, e.field.name)
             for f in chooser.context_fields:
                 for el in elems_by_field.get(f.name,[]):
                     #~ if main.has_field(f):
                     #~ varname = varname_field(f)
                     #~ on_render.append("%s.on('change',Lino.chooser_handler(%s,%r));" % (varname,e.ext_name,f.name))
                     on_render.append(
                         "%s.on('change',Lino.chooser_handler(%s,%r));" % (
                         el.ext_name,e.ext_name,f.name))
     
     if on_render:
         assert not kw.has_key('listeners')
         #~ kw.update(listeners=dict(render=js_code('function(){%s}' % '\n'.join(on_render))))
         self.listeners=dict(render=js_code('function(){%s}' % '\n'.join(on_render)))
     #~ kw.update(before_row_edit=before_row_edit(main))
     self.before_row_edit=before_row_edit(main)
     
     rpt = rh.report
     a = rpt.get_action('detail')
     if a:
         kw.update(ls_detail_handler=js_code("Lino.%s" % a))
     a = rpt.get_action('insert')
     if a:
         kw.update(ls_insert_handler=js_code("Lino.%s" % a))
     
     kw.update(ls_bbar_actions=[rh.ui.a2btn(a) for a in rpt.get_actions(action)])
     kw.update(ls_url=rh.ui.build_url(rpt.app_label,rpt._actor_name))
     jsgen.Component.__init__(self,'form_panel',**kw)
Example #3
0
 def get_value_text(self, v, obj):
     #~ v = self.full_value_from_object(None,obj)
     if v is None or v == '':
         return (None, None)
     ch = choosers.get_for_field(self.field)
     if ch is not None:
         return (v, ch.get_text_for_value(v, obj))
     for i in self.field.choices:
         if i[0] == v:
             return (v, unicode(i[1]))
     return (v, _("%r (invalid choice)") % v)
Example #4
0
def choices_for_field(request,rpt,field):
    #~ logger.info("20120202 %r",field)
    chooser = choosers.get_for_field(field)
    if chooser:
        #~ logger.info('20120710 choices_view() : has chooser')
        qs = chooser.get_request_choices(request,rpt)
        #~ qs = list(chooser.get_request_choices(ar,rpt))
        #~ logger.info("20120213 %s",qs)
        #~ if qs is None:
            #~ qs = []
        assert isiterable(qs), \
              "%s.%s_choices() returned %r which is not iterable." % (
              rpt.model,field.name,qs)
        if chooser.simple_values:
            def row2dict(obj,d):
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj)
                #~ 20130117 : 'int' object has no attribute 'get_choices_text'
                d[ext_requests.CHOICES_VALUE_FIELD] = obj
                return d
        elif chooser.instance_values:
            # same code as for ForeignKey
            def row2dict(obj,d):
                d[ext_requests.CHOICES_TEXT_FIELD] = obj.get_choices_text(request,rpt,field)
                d[ext_requests.CHOICES_VALUE_FIELD] = obj.pk
                return d
        else:
            def row2dict(obj,d):
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj[1])
                #~ d[ext_requests.CHOICES_TEXT_FIELD] = obj[1].get_choices_text(request,rpt,field)
                d[ext_requests.CHOICES_VALUE_FIELD] = obj[0]
                return d
    elif field.choices:
        qs = field.choices
        def row2dict(obj,d):
            if type(obj) is list or type(obj) is tuple:
                d[ext_requests.CHOICES_TEXT_FIELD] = unicode(obj[1])
                d[ext_requests.CHOICES_VALUE_FIELD] = obj[0]
            else:
                d[ext_requests.CHOICES_TEXT_FIELD] = obj.get_choices_text(request,rpt,field)
                d[ext_requests.CHOICES_VALUE_FIELD] = unicode(obj)
            return d
        
    elif isinstance(field,models.ForeignKey):
        m = field.rel.to
        t = getattr(m,'_lino_choices_table',m._lino_default_table)
        qs = t.request(settings.LINO.ui,request).data_iterator
        #~ logger.info('20120710 choices_view(FK) %s --> %s',t,qs)
        def row2dict(obj,d):
            d[ext_requests.CHOICES_TEXT_FIELD] = obj.get_choices_text(request,rpt,field)
            d[ext_requests.CHOICES_VALUE_FIELD] = obj.pk 
            return d
    else:
        raise http.Http404("No choices for %s" % fldname)
    return (qs,row2dict)
Example #5
0
 def get_value_text(self,obj):
     v = getattr(obj,self.field.name)
     if v is None or v == '':
         return (None, None)
     ch = choosers.get_for_field(self.field) 
     if ch is not None:
         return (v, ch.get_text_for_value(v,obj))
     for i in self.field.choices:
         if i[0] == v:
             return (v, unicode(i[1]))
     return (v, _("%r (invalid choice)") % v)
Example #6
0
def before_row_edit(panel):
    l = []
    #~ l.append("console.log('before_row_edit',record);")
    for e in panel.active_children:
        if isinstance(e,GridElement):
            l.append("%s.on_master_changed();" % e.as_ext())
        elif isinstance(e,PictureElement):
            l.append("this.load_picture_to(%s,record);" % e.as_ext())
        elif isinstance(e,HtmlBoxElement):
            l.append("%s.refresh();" % e.as_ext())
        elif isinstance(e,FieldElement):
            chooser = choosers.get_for_field(e.field)
            if chooser:
                #~ logger.debug("20100615 %s.%s has chooser", self.lh.layout, e.field.name)
                for f in chooser.context_fields:
                    #~ l.append("console.log('20110128 before_row_edit',record.data);")
                    l.append("%s.setContextValue(%r,record ? record.data[%r] : undefined);" % (
                        e.ext_name,f.name,ext_requests.form_field_name(f)))
    #~ return js_code('function(record){\n  %s\n}' % ('\n  '.join(l)))
    return js_code('function(record){ %s }' % (' '.join(l)))
Example #7
0
 def field2elem(cls,lh,field,**kw):
     #~ if hasattr(field,'_lino_chooser'):
     ch = choosers.get_for_field(field)
     if ch:
         if ch.simple_values:
             return SimpleRemoteComboFieldElement(lh,field,**kw)
         else:
             if isinstance(field,models.ForeignKey):
                 return ForeignKeyElement(lh,field,**kw)
             else:
                 return ComplexRemoteComboFieldElement(lh,field,**kw)
     if field.choices:
         return ChoicesFieldElement(lh,field,**kw)
         
     if isinstance(field,fields.VirtualField):
         field = field.return_type
     for cl,x in _field2elem:
         if isinstance(field,cl):
             return x(lh,field,**kw)
     raise NotImplementedError("No LayoutElement for %s" % field.__class__)
Example #8
0
        else:
            return (v.pk, unicode(v))

    def parse_form_value(self, v, obj):
        relto_model = self.get_rel_to(obj)
        if not relto_model:
            #~ logger.info("20111209 get_value_text: no relto_model")
            return
        try:
            return relto_model.objects.get(pk=v)
        except ValueError, e:
            pass
        except relto_model.DoesNotExist, e:
            pass

        ch = choosers.get_for_field(self.field)
        if ch and ch.can_create_choice:
            return ch.create_choice(obj, v)
        return None


#~ class LinkedForeignKeyField(ForeignKeyStoreField):

    #~ def get_rel_to(self,obj):
        #~ ct = self.field.get_content_type(obj)
        #~ if ct is None:
            #~ return None
        #~ return ct.model_class()


class VirtStoreField(StoreField):