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)
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)
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)
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)
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)
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)))
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__)
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):