def get_slave_summary(self, response, ar): """Presents this response as a table with one row per question and one column for each response of the same poll. The answers for this response are editable if this response is not registered. The answers of other responses are never editable. """ if response is None: return if response.poll_id is None: return AnswerRemarks = rt.modules.polls.AnswerRemarksByAnswer all_responses = rt.modules.polls.Response.objects.filter(poll=response.poll).order_by("date") if response.partner: all_responses = all_responses.filter(partner=response.partner) ht = xghtml.Table() ht.attrib.update(cellspacing="5px", bgcolor="#ffffff", width="100%") cellattrs = dict(align="left", valign="top", bgcolor="#eeeeee") headers = [_("Question")] for r in all_responses: if r == response: headers.append(dd.fds(r.date)) else: headers.append(ar.obj2html(r, dd.fds(r.date))) ht.add_header_row(*headers, **cellattrs) ar.master_instance = response # must set it because # get_data_rows() needs it. editable = Responses.update_action.request_from(ar).get_permission(response) kv = dict(response=response) insert = AnswerRemarks.insert_action.request_from(ar, known_values=kv) detail = AnswerRemarks.detail_action.request_from(ar) # editable = insert.get_permission(response) for answer in self.get_data_rows(ar): cells = [self.question.value_from_object(answer, ar)] for r in all_responses: if editable and r == response: insert.known_values.update(question=answer.question) detail.known_values.update(question=answer.question) items = [self.answer_buttons.value_from_object(answer, ar)] if answer.remark.remark: items += [E.br(), answer.remark.remark] if answer.remark.pk: items += [" ", detail.ar2button(answer.remark, _("Remark"), icon_name=None)] # ar.obj2html(answer.remark, _("Remark"))] else: btn = insert.ar2button(answer.remark, _("Remark"), icon_name=None) # sar = RemarksByAnswer.request_from(ar, answer) # btn = sar.insert_button(_("Remark"), icon_name=None) items += [" (", btn, ")"] else: other_answer = AnswersByResponseRow(r, answer.question) items = [unicode(other_answer)] if other_answer.remark.remark: items += [E.br(), answer.remark.remark] cells.append(E.p(*items)) ht.add_body_row(*cells, **cellattrs) return E.div(ht.as_element(), class_="htmlText")
def get_name_elems(self, ar): elems = [self.get_salutation(nominative=True), E.br()] if self.title: elems += [self.title, ' '] elems += [self.first_name, ' ', E.b(self.last_name), E.br()] return elems
def remote_html(self, ar): elems = [] elems += [self.remote_account, " "] elems += ["(BIC:", self.remote_bic, ")"] elems.append(E.br()) elems += [E.b(self.remote_owner), ", "] elems.append(E.br()) elems += [" / ".join(self.remote_owner_address.splitlines()), ", "] elems += [self.remote_owner_postalcode, " "] elems += [self.remote_owner_city, " "] elems += [self.remote_owner_country_code] return E.div(*elems)
def remote_html(self, ar): elems = [] elems += [self.remote_account, " "] elems += ["(BIC:", self.remote_bic, ")"] elems.append(E.br()) elems += [E.b(self.remote_owner), ", "] elems.append(E.br()) elems += [" / ".join(self.remote_owner_address.splitlines()), ", "] elems += [self.remote_owner_postalcode, " "] elems += [self.remote_owner_city, " "] elems += [self.remote_owner_country_code] return E.div(*elems)
def message_html(self, ar): from django.utils.translation import ugettext as _ elems = [] # elems += [_("Date"), dd.fds(self.transaction_date), " "] # elems += [_("Amount"), ' ', E.b(unicode(self.amount)), " "] # self.booking_date elems += self.message # .splitlines() elems.append(E.br()) # elems += [_("ref:"), ': ', self.ref, ' '] elems += [_("eref:"), ': ', self.eref] elems.append(E.br()) elems += [E.b(self.txcd_text), ' '] elems += [_("Value date"), ': ', E.b(dd.fds(self.value_date)), " "] elems += [_("Booking date"), ': ', E.b(dd.fds(self.booking_date)), " "] return E.div(*elems)
def get_slave_summary(self, obj, ar): elems = [] sar = self.request(master_instance=obj) # elems += ["Partner:", unicode(ar.master_instance)] for voucher in sar: vc = voucher.get_mti_leaf() if vc and vc.state.name == "draft": elems += [ar.obj2html(vc), " "] vtypes = set() for m in rt.models_by_base(vat.VatDocument): vtypes.add( VoucherTypes.get_by_value(dd.full_model_name(m))) actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True for vt in vtypes: for jnl in vt.get_journals(): sar = ar.spawn( vt.table_class, master_instance=jnl, known_values=dict(partner=obj)) if add_action(sar.insert_button(unicode(jnl), icon_name=None)): actions.append(' ') elems += [E.br(), _("Create voucher in journal ")] + actions return E.div(*elems)
def message_html(self, ar): from django.utils.translation import ugettext as _ elems = [] # elems += [_("Date"), dd.fds(self.transaction_date), " "] # elems += [_("Amount"), ' ', E.b(unicode(self.amount)), " "] # self.booking_date elems += self.message # .splitlines() elems.append(E.br()) # elems += [_("ref:"), ': ', self.ref, ' '] elems += [_("eref:"), ': ', self.eref] elems.append(E.br()) elems += [E.b(self.txcd_text), ' '] elems += [_("Value date"), ': ', E.b(dd.fds(self.value_date)), " "] elems += [_("Booking date"), ': ', E.b(dd.fds(self.booking_date)), " "] return E.div(*elems)
def get_slave_summary(self, obj, ar): vtypes = set() for m in dd.models_by_base(vat.VatDocument): vtypes.add( VoucherTypes.get_by_value(dd.full_model_name(m))) elems = [] actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True for jnl in Journal.objects.filter(voucher_type__in=vtypes): sar = ar.spawn( InvoicesByJournal, master_instance=jnl, known_values=dict(partner=obj)) # logger.info( # "20140604 sar.requesting_panel %s", # sar.requesting_panel) if add_action(sar.insert_button(unicode(jnl), icon_name=None)): actions.append(' ') elems += [E.br(), _("Create voucher in journal ")] + actions return E.div(*elems)
def get_slave_summary(self, obj, ar): elems = [] sar = self.request(master_instance=obj) # elems += ["Partner:", unicode(ar.master_instance)] for voucher in sar: vc = voucher.get_mti_leaf() if vc and vc.state.name == "draft": elems += [ar.obj2html(vc), " "] vtypes = [] for vt in VoucherTypes.items(): if issubclass(vt.model, VatDocument): vtypes.append(vt) actions = [] if not ar.get_user().profile.readonly: for vt in vtypes: for jnl in vt.get_journals(): sar = vt.table_class.insert_action.request_from( ar, master_instance=jnl, known_values=dict(partner=obj)) btn = sar.ar2button(label=unicode(jnl), icon_name=None) if len(actions): actions.append(', ') actions.append(btn) elems += [E.br(), _("Create voucher in journal"), " "] + actions return E.div(*elems)
def get_slave_summary(self, obj, ar): elems = [] sar = self.request(master_instance=obj) # elems += ["Partner:", unicode(ar.master_instance)] for voucher in sar: vc = voucher.get_mti_leaf() if vc and vc.state.name == "draft": elems += [ar.obj2html(vc), " "] vtypes = [] for vt in VoucherTypes.items(): if issubclass(vt.model, VatDocument): vtypes.append(vt) actions = [] if not ar.get_user().profile.readonly: for vt in vtypes: for jnl in vt.get_journals(): sar = vt.table_class.insert_action.request_from( ar, master_instance=jnl, known_values=dict(partner=obj)) btn = sar.ar2button(label=unicode(jnl), icon_name=None) if len(actions): actions.append(', ') actions.append(btn) elems += [E.br(), _("Create voucher in journal"), " "] + actions return E.div(*elems)
def what(self, obj, ar): chunks = [] if obj.name: chunks += [E.b(str(obj)), E.br()] chunks += sepjoin(obj.features.all()) #~ if obj.url: #~ chunks += [E.br(),E.a(_("More"),href=obj.url)] return E.p(*chunks)
def what(self, obj, ar): chunks = [] if obj.name: chunks += [E.b(unicode(obj)), E.br()] chunks += sepjoin(obj.features.all()) #~ if obj.url: #~ chunks += [E.br(),E.a(_("More"),href=obj.url)] return E.p(*chunks)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) links = [] for lnk in sar: if lnk.child.id == obj.id: i = (lnk.type.as_child(obj), lnk.parent) else: i = (lnk.type.as_parent(obj), lnk.child) links.append(i) def by_age(a, b): return cmp(b[1].birth_date.as_date(), a[1].birth_date.as_date()) try: links.sort(by_age) except AttributeError: # 'str' object has no attribute 'as_date' # possible when incomplete or empty birth_date pass items = [] for type, other in links: items.append(E.li( unicode(type), _(" of "), obj.format_family_member(ar, other), " (%s)" % other.age() )) elems = [] if len(items) > 0: elems += [_("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(_("No relationships.")) actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True for lt in addable_link_types: sar = ar.spawn(Links, known_values=dict(type=lt, parent=obj)) if add_action(sar.insert_button( lt.as_parent(obj), icon_name=None)): if not lt.symmetric: actions.append('/') sar = ar.spawn( Links, known_values=dict(type=lt, child=obj)) add_action(sar.insert_button( lt.as_child(obj), icon_name=None)) actions.append(' ') elems += [E.br(), _("Create relationship as ")] + actions return E.div(*elems)
def results(self, ar): if ar is None: return cells = [] for sf in StatisticalFields.objects(): v = getattr(self, sf.field_name) cells.append(E.td( unicode(sf.text), E.br(), unicode(v), **ar.renderer.cellattrs)) return E.table(E.tr(*cells), **ar.renderer.tableattrs)
def UL(items): # ~ return E.ul(*[E.li(i) for i in items]) newitems = [] first = True for i in items: if first: first = False else: newitems.append(E.br()) newitems.append(i) return E.p(*newitems)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (unicode(m.role), _(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) if False: elems += [ E.br(), ar.instance_action_button(obj.create_household)] else: elems += [E.br(), _("Create a household"), ' : '] Type = rt.modules.households.Type Person = dd.resolve_model(config.person_model) T = Person.get_default_table() ba = T.get_action_by_name('create_household') buttons = [] for t in Type.objects.all(): apv = dict(type=t, head=obj) sar = ar.spawn(ba, # master_instance=obj, selected_rows=[obj], action_param_values=apv) buttons.append(ar.href_to_request(sar, unicode(t))) elems += join_elems(buttons, sep=' / ') return E.div(*elems)
def active_contract(obj, ar): c = obj.get_active_contract() if c is not None: txt = unicode(daterange_text(c.applies_from, c.applies_until)) if isinstance(c, rt.modules.jobs.Contract): if c.company is not None: # txt += unicode(pgettext("(place)", " at ")) # txt += '\n' # txt += unicode(c.company) txt = (txt, E.br(), c.company.name) if ar is None: return txt return ar.obj2html(c, txt)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (unicode(m.role), _(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) if False: elems += [ E.br(), ar.instance_action_button(obj.create_household)] else: elems += [E.br(), _("Create a household"), ' : '] Type = rt.modules.households.Type Person = dd.resolve_model(config.person_model) T = Person.get_default_table() ba = T.get_action_by_name('create_household') buttons = [] for t in Type.objects.all(): apv = dict(type=t, head=obj) sar = ar.spawn(ba, # master_instance=obj, action_param_values=apv) buttons.append(ar.href_to_request(sar, unicode(t))) elems += join_elems(buttons, sep=' / ') return E.div(*elems)
def get_overview_elems(self, ar): elems = [] buttons = self.get_mti_buttons(ar) buttons = join_elems(buttons, ', ') elems.append(E.p(unicode(_("See as ")), *buttons, style="font-size:8px;text-align:right;padding:3pt;")) elems += self.get_name_elems(ar) elems.append(E.br()) elems += join_elems(list(self.address_location_lines()), sep=E.br) elems = [ E.div(*elems, style="font-size:18px;font-weigth:bold;" "vertical-align:bottom;text-align:middle")] return elems
def body_subject_to_elems(ar, title, description): """Convert the given `title` and `description` to a list of HTML elements. Used by :mod:`lino.modlib.notify` and by :mod:`lino_cosi.lib.sales` """ if description: elems = [E.p(E.b(title), E.br())] elems += rich_text_to_elems(ar, description) else: elems = [E.b(title)] # return E.span(self.title) return elems
def body_subject_to_elems(ar, title, description): """Convert the given `title` and `description` to a list of HTML elements. Used by :mod:`lino.modlib.notify` and by :mod:`lino_cosi.lib.sales` """ if description: elems = [E.p(E.b(title), E.br())] elems += rich_text_to_elems(ar, description) else: elems = [E.b(title)] # return E.span(self.title) return elems
def get_overview_elems(self, ar): elems = [] buttons = self.get_mti_buttons(ar) # buttons = join_elems(buttons, ', ') elems.append( E.p(str(_("See as ")), *buttons, style="font-size:8px;text-align:right;padding:3pt;")) elems += self.get_name_elems(ar) elems.append(E.br()) elems += join_elems(list(self.address_location_lines()), sep=E.br) elems = [ E.div(*elems, style="font-size:18px;font-weigth:bold;" "vertical-align:bottom;text-align:middle") ] return elems
def eid_info(self, ar): "Display some information about the eID card." if ar is None: return '' must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += [ "%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type) ] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < dd.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") if config: elems.append( ar.instance_action_button(self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: items.append(E.li( unicode(m.role), _(" in "), # unicode(m.household.type), " ", ar.obj2html(m.household))) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) elems += [ E.br(), ar.instance_action_button(obj.create_household)] return E.div(*elems)
def eid_info(self, ar): must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += ["%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type)] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < datetime.date.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") #~ if settings.SITE.use_eid_jslib or settings.SITE.use_eidreader: if config: #~ ba = cls.get_action_by_name('read_beid') #~ elems.append(ar.action_button(ba,self,_("Must read eID card!"))) elems.append(ar.instance_action_button( self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def eid_info(self, ar): "Display some information about the eID card." if ar is None: return '' must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += ["%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type)] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < dd.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") if config: elems.append(ar.instance_action_button( self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def get_slave_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>` for :class:`LinksByHuman`. """ # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(obj), lnk.parent) else: i = (lnk.type.as_parent(obj), lnk.child) links.append(i) def by_age(a, b): return cmp(b[1].birth_date.as_date(), a[1].birth_date.as_date()) try: links.sort(by_age) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass items = [] for type, other in links: items.append( E.li(unicode(type), _(" of "), obj.format_family_member(ar, other), " (%s)" % other.age)) elems = [] if len(items) > 0: elems += [_("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(_("No relationships.")) # Buttons for creating relationships: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in self.addable_link_types: sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) #sar = ar.spawn(self, known_values=dict(type=lt, parent=obj)) btn = sar.ar2button(None, lt.as_parent(obj), icon_name=None) actions.append(btn) if not lt.symmetric: actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn = sar.ar2button(None, lt.as_child(obj), icon_name=None) actions.append(btn) actions.append(' ') if len(actions) > 0: elems += [E.br(), _("Create relationship as ")] + actions return E.div(*elems)
def get_slave_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>` for :class:`LinksByTicket`. """ # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(), lnk.parent) else: i = (lnk.type.as_parent(), lnk.child) links.append(i) def by_age(a): return a[1].modified try: links.sort(key=by_age) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass tbt = dict() # tickets by lnktype for lnktype, other in links: lst = tbt.setdefault(lnktype, []) txt = "#%d" % other.id lst.append(ar.obj2html(other, txt, title=other.summary)) items = [] for lnktype, lst in tbt.items(): items.append(E.li(unicode(lnktype), ": ", *join_elems(lst, ', '))) elems = [] if len(items) > 0: # elems += join_elems(items) # elems.append(l(*items)) elems.append(E.ul(*items)) # else: # elems.append(_("No dependencies.")) # Buttons for creating relationships: sar = obj.spawn_triggered.request_from(ar) if ar.renderer.is_interactive and sar.get_permission(): btn = sar.ar2button(obj) elems += [E.br(), btn] sar = self.insert_action.request_from(ar) if ar.renderer.is_interactive and sar.get_permission(): actions = [] for lt in LinkTypes.objects(): actions.append(E.br()) sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) btn = sar.ar2button(None, lt.as_parent(), icon_name=None) if not lt.symmetric: # actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn2 = sar.ar2button(None, lt.as_child(), icon_name=None) # actions.append(btn) btn = E.span(btn, '/', btn2) actions.append(btn) # actions.append(' ') # actions = join_elems(actions, E.br) if len(actions) > 0: elems += [E.br(), _("Create dependency as ")] + actions return E.div(*elems)
def get_slave_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>` for :class:`LinksByHuman`. """ # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(obj), lnk.parent) else: i = (lnk.type.as_parent(obj), lnk.child) links.append(i) def by_age(a, b): return cmp(b[1].birth_date.as_date(), a[1].birth_date.as_date()) try: links.sort(by_age) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass items = [] for type, other in links: items.append(E.li( str(type), _(" of "), obj.format_family_member(ar, other), " (%s)" % other.age )) elems = [] if len(items) > 0: elems += [_("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(_("No relationships.")) # Buttons for creating relationships: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in self.addable_link_types: sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) #sar = ar.spawn(self, known_values=dict(type=lt, parent=obj)) btn = sar.ar2button(None, lt.as_parent(obj), icon_name=None) actions.append(btn) if not lt.symmetric: actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn = sar.ar2button(None, lt.as_child(obj), icon_name=None) actions.append(btn) actions.append(' ') if len(actions) > 0: elems += [E.br(), _("Create relationship as ")] + actions return E.div(*elems)
def get_name_elems(self, ar): elems = [] if self.prefix: elems += [self.prefix, ' '] elems += [E.b(self.name), E.br()] return elems
def get_name_elems(self, ar): return [E.b(self.name), E.br()]
def get_name_elems(self, ar): elems = [self.get_salutation(nominative=True), ' ', self.title, E.br()] elems += [self.first_name, ' ', E.b(self.last_name)] return elems
def get_slave_summary(self, response, ar): """Presents this response as a table with one row per question and one column for each response of the same poll. The answers for this response are editable if this response is not registered. The answers of other responses are never editable. """ if response is None: return if response.poll_id is None: return AnswerRemarks = rt.modules.polls.AnswerRemarksByAnswer all_responses = rt.modules.polls.Response.objects.filter( poll=response.poll).order_by('date') if response.partner: all_responses = all_responses.filter(partner=response.partner) ht = xghtml.Table() ht.attrib.update(cellspacing="5px", bgcolor="#ffffff", width="100%") cellattrs = dict(align="left", valign="top", bgcolor="#eeeeee") headers = [_("Question")] for r in all_responses: if r == response: headers.append(dd.fds(r.date)) else: headers.append(ar.obj2html(r, dd.fds(r.date))) ht.add_header_row(*headers, **cellattrs) ar.master_instance = response # must set it because # get_data_rows() needs it. # 20151211 # editable = Responses.update_action.request_from(ar).get_permission( # response) sar = Responses.update_action.request_from(ar) sar.selected_rows = [response] editable = sar.get_permission() kv = dict(response=response) insert = AnswerRemarks.insert_action.request_from(ar, known_values=kv) detail = AnswerRemarks.detail_action.request_from(ar) # editable = insert.get_permission(response) for answer in self.get_data_rows(ar): cells = [self.question.value_from_object(answer, ar)] for r in all_responses: if editable and r == response: insert.known_values.update(question=answer.question) detail.known_values.update(question=answer.question) items = [self.answer_buttons.value_from_object(answer, ar)] if answer.remark.remark: items += [E.br(), answer.remark.remark] if answer.remark.pk: items += [ ' ', detail.ar2button(answer.remark, _("Remark"), icon_name=None) ] # ar.obj2html(answer.remark, _("Remark"))] else: btn = insert.ar2button(answer.remark, _("Remark"), icon_name=None) # sar = RemarksByAnswer.request_from(ar, answer) # btn = sar.insert_button(_("Remark"), icon_name=None) items += [" (", btn, ")"] else: other_answer = AnswersByResponseRow(r, answer.question) items = [str(other_answer)] if other_answer.remark.remark: items += [E.br(), answer.remark.remark] cells.append(E.p(*items)) ht.add_body_row(*cells, **cellattrs) return ar.html_text(ht.as_element())