def get_slave_summary(self, obj, ar): # For every child, we want to display its relationship to # every parent of this household. sar = self.request(master_instance=obj) if sar.master_household is None: return E.div(ar.no_data_text) # obj is the Person for which we display the household def format_item(m): elems = [unicode(m.role), ': '] if m.person: elems += [obj.format_family_member(ar, m.person)] hl = self.find_links(ar, m.person, obj) if len(hl): elems += [' ('] + hl + [')'] else: elems += [obj.format_family_member(ar, m)] return elems items = [] for m in sar.data_iterator: items.append(E.li(*format_item(m))) elems = [] if len(items) > 0: elems = [] elems.append(E.ul(*items)) return E.div(*elems)
def get_slave_summary(self, obj, ar): # For every child, we want to display its relationship to # every parent of this household. sar = self.request(master_instance=obj) if sar.master_household is None: return E.div(ar.no_data_text) # obj is the Person for which we display the household def format_item(m): elems = [unicode(m.role), ': '] if m.person: elems += [obj.format_family_member(ar, m.person)] hl = self.find_links(ar, m.person, obj) if len(hl): elems += [' ('] + hl + [')'] else: elems += [obj.format_family_member(ar, m)] return elems items = [] for m in sar.data_iterator: items.append(E.li(*format_item(m))) elems = [] if len(items) > 0: elems = [] elems.append(E.ul(*items)) return E.div(*elems)
def f(obj, ar): if obj is None or ar is None: return E.div() try: utype = UploadType.objects.get(shortcut=i) except UploadType.DoesNotExist: return E.div() items = [] target = sender.modules.resolve(i.target) sar = ar.spawn_request(actor=target, master_instance=obj, known_values=dict(type=utype)) # param_values=dict(pupload_type=et)) n = sar.get_total_count() if n == 0: iar = target.insert_action.request_from(sar, master_instance=obj) btn = iar.ar2button( None, _("Upload"), icon_name="page_add", title=_("Upload a file from your PC to the server.")) items.append(btn) elif n == 1: after_show = ar.get_status() obj = sar.data_iterator[0] items.append( sar.renderer.href_button(dd.build_media_url(obj.file.name), _("show"), target='_blank', icon_name='page_go', style="vertical-align:-30%;", title=_( "Open the uploaded file in a " "new browser window"))) after_show.update(record_id=obj.pk) items.append( sar.window_action_button( sar.ah.actor.detail_action, after_show, _("Edit"), icon_name='application_form', title=_("Edit metadata of the uploaded file."))) else: obj = sar.sliced_data_iterator[0] items.append( ar.obj2html(obj, pgettext("uploaded file", "Last"))) btn = sar.renderer.action_button(obj, sar, sar.bound_action, _("All {0} files").format(n), icon_name=None) items.append(btn) return E.div(*join_elems(items, ', '))
def table2html(ar, as_main=True): """This is not a docstring.""" as_main = True t = xghtml.Table() t.attrib.update(class_="table table-striped table-hover") if ar.limit is None: ar.limit = PLAIN_PAGE_LENGTH pglen = ar.limit if ar.offset is None: page = 1 else: """ (assuming pglen is 5) offset page 0 1 5 2 """ page = int(ar.offset / pglen) + 1 ar.dump2html(t, ar.sliced_data_iterator) if not as_main: url = ar.get_request_url() # open in own window return E.div(E.a(ar.get_title(), href=url), t.as_element()) buttons = [] kw = dict() kw = {} if pglen != PLAIN_PAGE_LENGTH: kw[constants.URL_PARAM_LIMIT] = pglen if page > 1: kw[constants.URL_PARAM_START] = pglen * (page - 2) prev_url = ar.get_request_url(**kw) kw[constants.URL_PARAM_START] = 0 first_url = ar.get_request_url(**kw) else: prev_url = None first_url = None buttons.append(('<<', _("First page"), first_url)) buttons.append(('<', _("Previous page"), prev_url)) next_start = pglen * page if next_start < ar.get_total_count(): kw[constants.URL_PARAM_START] = next_start next_url = ar.get_request_url(**kw) last_page = int((ar.get_total_count() - 1) / pglen) kw[constants.URL_PARAM_START] = pglen * last_page last_url = ar.get_request_url(**kw) else: next_url = None last_url = None buttons.append(('>', _("Next page"), next_url)) buttons.append(('>>', _("Last page"), last_url)) return E.div(buttons2pager(buttons), t.as_element())
def f(obj, ar): if obj is None or ar is None: return E.div() try: utype = UploadType.objects.get(shortcut=i) except UploadType.DoesNotExist: return E.div() items = [] target = sender.modules.resolve(i.target) sar = ar.spawn_request( actor=target, master_instance=obj, known_values=dict(type=utype)) # param_values=dict(pupload_type=et)) n = sar.get_total_count() if n == 0: iar = target.insert_action.request_from( sar, master_instance=obj) btn = iar.ar2button( None, _("Upload"), icon_name="page_add", title=_("Upload a file from your PC to the server.")) items.append(btn) elif n == 1: after_show = ar.get_status() obj = sar.data_iterator[0] items.append(sar.renderer.href_button( dd.build_media_url(obj.file.name), _("show"), target='_blank', icon_name='page_go', style="vertical-align:-30%;", title=_("Open the uploaded file in a " "new browser window"))) after_show.update(record_id=obj.pk) items.append(sar.window_action_button( sar.ah.actor.detail_action, after_show, _("Edit"), icon_name='application_form', title=_("Edit metadata of the uploaded file."))) else: obj = sar.sliced_data_iterator[0] items.append(ar.obj2html( obj, pgettext("uploaded file", "Last"))) btn = sar.renderer.action_button( obj, sar, sar.bound_action, _("All {0} files").format(n), icon_name=None) items.append(btn) return E.div(*join_elems(items, ', '))
def build_confirmation_message(self): self.analyze() items = [] def collect_summary(prefix, fk_qs): parts = [] for fld, qs in fk_qs: if qs.count() > 0: parts.append( "%d %s" % ( qs.count(), str( fld.model._meta.verbose_name_plural))) if len(parts) != 0: items.append(E.li(', '.join(parts), ' ', E.b(prefix))) collect_summary(_("will be deleted."), self.volatiles) collect_summary(_("will get reassigned."), self.related + self.generic_related) items.append(E.li(_("%s will be deleted") % self.obj)) msg = _("Are you sure you want to merge " "%(this)s into %(merge_to)s?") % dict( this=self.obj, merge_to=self.merge_to) if len(items) != 0: # return E.div(E.p(msg), E.ul(*items), class_="htmlText") return rt.html_text(E.div(E.p(msg), E.ul(*items))) return msg
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 build_confirmation_message(self): self.analyze() items = [] def collect_summary(prefix, fk_qs): parts = [] for fld, qs in fk_qs: if qs.count() > 0: parts.append( "%d %s" % (qs.count(), str(fld.model._meta.verbose_name_plural))) if len(parts) != 0: items.append(E.li(', '.join(parts), ' ', E.b(prefix))) collect_summary(_("will be deleted."), self.volatiles) collect_summary(_("will get reassigned."), self.related + self.generic_related) items.append(E.li(_("%s will be deleted") % self.obj)) msg = _("Are you sure you want to merge " "%(this)s into %(merge_to)s?") % dict(this=self.obj, merge_to=self.merge_to) if len(items) != 0: # return E.div(E.p(msg), E.ul(*items), class_="htmlText") return rt.html_text(E.div(E.p(msg), E.ul(*items))) return msg
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) #~ print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) #~ raise ValueError("Expected float, go %r" % dt) return unicode(_("%(date)s at %(time)s")) % dict( date=dd.fdf(dt.date()), time=dt.time()) items = [] times = [] value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.p(unicode(_("Source timestamps:")))) for src in ("lino", "lino_welfare", 'django', 'atelier'): label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) def mycmp(a, b): return cmp(b[1], a[1]) times.sort(mycmp) for label, value in times: items.append(E.li(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) return E.div(*body, class_='htmlText')
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_notify_message(self, ar, cw): """Returns the text of the notification message to emit. The default implementation returns a message of style "{object} has been modified by {user}" followed by a summary of the changes. Application code can override this. Returning None or an empty string means to suppress notification. """ if cw is None: return items = list(cw.get_updates_html()) if len(items) == 0: return elems = [E.p( ar.obj2html(self), ' ', _("has been modified by {user}").format( user=ar.get_user()), ":")] elems.append(E.ul(*items)) if False: elems.append(E.p(_( "Subsequent changes to {obj} will not be notified " "until you visit {url} and mark this notification " "as seen.").format( url=settings.SITE.server_url or "Lino", obj=self.get_notify_owner(ar)))) return E.tostring(E.div(*elems))
def get_change_body(self, ar, cw): """Returns the text of the notification message to emit. The default implementation returns a message of style "{object} has been modified by {user}" followed by a summary of the changes. Application code can override this. Returning None or an empty string means to suppress notification. """ if cw is None: elems = [ E.p(ar.obj2memo(self), ' ', _("has been created by {user}").format(user=ar.get_user())) ] else: items = list(cw.get_updates_html()) if len(items) == 0: return elems = [ E.p( ar.obj2memo(self), ' ', _("has been modified by {user}").format( user=ar.get_user()), ":") ] elems.append(E.ul(*items)) return E.tostring(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 = 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 get_slave_summary(self, obj, ar): """Displays a summary of all responses for a given partner using a bullet list grouped by poll. """ if obj is None: return visible_polls = Poll.objects.filter( state__in=(PollStates.published, PollStates.closed)).order_by('ref') qs = Response.objects.filter(partner=obj).order_by('date') polls_responses = {} for resp in qs: polls_responses.setdefault(resp.poll.pk, []).append(resp) items = [] for poll in visible_polls: iar = self.insert_action.request_from(ar, obj, known_values=dict(poll=poll)) elems = [str(poll), ' : '] responses = polls_responses.get(poll.pk, []) elems += join_elems( [ar.obj2html(r, dd.fds(r.date)) for r in responses], sep=', ') if poll.state == PollStates.published: elems += [' ', iar.ar2button()] #elems += [' ', iar.insert_button()] items.append(E.li(*elems)) return E.div(E.ul(*items))
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) #~ print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) #~ raise ValueError("Expected float, go %r" % dt) return unicode(_("%(date)s at %(time)s")) % dict( date=dd.fdf(dt.date()), time=dt.time()) items = [] times = [] value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.p(unicode(_("Source timestamps:")))) for src in ("lino", "lino_welfare", 'django', 'atelier'): label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) def mycmp(a, b): return cmp(b[1], a[1]) times.sort(mycmp) for label, value in times: items.append(E.li(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) return E.div(*body, class_='htmlText')
def server_status(cls, obj, ar): body = [] body.append( E.p( _("%s pending threads") % len(settings.SITE.kernel.pending_threads))) return E.div(*body, class_='htmlText')
def get_slave_summary(self, obj, ar): """Displays a summary of all responses for a given partner using a bullet list grouped by poll. """ if obj is None: return visible_polls = Poll.objects.filter(state__in=(PollStates.published, PollStates.closed)).order_by("ref") qs = Response.objects.filter(partner=obj).order_by("date") polls_responses = {} for resp in qs: polls_responses.setdefault(resp.poll.pk, []).append(resp) items = [] for poll in visible_polls: iar = self.insert_action.request_from(ar, obj, known_values=dict(poll=poll)) elems = [unicode(poll), " : "] responses = polls_responses.get(poll.pk, []) elems += join_elems([ar.obj2html(r, dd.fds(r.date)) for r in responses], sep=", ") if poll.state == PollStates.published: elems += [" ", iar.ar2button()] # elems += [' ', iar.insert_button()] items.append(E.li(*elems)) return E.div(E.ul(*items))
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 render(cls, w, book): s = html2rst(E.div(*tuple(cls.word2html(w, book)))) #~ s = html2rst(e) for e (cls.word2html(w,book))) if "<" in s: raise Exception("2013116 %r" % cls.word2html(w, book)) if s.startswith('('): s = '\\' + s return s
def get_overview_elems(self, ar): elems = self.get_name_elems(ar) 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 table2xhtml(self, header_level=None, **kw): t = xghtml.Table() self.dump2html(t, self.sliced_data_iterator, **kw) e = t.as_element() if header_level is not None: # return E.div(E.h2(self.get_title()), e) return E.div(E.h2(self.actor.label), e) return e
def render(cls, w, book): s = html2rst(E.div(*tuple(cls.word2html(w, book)))) #~ s = html2rst(e) for e (cls.word2html(w,book))) if "<" in s: raise Exception("2013116 %r" % cls.word2html(w, book)) if s.startswith('('): s = '\\' + s return s
def pupil_info(cls, self, ar): elems = [ar.obj2html(self.pupil, self.pupil.get_full_name(nominative=True))] elems += [', '] elems += join_elems( list(self.pupil.address_location_lines()), sep=', ') return E.div(*elems)
def eid_info(self, ar): "Display some information about the eID card." attrs = dict(class_="lino-info") if ar is None: return E.div(**attrs) must_read = False 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 dd.plugins.beid: 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) 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 f(obj, ar): if ar is None: return '' if obj is None: return E.div() try: et = ExcerptType.objects.get(shortcut=i) except ExcerptType.DoesNotExist: return E.div() items = [] if True: sar = ar.spawn(ExcerptsByOwner, master_instance=obj, param_values=dict(excerpt_type=et)) n = sar.get_total_count() if n > 0: ex = sar.sliced_data_iterator[0] items.append(ar.obj2html(ex, _("Last"))) ba = sar.bound_action btn = sar.renderer.action_button(obj, sar, ba, "%s (%d)" % (_("All"), n), icon_name=None) items.append(btn) ia = getattr(obj, et.get_action_name()) btn = ar.instance_action_button(ia, _("Create"), icon_name=None) items.append(btn) else: ot = ContentType.objects.get_for_model(obj.__class__) qs = Excerpt.objects.filter(owner_id=obj.pk, owner_type=ot, excerpt_type=et) if qs.count() > 0: ex = qs[0] txt = ExcerptsByOwner.format_excerpt(ex) items.append(ar.obj2html(ex, txt)) return E.div(*join_elems(items, ', '))
def find_appointment(self, ar): if ar is None: return '' CalendarPanel = rt.modules.extensible.CalendarPanel elems = [] for obj in self.coachings_by_client.all(): sar = CalendarPanel.request( subst_user=obj.user, current_project=self.pk) elems += [ar.href_to_request(sar, obj.user.username), ' '] return E.div(*elems)
def table2xhtml(self, header_level=None, **kw): """ Return an HTML representation of this table request. """ t = xghtml.Table() self.dump2html(t, self.sliced_data_iterator, **kw) e = t.as_element() # print "20150822 table2xhtml", E.tostring(e) if header_level is not None: return E.div(E.h2(self.actor.label), e) return e
def table2xhtml(self, header_level=None, **kw): """ Return an HTML representation of this table request. """ t = xghtml.Table() self.dump2html(t, self.sliced_data_iterator, **kw) e = t.as_element() # print "20150822 table2xhtml", E.tostring(e) if header_level is not None: return E.div(E.h2(self.actor.label), e) return e
def body(cls, self, ar): html = [] for item in self.get_story(ar): if E.iselement(item): html.append(item) elif isinstance(item, type) and issubclass(item, Actor): html.append(ar.show(item, master_instance=self)) else: raise Exception("Cannot handle %r" % item) return E.div(*html)
def get_slave_summary(self, obj, ar): """Displays the uploads related to this controller as a list grouped by uploads type. Note that this also works on :class:`lino_welfare.modlib.uploads.models.UploadsByClient` and their subclasses for the different `_upload_area`. """ UploadType = rt.modules.uploads.UploadType # Upload = rt.modules.uploads.Upload elems = [] types = [] for ut in UploadType.objects.filter( upload_area=self._upload_area): sar = ar.spawn( self, master_instance=obj, known_values=dict(type_id=ut.id)) # logger.info("20140430 %s", sar.data_iterator.query) files = [] for m in sar: text = self.format_row_in_slave_summary(ar, m) if text is None: continue edit = ar.obj2html( m, text, # _("Edit"), # icon_name='application_form', title=_("Edit metadata of the uploaded file.")) if m.file.name: show = ar.renderer.href_button( settings.SITE.build_media_url(m.file.name), _(" [show]"), # fmt(m), target='_blank', icon_name='../xsite/link', # icon_name='page_go', # style="vertical-align:-30%;", title=_("Open the uploaded file in a new browser window")) # logger.info("20140430 %s", E.tostring(e)) files.append(E.span(edit, ' ', show)) else: files.append(edit) if ut.wanted and ( ut.max_number < 0 or len(files) < ut.max_number): files.append(sar.insert_button()) if len(files) > 0: e = E.p(unicode(ut), ': ', *join_elems(files, ', ')) types.append(e) # logger.info("20140430 %s", [E.tostring(e) for e in types]) if len(types) == 0: elems.append(E.ul(E.li(ar.no_data_text))) else: elems.append(E.ul(*[E.li(e) for e in types])) 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 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 f(obj, ar): if ar is None: return '' if obj is None: return E.div() try: et = ExcerptType.objects.get(shortcut=i) except ExcerptType.DoesNotExist: return E.div() items = [] if True: sar = ar.spawn( ExcerptsByOwner, master_instance=obj, param_values=dict(excerpt_type=et)) n = sar.get_total_count() if n > 0: ex = sar.sliced_data_iterator[0] items.append(ar.obj2html(ex, _("Last"))) ba = sar.bound_action btn = sar.renderer.action_button( obj, sar, ba, "%s (%d)" % (_("All"), n), icon_name=None) items.append(btn) ia = getattr(obj, et.get_action_name()) btn = ar.instance_action_button( ia, _("Create"), icon_name=None) items.append(btn) else: ot = ContentType.objects.get_for_model(obj.__class__) qs = Excerpt.objects.filter( owner_id=obj.pk, owner_type=ot, excerpt_type=et) if qs.count() > 0: ex = qs[0] txt = ExcerptsByOwner.format_excerpt(ex) items.append(ar.obj2html(ex, txt)) return E.div(*join_elems(items, ', '))
def eid_info(self, ar): "Display some information about the eID card." attrs = dict(class_="lino-info") if ar is None: return E.div(**attrs) must_read = False 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 about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append(E.p(str(_("Languages")) + ": " + ', '.join([ lng.django_code for lng in settings.SITE.languages]))) # print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) # raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict( date=dd.fds(dt.date()), time=settings.SITE.strftime(dt.time())) value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p( str(label), ' : ', E.b(dtfmt(value)), ' ({})'.format(settings.TIME_ZONE))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format( dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) items = [] times = [] packages = set(['lino', 'django', 'atelier']) for p in settings.SITE.installed_plugins: packages.add(p.app_name.split('.')[0]) for src in packages: label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) times.sort(key=lambda x: x[1]) for label, value in times: items.append(E.li(str(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) # return E.div(*body, class_='htmlText') return rt.html_text(E.div(*body))
def custom_actions(self, ar, **kw): if self.aid_type_id is None or ar is None: return '' at = self.aid_type ct = at.confirmation_type if not ct: return '' sar = ct.table_class.insert_action.request_from( ar, master_instance=self) # print(20150218, sar) txt = _("Create confirmation") btn = sar.ar2button(None, txt, icon_name=None) # btn = sar.insert_button(txt, icon_name=None) return E.div(btn)
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 description_print(cls, self, ar): elems = body_subject_to_elems(ar, self.title, self.description) # dd.logger.info("20160511a %s", cls) if cls.include_qty_in_description: if self.qty != 1: elems += [ " ", _("({qty}*{unit_price}/{unit})").format( qty=self.quantity, unit=self.product.delivery_unit, unit_price=self.unit_price)] e = E.div(*elems) # dd.logger.info("20160704d %s", E.tostring(e)) return e
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 write_body(self,fd): Section.write_body(self,fd) self.from_language.words.sort(sort_by_fr) uca_sort(self.from_language.words) #~ self.from_language.words = uca_sorted(self.from_language.words) def fmt(w): for x in self.from_language.word2html(w): yield x yield " " for x in ET.word2html(w,self): yield x yield " " yield ", ".join([u.rst_ref_to() for u in w.units]) for w in self.from_language.words: fd.write("| %s\n" % html2rst(E.div(*fmt(w))))
def description_print(cls, self, ar): elems = body_subject_to_elems(ar, self.title, self.description) # dd.logger.info("20160511a %s", cls) if cls.include_qty_in_description: if self.qty != 1: elems += [ " ", _("({qty}*{unit_price}/{unit})").format( qty=self.quantity, unit=self.product.delivery_unit, unit_price=self.unit_price) ] e = E.div(*elems) # dd.logger.info("20160704d %s", E.tostring(e)) return e
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_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 about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append( E.p(str(_("Languages")) + ": " + ", ".join([lng.django_code for lng in settings.SITE.languages])) ) # print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) # raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict(date=dd.fds(dt.date()), time=settings.SITE.strftime(dt.time())) value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(str(label), " : ", E.b(dtfmt(value)), " ({})".format(settings.TIME_ZONE))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format(dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) items = [] times = [] packages = set(["lino", "django", "atelier"]) for p in settings.SITE.installed_plugins: packages.add(p.app_name.split(".")[0]) for src in packages: label = src value = codetime("%s.*" % src) if value is not None: times.append((label, value)) times.sort(key=lambda x: x[1]) for label, value in times: items.append(E.li(str(label), " : ", E.b(dtfmt(value)))) body.append(E.ul(*items)) # return E.div(*body, class_='htmlText') return rt.html_text(E.div(*body))
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append(E.p(str(_("Languages")) + ": " + ', '.join([ lng.django_code for lng in settings.SITE.languages]))) #~ print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) #~ raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict( date=dd.fdf(dt.date()), time=dt.time()) items = [] times = [] value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(str(label), ' : ', E.b(dtfmt(value)))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format( dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) for src in ("lino", "lino_welfare", 'django', 'atelier'): label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) def mycmp(a, b): return cmp(b[1], a[1]) times.sort(mycmp) for label, value in times: items.append(E.li(str(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) return E.div(*body, class_='htmlText')
def write_body(self, fd): Section.write_body(self, fd) self.from_language.words.sort(sort_by_fr) uca_sort(self.from_language.words) #~ self.from_language.words = uca_sorted(self.from_language.words) def fmt(w): for x in self.from_language.word2html(w): yield x yield " " for x in ET.word2html(w, self): yield x yield " " yield ", ".join([u.rst_ref_to() for u in w.units]) for w in self.from_language.words: fd.write("| %s\n" % html2rst(E.div(*fmt(w))))
def get_slave_summary(self, obj, ar): """The summary view for this table. See :meth:`lino.core.actors.Actor.get_slave_summary`. """ if ar is None: return '' sar = self.request_from(ar, master_instance=obj) elems = [] for guest in sar: lbl = dd.fds(guest.event.start_date) if guest.state.button_text: lbl = "{0}{1}".format(lbl, guest.state.button_text) elems.append(ar.obj2html(guest.event, lbl)) elems = join_elems(elems, sep=', ') return ar.html_text(E.div(*elems))
def get_slave_summary(cls, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>` for this table. """ elems = [] sar = ar.spawn(rt.models.ledger.Movements, param_values=dict(cleared=dd.YesNo.no, partner=obj)) bal = ZERO for mvt in sar: if mvt.dc: bal -= mvt.amount else: bal += mvt.amount txt = _("{0} open movements ({1} {2})").format( sar.get_total_count(), bal, dd.plugins.ledger.currency_symbol) elems.append(ar.href_to_request(sar, txt)) return ar.html_text(E.div(*elems))
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 show_story(self, ar, story, stripped=True, **kwargs): """Render the given story as an HTML element. Ignore `stripped` because it makes no sense in HTML. """ from lino.core.actors import Actor from lino.core.tables import TableRequest elems = [] for item in story: if E.iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.append(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.append(self.table2story(item, **kwargs)) elif isiterable(item): elems.append(self.show_story(ar, item, **kwargs)) # for i in self.show_story(item, *args, **kwargs): # yield i else: raise Exception("Cannot handle %r" % item) return E.div(*elems)
def result(self, ar): return E.div(*tuple(get_poll_result(self)))
def get_slave_summary(self, obj, ar): """Displays the uploads related to this controller as a list grouped by uploads type. Note that this also works on :class:`lino_welfare.modlib.uploads.models.UploadsByClient` and their subclasses for the different `_upload_area`. """ UploadType = rt.modules.uploads.UploadType # Upload = rt.modules.uploads.Upload elems = [] types = [] perm = ar.get_user().profile.has_required_roles(self.required_roles) for ut in UploadType.objects.filter(upload_area=self._upload_area): sar = ar.spawn(self, master_instance=obj, known_values=dict(type_id=ut.id)) # logger.info("20140430 %s", sar.data_iterator.query) files = [] for m in sar: text = self.format_row_in_slave_summary(ar, m) if text is None: continue edit = ar.obj2html( m, text, # _("Edit"), # icon_name='application_form', title=_("Edit metadata of the uploaded file.")) if m.file.name: show = ar.renderer.href_button( settings.SITE.build_media_url(m.file.name), # u"\u21A7", # DOWNWARDS ARROW FROM BAR (↧) # u"\u21E8", u"\u21f2", # SOUTH EAST ARROW TO CORNER (⇲) style="text-decoration:none;", # _(" [show]"), # fmt(m), target='_blank', # icon_name=settings.SITE.build_static_url( # 'images/xsite/link'), # icon_name='page_go', # style="vertical-align:-30%;", title=_( "Open the uploaded file in a new browser window")) # logger.info("20140430 %s", E.tostring(e)) files.append(E.span(edit, ' ', show)) else: files.append(edit) if perm and ut.wanted \ and (ut.max_number < 0 or len(files) < ut.max_number): btn = self.insert_action.request_from( sar, master_instance=obj, known_values=dict(type_id=ut.id)).ar2button() if btn is not None: files.append(btn) if len(files) > 0: e = E.p(unicode(ut), ': ', *join_elems(files, ', ')) types.append(e) # logger.info("20140430 %s", [E.tostring(e) for e in types]) if len(types) == 0: elems.append(E.ul(E.li(ar.no_data_text))) else: elems.append(E.ul(*[E.li(e) for e in types])) return E.div(*elems)
def overview(self, ar): return E.div(*self.get_overview_elems(ar))
def overview(self, ar): if ar is None: return '' return E.div(*self.get_overview_elems(ar))
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 table2html(ar, as_main=True): """Represent the given table request as an HTML table. `ar` is the request to be rendered, an instance of :class:`lino.core.tablerequest.TableRequest`. The returned HTML enclosed in a ``<div>`` tag and generated using :mod:`lino.utils.xmlgen.html`. If `as_main` is True, include additional elements such as a paging toolbar. (This argument is currently being ignored.) """ as_main = True t = xghtml.Table() t.attrib.update(class_="table table-striped table-hover") if ar.limit is None: ar.limit = PLAIN_PAGE_LENGTH pglen = ar.limit if ar.offset is None: page = 1 else: """ (assuming pglen is 5) offset page 0 1 5 2 """ page = int(old_div(ar.offset, pglen)) + 1 ar.dump2html(t, ar.sliced_data_iterator) if not as_main: url = ar.get_request_url() # open in own window return E.div(E.a(ar.get_title(), href=url), t.as_element()) buttons = [] kw = dict() kw = {} if pglen != PLAIN_PAGE_LENGTH: kw[constants.URL_PARAM_LIMIT] = pglen if page > 1: kw[constants.URL_PARAM_START] = pglen * (page - 2) prev_url = ar.get_request_url(**kw) kw[constants.URL_PARAM_START] = 0 first_url = ar.get_request_url(**kw) else: prev_url = None first_url = None buttons.append(('<<', _("First page"), first_url)) buttons.append(('<', _("Previous page"), prev_url)) next_start = pglen * page if next_start < ar.get_total_count(): kw[constants.URL_PARAM_START] = next_start next_url = ar.get_request_url(**kw) last_page = int(old_div((ar.get_total_count() - 1), pglen)) kw[constants.URL_PARAM_START] = pglen * last_page last_url = ar.get_request_url(**kw) else: next_url = None last_url = None buttons.append(('>', _("Next page"), next_url)) buttons.append(('>>', _("Last page"), last_url)) return E.div(buttons2pager(buttons), t.as_element())
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)