def get_sidebar_html(self, request): items = [] #~ loop over top-level nodes for n in Page.objects.filter(parent__isnull=True).order_by('seqno'): #~ items += [li for li in n.get_sidebar_items(request,self)] items.append(n.get_sidebar_item(request, self)) if self.is_parented(n): children = [] for ch in n.children.order_by('seqno'): children.append(ch.get_sidebar_item(request, self)) if len(children): items.append(E.ul(*children, **{'class': 'nav nav-list'})) e = E.ul(*items, **{'class': 'nav nav-list'}) return tostring_pretty(e)
def get_sidebar_html(self, request): items = [] #~ loop over top-level nodes for n in Page.objects.filter(parent__isnull=True).order_by('seqno'): #~ items += [li for li in n.get_sidebar_items(request,self)] items.append(n.get_sidebar_item(request, self)) if self.is_parented(n): children = [] for ch in n.children.order_by('seqno'): children.append(ch.get_sidebar_item(request, self)) if len(children): items.append(E.ul(*children, **{'class':'nav nav-list'})) e = E.ul(*items, **{'class':'nav nav-list'}) return tostring_pretty(e)
def get_table_summary(cls, mi, ar): qs = rt.models.notify.Message.objects.filter( user=ar.get_user()).order_by(cls.created_order) qs = qs.filter(seen__isnull=True) # mark_all = rt.models.notify.MyMessages.get_action_by_name( # 'mark_all_seen') # html = tostring(ar.action_button(mark_all, None)) # TODO: make action_button() work with list actions # html = '' ba = rt.models.notify.MyMessages.get_action_by_name('mark_seen') def fmt(obj): s = tostring(ar.action_button(ba, obj)) s += fds(obj.created) + " " + obj.created.strftime( settings.SITE.time_format_strftime) + " " if obj.body: s += ar.parse_memo(obj.body) else: s += ar.parse_memo(obj.subject) e = etree.parse(StringIO(s), html_parser) return E.li(E.div(*e.iter())) # s += obj.body # return "<li>{}</li>".format(s) items = [] for obj in qs: items.append(fmt(obj)) return E.ul(*items)
def get_table_summary(cls, mi, ar): if ar is None: return None items = [] for obj in cls.get_request_queryset(ar): elems = [] table_class = obj.get_doc_report() sar = table_class.request(master_instance=obj) # elems.append(str(sar.get_total_count())) # elems.append(" ") # elems.append(ar.href_to_request(sar, text=str(obj))) elems.append( ar.href_to_request(sar, text="{} {}".format(sar.get_total_count(), obj))) if True: sar = table_class.insert_action.request_from( ar, master_instance=obj) # print(20170217, sar) sar.known_values.update(journal=obj) # txt = dd.babelattr(obj, 'printed_name') # btn = sar.ar2button(None, _("New {}").format(txt), icon_name=None) btn = sar.ar2button( label="⊕", icon_name=None) # U+2295 Circled Plus Unicode Character. # btn = sar.ar2button() # btn.set("style", "padding-left:10px") btn.set("style", "text-decoration:none") elems.append(" ") elems.append(btn) else: elems.append(" / ") elems.append(obj.insert_voucher_button(ar)) items.append(E.li(*elems)) return E.ul(*items)
def get_table_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(str(ar.no_data_text)) # obj is the Person for which we display the household def format_item(m): elems = [str(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_table_summary(self, master, ar): # master is None when called on a master table. if master is None: sar = ar else: sar = self.request_from(ar, master_instance=master) # every element of `items` is a tuple `(state, # list-of-objects)`. in ar are ordered by state. we just group # them items = [] ci = None for obj in sar: # self.get_request_queryset(ar): btn = obj.obj2href(ar) if ci is not None and ci[0] is obj.state: ci[1].append(btn) else: ci = (obj.state, [btn]) items.append(ci) # now render them as a UL containing on LI per item items = [E.li(str(i[0]), ' : ', *join_elems(i[1], ", ")) for i in items] return E.ul(*items)
def get_table_summary(cls, mi, ar): qs = rt.models.notify.Message.objects.filter( user=ar.get_user()).order_by('created') qs = qs.filter(seen__isnull=True) # mark_all = rt.models.notify.MyMessages.get_action_by_name( # 'mark_all_seen') # html = tostring(ar.action_button(mark_all, None)) # TODO: make action_button() work with list actions # html = '' ba = rt.models.notify.MyMessages.get_action_by_name('mark_seen') def fmt(obj): s = tostring(ar.action_button(ba, obj)) s += fds(obj.created) + " " + obj.created.strftime( settings.SITE.time_format_strftime) + " " if obj.body: s += ar.parse_memo(obj.body) else: s += ar.parse_memo(obj.subject) e = etree.parse(StringIO(s), html_parser) return E.li(E.div(*e.iter())) # s += obj.body # return "<li>{}</li>".format(s) items = [] for obj in qs: items.append(fmt(obj)) return E.ul(*items)
def get_table_summary(cls, obj, ar): """Customized :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for this table. """ sar = cls.request_from(ar, master_instance=obj) html = [] # items = [ar.obj2html(o, str(o.milestone)) for o in sar] qs = cls.model.objects.filter(ticket=obj) qs = dd.plugins.tickets.milestone_model.add_param_filter( qs, lookup_prefix='milestone__', # show_active=dd.YesNo.yes ) items = E.ul() for o in qs: items.append( E.li( o.obj2href(ar, text=getattr(o.wish_type, 'text', _("Wish"))), " in ", o.milestone.obj2href(ar), " : ", o.remark)) if len(items) > 0: html.append(tostring(items)) # items = [o.milestone.obj2href(ar) for o in sar] sar = cls.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button() html.append(btn) return ar.html_text(ar.parse_memo(tostring(html)))
def get_table_summary(self, obj, ar): items = [] def add(title, flt): links = [] sar = self.request(master_instance=obj, filter=flt) # logger.info("20141009 %s", sar.data_iterator.query) n = sar.get_total_count() if n: for i, ex in enumerate(sar): txt = self.format_excerpt(ex) if ex.build_time is not None: txt += " (%s)" % naturaltime(ex.build_time) links.append(ar.obj2html(ex, txt)) if i >= self.MORE_LIMIT: # links.append(ar.href_to_request(sar, _("more"))) links.append('...') break items.append(E.li(title, " : ", *join_elems(links, sep=', '))) # qs = sar.data_iterator Q = models.Q add(gettext("not printed"), Q(build_time__isnull=True)) add(gettext("Today"), Q(build_time__gte=dd.today() - ONE_DAY)) t7 = dd.today() - ONE_WEEK add(gettext("Last week"), Q(build_time__lte=dd.today(), build_time__gte=t7)) add(gettext("Older"), Q(build_time__lt=t7)) return E.ul(*items)
def get_table_summary(self, obj, ar): if obj is None: return visible_polls = Poll.objects.filter( state__in=(PollStates.active, 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.active: elems += [' ', iar.ar2button()] #elems += [' ', iar.insert_button()] items.append(E.li(*elems)) return E.div(E.ul(*items))
def get_table_summary(self, obj, ar): if obj is None: return visible_polls = Poll.objects.filter(state__in=( PollStates.active, 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.active: elems += [' ', iar.ar2button()] #elems += [' ', iar.insert_button()] items.append(E.li(*elems)) return E.div(E.ul(*items))
def as_ul(action_spec): a = settings.SITE.models.resolve(action_spec) ar = a.request(user=settings.SITE.user_model.get_anonymous_user()) # 20150810 ar.renderer = self # ar.renderer = settings.SITE.plugins.bootstrap3.renderer return tostring(E.ul(*[obj.as_list_item(ar) for obj in ar]))
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(ugettext("will be deleted."), self.volatiles) collect_summary(ugettext("will get reassigned."), self.related + self.generic_related) items.append(E.li(ugettext("%s will be deleted") % self.obj)) msg = ugettext("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 rt.html_text(E.div(E.p(msg), E.ul(*items))) return msg
def get_table_summary(cls, obj, ar): """Customized :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for this table. """ sar = cls.request_from(ar, master_instance=obj) html = [] # items = [ar.obj2html(o, str(o.milestone)) for o in sar] qs = cls.model.objects.filter(ticket=obj) qs = dd.plugins.tickets.milestone_model.add_param_filter( qs, lookup_prefix='milestone__', # show_active=dd.YesNo.yes ) items = E.ul() for o in qs: items.append( E.li(o.obj2href(ar, text=getattr(o.wish_type,'text', _("Wish"))), " in ", o.milestone.obj2href(ar), " : ", o.remark) ) if len(items) > 0: html.append(tostring(items)) # items = [o.milestone.obj2href(ar) for o in sar] sar = cls.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button() html.append(btn) return ar.html_text(ar.parse_memo(tostring(html)))
def as_ul(action_spec): a = settings.SITE.models.resolve(action_spec) ar = a.request( user=settings.SITE.user_model.get_anonymous_user()) # 20150810 ar.renderer = self # ar.renderer = settings.SITE.plugins.bootstrap3.renderer return tostring(E.ul(*[obj.as_list_item(ar) for obj in ar]))
def show_menu(self, ar, mnu, level=1): """ Render the given menu as an HTML element. Used for writing test cases. """ if not isinstance(mnu, Menu): assert isinstance(mnu, MenuItem) if mnu.bound_action: sar = mnu.bound_action.actor.request( action=mnu.bound_action, user=ar.user, subst_user=ar.subst_user, requesting_panel=ar.requesting_panel, renderer=self, **mnu.params) # print("20170113", sar) url = sar.get_request_url() else: url = mnu.href assert mnu.label is not None if url is None: return E.p() # spacer return E.li(E.a(mnu.label, href=url, tabindex="-1")) items = [self.show_menu(ar, mi, level + 1) for mi in mnu.items] # ~ print 20120901, items if level == 1: return E.ul(*items, **{'class': 'nav navbar-nav'}) if mnu.label is None: raise Exception("%s has no label" % mnu) if level == 2: cl = 'dropdown' menu_title = E.a(str(mnu.label), E.b(' ', **{'class': "caret"}), href="#", data_toggle="dropdown", **{'class': 'dropdown-toggle'}) elif level == 3: menu_title = E.a(str(mnu.label), href="#") cl = 'dropdown-submenu' else: raise Exception("Menu with more than three levels") return E.li(menu_title, E.ul(*items, **{'class': 'dropdown-menu'}), **{'class': cl})
def to_html(self, ar): self.analyze_view() get_rnd = rt.models.cal.EventGenerator.get_cal_entry_renderer if self.mode == TABLE_MODE: sep = ' ' fmt = get_rnd(day_and_weekday) elif self.mode == UL_MODE: sep = ' ' fmt = get_rnd(day_and_weekday) elif self.mode == PLAIN_MODE: sep = ', ' fmt = get_rnd(dd.fds) def xxx(list_of_entries): elems = [] for e in list_of_entries: if len(elems): elems.append(sep) elems.extend(fmt(e, ar)) return elems if self.mode == TABLE_MODE: rows = [] cells = [E.th("")] + [E.th(monthname(m+1)) for m in range(12)] # print(''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) for y in self.years.values(): cells = [E.td(str(y.year), width="4%")] for m in y.months: # every m is a list of etree elems cells.append(E.td(*xxx(m), width="8%", **ar.renderer.cellattrs)) # print(str(y.year) +":" + ''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) return E.table(*rows, **ar.renderer.tableattrs) if self.mode == UL_MODE: items = [] for y in self.years.values(): for m, lst in enumerate(y.months): if len(lst): items.append(E.li( monthname(m+1), " ", str(y.year), ": ", *xxx(lst))) return E.ul(*items) if self.mode == PLAIN_MODE: elems = [] for y in self.years.values(): for lst in y.months: if len(lst): if len(elems): elems.append(sep) elems.extend(xxx(lst)) return E.p(*elems) raise Exception("20180720")
def show_menu(self, ar, mnu, level=1): """ Render the given menu as an HTML element. Used for writing test cases. """ if not isinstance(mnu, Menu): assert isinstance(mnu, MenuItem) if mnu.bound_action: sar = mnu.bound_action.actor.request( action=mnu.bound_action, user=ar.user, subst_user=ar.subst_user, requesting_panel=ar.requesting_panel, renderer=self, **mnu.params) # print("20170113", sar) url = sar.get_request_url() else: url = mnu.href assert mnu.label is not None if url is None: return E.p() # spacer return E.li(E.a(str(mnu.label), href=url, tabindex="-1")) items = [self.show_menu(ar, mi, level + 1) for mi in mnu.items] #~ print 20120901, items if level == 1: return E.ul(*items, **{'class':'nav navbar-nav'}) if mnu.label is None: raise Exception("%s has no label" % mnu) if level == 2: cl = 'dropdown' menu_title = E.a( str(mnu.label), E.b(' ', **{'class': "caret"}), href="#", data_toggle="dropdown", **{'class':'dropdown-toggle'}) elif level == 3: menu_title = E.a(str(mnu.label), href="#") cl = 'dropdown-submenu' else: raise Exception("Menu with more than three levels") return E.li( menu_title, E.ul(*items, **{'class':'dropdown-menu'}), **{'class':cl})
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)) body.append( E.p("{} : {}".format( _("Complexity factors"), ', '.join(analyzer.get_complexity_factors(dd.today()))))) return rt.html_text(E.div(*body))
def buttons2pager(buttons, title=None): items = [] if title: items.append(E.li(E.span(title))) for symbol, label, url in buttons: if url is None: items.append(E.li(E.span(symbol), **{'class': "disabled"})) else: items.append(E.li(E.a(symbol, href=url))) # Bootstrap version 2.x # return E.div(E.ul(*items), class_='pagination') return E.ul(*items, **{'class': 'pagination pagination-sm'})
def buttons2pager(buttons, title=None): items = [] if title: items.append(E.li(E.span(title))) for symbol, label, url in buttons: if url is None: items.append(E.li(E.span(symbol), **{'class':"disabled"})) else: items.append(E.li(E.a(symbol, href=url))) # Bootstrap version 2.x # return E.div(E.ul(*items), class_='pagination') return E.ul(*items, **{'class':'pagination pagination-sm'})
def get_table_summary(self, obj, ar): """Customized :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for this table. """ sar = self.request_from(ar, master_instance=obj) html = [] states = {} for s, d in VoteStates.choices: states[s] = [] u = ar.get_user() for o in sar: states[o.state].append( ar.obj2html(o, o.user.initials or str(o.user), title=o.state)) if u == o.user: html.insert( 0, E.span( E.b(str(o.state)), u" \u2192 ", *join_elems([ sar.action_button(ba, o) for ba in sar.actor.get_actions() if ba.action.show_in_workflow and sar.actor.get_row_permission(o, sar, o.state, ba) and isinstance(ba.action, dd.ChangeStateAction) ], " "))) html.append( E.ul(*[ E.li(*([str(s.text), ": "] + join_elems(states[s], sep=", "))) for s, c in VoteStates.choices if states[s] ])) # print(tostring(html)) # items = [ # ar.obj2html(o, o.user.username or str(o.user)) # for o in rt.models.votes.Vote.objects.filter( # votable=obj).order_by('-id')] # sar.get_user() == v.user sar = self.insert_action.request_from(sar) if sar.get_permission(): # btn = sar.ar2button(None, _("Add voter"), icon_name=None) btn = sar.ar2button() # btn = sar.ar2button(None, u"⏍", icon_name=None) # 23CD SQUARE FOOT # btn = sar.ar2button(None, u"⊞", icon_name=None) # 229e SQUARED PLUS html.append(E.div(btn)) return ar.html_text(E.div(*html))
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() # showing startup time here makes no sense as this is a constant text # body.append(E.p( # gettext("Server uptime"), ' : ', # E.b(dtfmt(settings.SITE.startup_time)), # ' ({})'.format(settings.TIME_ZONE))) if settings.SITE.is_demo_site: body.append(E.p(gettext(_("This is a Lino demo site.")))) 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(['django']) items.append( E.li(gettext("Server timestamp"), ' : ', E.b(dtfmt(settings.SITE.kernel.code_mtime)))) 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)) body.append( E.p("{} : {}".format( _("Complexity factors"), ', '.join(analyzer.get_complexity_factors(dd.today()))))) return rt.html_text(E.div(*body))
def get_table_summary(self, obj, ar): if ar is None: return '' elems = [] # Button for starting a session from ticket sar = obj.start_session.request_from(ar) # if ar.renderer.is_interactive and sar.get_permission(): # if sar.get_permission(): # btn = sar.ar2button(obj) # elems += [E.p(btn)] # Active sessions: active_sessions = [] session_summaries = E.ul() qs = rt.models.working.Session.objects.filter(ticket=obj) tot = Duration() for ses in qs: d = ses.get_duration() if d is not None: tot += d if ses.end_time is None: txt = "{0} since {1}".format(ses.user, ses.start_time) lnk = ar.obj2html(ses, txt) sar = ses.end_session.request_from(ar) if sar.get_permission(): lnk = E.span(lnk, " ", sar.ar2button(ses)) active_sessions.append(lnk) if ses.summary: session_summaries.insert(0, E.li( "%s %s: %s"%(ses.user, naturaltime(datetime.combine( ses.start_date, ses.start_time)) ,ses.summary) ) ) # elems.append(E.p(_("Total {0} hours.").format(tot))) elems.append(E.p(_("Total %s hours.") % tot)) if len(active_sessions) > 0: elems.append(E.p( ensureUtf(_("Active sessions")), ": ", *join_elems(active_sessions, ', '))) if len(session_summaries) > 0: elems.append(session_summaries) return ar.html_text(E.div(*elems))
def get_table_summary(self, obj, ar): """Customized :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for this table. """ sar = self.request_from(ar, master_instance=obj) html = [] states = {} for s, d in VoteStates.choices: states[s] = [] u = ar.get_user() for o in sar: states[o.state].append(ar.obj2html(o, o.user.initials or str(o.user), title=o.state)) if u == o.user: html.insert(0, E.span( E.b(str(o.state)), u" \u2192 ", *join_elems([sar.action_button(ba, o) for ba in sar.actor.get_actions() if ba.action.show_in_workflow and sar.actor.get_row_permission(o, sar, o.state, ba) and isinstance(ba.action, dd.ChangeStateAction)], " ") )) html.append(E.ul( *[E.li(*([str(s.text), ": "] + join_elems(states[s], sep=", "))) for s, c in VoteStates.choices if states[s] ] )) # print(tostring(html)) # items = [ # ar.obj2html(o, o.user.username or str(o.user)) # for o in rt.models.votes.Vote.objects.filter( # votable=obj).order_by('-id')] # sar.get_user() == v.user sar = self.insert_action.request_from(sar) if sar.get_permission(): # btn = sar.ar2button(None, _("Add voter"), icon_name=None) btn = sar.ar2button() # btn = sar.ar2button(None, u"⏍", icon_name=None) # 23CD SQUARE FOOT # btn = sar.ar2button(None, u"⊞", icon_name=None) # 229e SQUARED PLUS html.append(E.div(btn)) return ar.html_text(E.div(*html))
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 rt.html_text(E.div(*body))
def get_table_summary(self, obj, ar): if ar is None: return '' elems = [] # Button for starting a session from ticket sar = obj.start_session.request_from(ar) # if ar.renderer.is_interactive and sar.get_permission(): # if sar.get_permission(): # btn = sar.ar2button(obj) # elems += [E.p(btn)] # Active sessions: active_sessions = [] session_summaries = E.ul() qs = rt.models.working.Session.objects.filter(ticket=obj) tot = Duration() for ses in qs: d = ses.get_duration() if d is not None: tot += d if ses.end_time is None: txt = "{0} since {1}".format(ses.user, ses.start_time) lnk = ar.obj2html(ses, txt) sar = ses.end_session.request_from(ar) if sar.get_permission(): lnk = E.span(lnk, " ", sar.ar2button(ses)) active_sessions.append(lnk) if ses.summary: session_summaries.insert( 0, E.li("%s %s: %s" % (ses.user, naturaltime( datetime.combine(ses.start_date, ses.start_time)), ses.summary))) # elems.append(E.p(_("Total {0} hours.").format(tot))) elems.append(E.p(_("Total %s hours.") % tot)) if len(active_sessions) > 0: elems.append( E.p(ensureUtf(_("Active sessions")), ": ", *join_elems(active_sessions, ', '))) if len(session_summaries) > 0: elems.append(session_summaries) return ar.html_text(E.div(*elems))
def get_change_body(self, ar, cw): ctx = dict(user=ar.user, what=ar.obj2memo(self)) if cw is None: elems = [E.p(_("{user} created {what}").format(**ctx), ".")] elems += list(self.get_change_info(ar, cw)) else: items = list(cw.get_updates_html(["_user_cache"])) if len(items) == 0: return elems = [] elems += list(self.get_change_info(ar, cw)) elems.append( E.p(_("{user} modified {what}").format(**ctx), ":")) elems.append(E.ul(*items)) # print("20170210 {}".format(tostring(E.div(*elems)))) return tostring(E.div(*elems))
def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) items = [] for c in sar: # todo have another js button that will expand the summary # into the complete description. items.append( E.li( E.a(c.sha[:6], href=c.url, target="_BLANK"), ":" if c.user else "", ar.obj2html(c.user) if c.user else "", ":", ar.obj2html(c, naturaltime(c.created), title=c.created.strftime('%Y-%m-%d %H:%M')), E.br(), c.summary)) return E.ul(*items)
def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) items = [] for c in sar: # todo have another js button that will expand the summary # into the complete description. items.append(E.li( E.a(c.sha[:6], href=c.url, target="_BLANK"), ":" if c.user else "", ar.obj2html(c.user) if c.user else "", ":", ar.obj2html( c, naturaltime(c.created), title=c.created.strftime('%Y-%m-%d %H:%M')), E.br(), c.summary)) return E.ul(*items)
def get_change_body(self, ar, cw): ctx = dict(user=ar.user, what=ar.obj2memo(self)) if cw is None: elems = [E.p( _("{user} created {what}").format(**ctx), ".")] elems += list(self.get_change_info(ar, cw)) else: items = list(cw.get_updates_html(["_user_cache"])) if len(items) == 0: return elems = [] elems += list(self.get_change_info(ar, cw)) elems.append(E.p( _("{user} modified {what}").format(**ctx), ":")) elems.append(E.ul(*items)) # print("20170210 {}".format(tostring(E.div(*elems)))) return tostring(E.div(*elems))
def get_table_summary(cls, mi, ar): if mi is None: return items = [] ar = ar.spawn(cls, master_instance=mi, is_on_main_actor=False) for obj in ar: chunks = [] for e in cls.get_handle().get_columns(): if e.hidden: continue v = e.field._lino_atomizer.full_value_from_object(obj, ar) if v: if len(chunks) > 0: chunks.append(", ") chunks += [e.get_label(), ": ", E.b(e.format_value(ar, v))] items.append(E.li(*forcetext(chunks))) return E.ul(*items)
def get_table_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 = (str(m.role), gettext(" 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 += [gettext("%s is") % obj] elems.append(E.ul(*items)) if self.insert_action is not None: sar = self.insert_action.request_from(ar) if sar.get_permission(): elems.append(E.br()) sar.known_values.update(person=obj) # sar.known_values.pop('child', None) elems += [ sar.ar2button(None, gettext("Join an existing household"), icon_name=None), " ", gettext("or"), " ", ar.instance_action_button(obj.create_household, gettext("create a new one")), # " ", # rt.models.households.Household._meta.verbose_name, "." ] return E.div(*elems)
def get_table_summary(self, response, ar): if response is None: return if response.poll_id is None: return AnswerRemarks = rt.models.polls.AnswerRemarksByAnswer ar.master_instance = response # must set it because # get_data_rows() needs it. items = [] for obj in self.get_data_rows(ar): if len(obj.remark.remark) == 0 and obj.choices.count() == 0: continue chunks = [obj.get_question_html(ar), " — "] # unicode em dash chunks += [str(ac.choice) for ac in obj.choices] if obj.remark.remark: chunks.append(" {}".format(obj.remark.remark)) items.append(E.li(*chunks)) return E.ul(*items)
def get_table_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 = (str(m.role), gettext(" 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 += [gettext("%s is") % obj] elems.append(E.ul(*items)) if self.insert_action is not None: sar = self.insert_action.request_from(ar) if sar.get_permission(): elems.append(E.br()) sar.known_values.update(person=obj) # sar.known_values.pop('child', None) elems += [ sar.ar2button( None, gettext("Join an existing household"), icon_name=None), " ", gettext("or"), " ", ar.instance_action_button( obj.create_household, gettext("create a new one")), # " ", # rt.models.households.Household._meta.verbose_name, "."] return E.div(*elems)
def on_update(sender=None, watcher=None, request=None, **kw): """ Log a Change if there is a `change_watcher_spec`. `watcher` is a :class:`lino.core.diff.ChangeWatcher` instance. """ master = get_master(watcher.watched) if master is None: # No master, nothing to log return cs = watcher.watched.change_watcher_spec changed_fields = '' if False: # I tried a html version, but it doesn't help to make # things more end-user friendly. And it caused # problems when being rendered in a grid. changes = list(watcher.get_updates_html(cs.ignored_fields)) if len(changes) == 0: msg = '(no changes)' elif len(changes) == 1: msg = tostring(changes[0]) else: msg = tostring(E.ul(*changes)) else: changes = [] for k, old, new in watcher.get_updates(cs.ignored_fields): changed_fields += k + " " changes.append("%s : %s --> %s" % (k, dd.obj2str(old), dd.obj2str(new))) if len(changes) == 0: msg = '(no changes)' elif len(changes) == 1: msg = changes[0] else: msg = '- ' + ('\n- '.join(changes)) log_change( ChangeTypes.update, request, master, watcher.watched, msg, changed_fields)
def get_table_summary(self, obj, ar): if obj is None: return UploadType = rt.models.uploads.UploadType # Upload = rt.models.uploads.Upload elems = [] types = [] perm = ar.get_user().user_type.has_required_roles(self.required_roles) qs = UploadType.objects.all() if isinstance(obj, UploadController): area = obj.get_upload_area() if area is not None: qs = qs.filter(upload_area=area) else: return E.div("{} is not an UploadController!".format( model_class_path(obj.__class__))) volume = obj.get_uploads_volume() # print(20190208, volume) for ut in qs: 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: url = settings.SITE.build_media_url(m.file.name) elif m.volume_id and m.volume.base_url and m.library_file: url = m.volume.base_url + m.library_file else: url = None if url: show = ar.renderer.href_button( url, # 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 file in a new browser window")) # title=_("Open the uploaded file in a new browser window")) # logger.info("20140430 %s", 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, volume=volume)).ar2button() if btn is not None: files.append(btn) if len(files) > 0: chunks = (str(ut), ': ') + tuple(join_elems(files, ', ')) types.append(chunks) # logger.info("20140430 %s", [tostring(e) for e in types]) # elems += [str(ar.bound_action.action.__class__), " "] if ar.bound_action.action.window_type == "d": if len(types) == 0: elems.append(E.ul(E.li(str(ar.no_data_text)))) else: elems.append(E.ul(*[E.li(*chunks) for chunks in types])) else: if len(types) == 0: elems.append(str(ar.no_data_text)) elems.append(" / ") else: for chunks in types: elems.extend(chunks) elems.append(" / ") elems.append(obj.show_uploads.as_button_elem(ar)) # ba = self.find_action_by_name("show_uploads") return E.div(*elems)
def get_table_summary(self, obj, ar): if obj is None: return UploadType = rt.models.uploads.UploadType # Upload = rt.models.uploads.Upload elems = [] types = [] perm = ar.get_user().user_type.has_required_roles(self.required_roles) qs = UploadType.objects.all() if isinstance(obj, UploadController): area = obj.get_upload_area() if area is not None: qs = qs.filter(upload_area=area) else: return E.div("{} is not an UploadController!".format( model_class_path(obj.__class__))) volume = obj.get_uploads_volume() # print(20190208, volume) for ut in qs: 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: url = settings.SITE.build_media_url(m.file.name) elif m.volume_id and m.volume.base_url and m.library_file: url = m.volume.base_url + m.library_file else: url = None if url: show = ar.renderer.href_button( url, # 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 file in a new browser window")) # title=_("Open the uploaded file in a new browser window")) # logger.info("20140430 %s", 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, volume=volume)).ar2button() if btn is not None: files.append(btn) if len(files) > 0: chunks = (str(ut), ': ') + tuple(join_elems(files, ', ')) types.append(chunks) # logger.info("20140430 %s", [tostring(e) for e in types]) # elems += [str(ar.bound_action.action.__class__), " "] if ar.bound_action.action.window_type == "d": if len(types) == 0: elems.append(E.ul(E.li(str(ar.no_data_text)))) else: elems.append(E.ul(*[E.li(*chunks) for chunks in types])) else: if len(types) == 0: elems.append(str(ar.no_data_text)) elems.append(" / ") else: for chunks in types: elems.extend(chunks) elems.append(" / ") elems.append(obj.show_uploads.as_button_elem(ar)) # ba = self.find_action_by_name("show_uploads") return E.div(*elems)
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByHuman`. """ if obj is None: return '' # 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) try: links.sort( key=lambda a: a[1].birth_date.as_date(), reverse=True) # 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), gettext(" of "), obj.format_family_member(ar, other), " (%s)" % other.age )) elems = [] if len(items) > 0: elems += [gettext("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(gettext("No relationships.")) # Buttons for creating relationships: if self.insert_action is not None: 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(), gettext("Create relationship as ")] + actions return E.div(*elems)
def get_table_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`. """ if obj is None: return UploadType = rt.models.uploads.UploadType # Upload = rt.models.uploads.Upload elems = [] types = [] perm = ar.get_user().user_type.has_required_roles(self.required_roles) qs = UploadType.objects.all() if isinstance(obj, UploadController): area = obj.get_upload_area() if area is not None: qs = qs.filter(upload_area=area) else: raise Exception("A {} is not an UploadController!".format( obj.__class__)) for ut in qs: 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", 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(str(ut), ': ', *join_elems(files, ', ')) types.append(e) # logger.info("20140430 %s", [tostring(e) for e in types]) if len(types) == 0: elems.append(E.ul(E.li(str(ar.no_data_text)))) else: elems.append(E.ul(*[E.li(e) for e in types])) return E.div(*elems)
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_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(other.obj2href(ar)) items = [] for lnktype, lst in tbt.items(): items.append(E.li(str(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] if self.insert_action is not None and ar.renderer.is_interactive: sar = self.insert_action.request_from(ar) if 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 to_html(self, ar): self.analyze_view() if self.mode == TABLE_MODE: sep = ' ' fmt = day_and_weekday elif self.mode == UL_MODE: sep = ' ' fmt = day_and_weekday elif self.mode == PLAIN_MODE: sep = ', ' fmt = dd.fds def rnd(obj, ar): if self.model is rt.models.cal.Guest: d = obj.event.start_date evt = obj.event else: d = obj.start_date evt = obj # if show_auto_num and evt.auto_type: # yield str(evt.auto_type)+":" yield ar.obj2html(evt, fmt(d)) if obj.state.button_text: yield str(obj.state.button_text) # return (fdmy(d) + ": ", ar.obj2html(evt, lbl)) def xxx(list_of_entries): elems = [] # for e in reversed(list_of_entries): for e in list_of_entries: if len(elems): elems.append(sep) elems.extend(rnd(e, ar)) return elems if self.mode == TABLE_MODE: rows = [] cells = [E.th("")] + [E.th(monthname(m + 1)) for m in range(12)] # print(''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) for y in self.years.values(): cells = [E.td(str(y.year), width="4%")] for m in y.months: # every m is a list of etree elems cells.append( E.td(*xxx(m), width="8%", **ar.renderer.cellattrs)) # print(str(y.year) +":" + ''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) return E.table(*rows, **ar.renderer.tableattrs) if self.mode == UL_MODE: items = [] for y in self.years.values(): for m, lst in enumerate(reversed(y.months)): # January is [11], Dec is [0] if len(lst): items.append( E.li(monthname(12 - m), " ", str(y.year), ": ", *xxx(lst))) return E.ul(*items) if self.mode == PLAIN_MODE: elems = [] for y in self.years.values(): for lst in y.months: if len(lst): if len(elems): elems.append(sep) elems.extend(xxx(lst)) return E.p(*elems) raise Exception("20180720")
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_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(other.obj2href(ar)) 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] if self.insert_action is not None and ar.renderer.is_interactive: sar = self.insert_action.request_from(ar) if 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 to_html(self, ar): self.analyze_view() if self.mode == TABLE_MODE: sep = ' ' fmt = day_and_weekday elif self.mode == UL_MODE: sep = ' ' fmt = day_and_weekday elif self.mode == PLAIN_MODE: sep = ', ' fmt = dd.fds def rnd(obj, ar): if self.model is rt.models.cal.Guest: d = obj.event.start_date evt = obj.event else: d = obj.start_date evt = obj # if show_auto_num and evt.auto_type: # yield str(evt.auto_type)+":" yield ar.obj2html(evt, fmt(d)) if obj.state.button_text: yield str(obj.state.button_text) # return (fdmy(d) + ": ", ar.obj2html(evt, lbl)) def xxx(list_of_entries): elems = [] # for e in reversed(list_of_entries): for e in list_of_entries: if len(elems): elems.append(sep) elems.extend(rnd(e, ar)) return elems if self.mode == TABLE_MODE: rows = [] cells = [E.th("")] + [E.th(monthname(m+1)) for m in range(12)] # print(''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) for y in self.years.values(): cells = [E.td(str(y.year), width="4%")] for m in y.months: # every m is a list of etree elems cells.append(E.td(*xxx(m), width="8%", **ar.renderer.cellattrs)) # print(str(y.year) +":" + ''.join([tostring(c) for c in cells])) rows.append(E.tr(*cells)) return E.table(*rows, **ar.renderer.tableattrs) if self.mode == UL_MODE: items = [] for y in self.years.values(): for m, lst in enumerate(reversed(y.months)): # January is [11], Dec is [0] if len(lst): items.append(E.li( monthname(12-m), " ", str(y.year), ": ", *xxx(lst))) return E.ul(*items) if self.mode == PLAIN_MODE: elems = [] for y in self.years.values(): for lst in y.months: if len(lst): if len(elems): elems.append(sep) elems.extend(xxx(lst)) return E.p(*elems) raise Exception("20180720")
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByHuman`. """ if obj is None: return '' # 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) try: links.sort(key=lambda a: a[1].birth_date.as_date(), reverse=True) # 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), gettext(" of "), obj.format_family_member(ar, other), " (%s)" % other.age)) elems = [] if len(items) > 0: elems += [gettext("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(gettext("No relationships.")) # Buttons for creating relationships: if self.insert_action is not None: 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(), gettext("Create relationship as ")] + actions return E.div(*elems)