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 func(fld, obj, ar): # obj is the first day of the week to show # pv = ar.param_values today = dd.today() # if pv is None: # return qs = cls.get_calendar_entries(ar, None) # qs = Event.objects.all() # qs = Event.calendar_param_filter(qs, pv) mi = ar.master_instance if mi is None: return target_day = cls.get_row_by_pk(ar, obj.pk + int(wd.value) - 1) current_month = mi.date.month nav = mi.planner # offset = ar.master_instance.pk # offset = int(ar.rqdata.get('mk', 0) or 0) if ar.rqdata else ar.master_instance.pk # current_date = dd.today(offset) # pk = offset + int(wd.value) - 1 # target_day = cls.get_row_by_pk(ar, pk) # if target_day is None: # return # target_day = week[int(wd.value)-1] qs = qs.filter(start_date=target_day.date) qs = qs.order_by('start_time') chunks = [ E.p(e.obj2href(ar, cls.get_calview_div(e, ar))) for e in qs ] # pk = date2pk(target_day) # nav.daily_view # sar = ar.spawn_request(actor=actor, param_values=ar.param_values) # rnd = settings.SITE.kernel.default_renderer # def func(day, text): # # day.navigation_mode = actor.navigation_mode # return rnd.ar2button(sar, day, text, style="", icon_name=None, title=str(day)) # daily = nav.daily_button_func(ar) daily_link = daily(target_day, str(target_day.date.day)) if target_day.date == today: daily_link = E.b(daily_link) # header_items = [daily_link] # header_items = Event.gen_insert_button(cls, header_items, ar, target_day) header_items = [daily_link] btn = ar.gen_insert_button(Events, start_date=target_day.date) if btn: header_items.append(btn) header = E.div(*header_items, align="center", CLASS="header") return E.table( E.tr(E.td(*[header, E.div(*join_elems(chunks))])), CLASS="fixed-table cal-month-cell {} {} {}".format( "current-month" if current_month == target_day.date.month else "other-month", "current-day" if target_day.date == today else "", "cal-in-past" if target_day.date < today else ""))
def value2html(self, ar): txt = dd.format_currency(self.value, False, True) if self.item.is_heading(): # return E.b(txt) return E.div(E.b(txt), align="right") # return txt return E.div(txt, align="right")
def func(fld, week, ar): pv = ar.param_values if pv is None: return qs = Event.objects.all() qs = Event.calendar_param_filter(qs, pv) offset = int(ar.rqdata.get('mk', 0) or 0) if ar.rqdata else ar.master_instance.pk today = dd.today() current_date = dd.today(offset) target_day = week[int(pc.value) - 1] qs = qs.filter(start_date=target_day) qs = qs.order_by('start_time') chunks = [ E.p(e.obj2href(ar, e.colored_calendar_fmt(pv))) for e in qs ] pk = date2pk(target_day) daily, weekly, monthly = make_link_funcs(ar) daily_link = daily(Day(pk), str(target_day.day)) if target_day == today: daily_link = E.b(daily_link) header_items = [daily_link] header_items = gen_insert_button(cls, header_items, Event, ar, target_day) header = E.div(*header_items, align="center", CLASS="header") return E.table( E.tr(E.td(*[header, E.div(*join_elems(chunks))])), CLASS="fixed-table cal-month-cell {} {} {}".format( "current-month" if current_date.month == target_day.month else "other-month", "current-day" if target_day == today else "", "cal-in-past" if target_day < today else ""))
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( sender.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 colored_calendar_fmt(self, pv): ele = E.span(self.calendar_fmt(pv)) data_color = self.get_diplay_color() if data_color: dot = E.span(u"\u00A0", CLASS="dot") # ele.attrib['style'] = "color: white;background-color: {};".format(data_color) dot.attrib['style'] = "background-color: {};".format(data_color) return E.div(*[dot, ele]) else: return E.div(*[ele])
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( sender.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 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 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 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 get_table_summary(self, mi, ar): if ar is None: return '' sar = self.request_from(ar, master_instance=mi) def fmt(obj): return str(obj) elems = [] for obj in sar: # if len(elems) > 0: # elems.append(', ') lbl = fmt(obj) # if obj.state.button_text: # lbl = "{0}{1}".format(lbl, obj.state.button_text) elems.append(ar.obj2html(obj, lbl)) elems = join_elems(elems, sep=', ') toolbar = [] ar2 = self.insert_action.request_from(sar) if ar2.get_permission(): btn = ar2.ar2button() toolbar.append(btn) if len(toolbar): toolbar = join_elems(toolbar, sep=' ') elems.append(E.p(*toolbar)) return ar.html_text(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(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, max_num=10, **context): context = ar.get_printable_context(**context) qs = rt.models.blogs.Entry.objects.filter(pub_date__isnull=False) qs = qs.order_by("-pub_date") render = dd.plugins.jinja.render_jinja elems = [] for num, e in enumerate(qs): if num >= max_num: break context.update(obj=e) # s = render(ar, 'blogs/entry.html', context) elems.append(E.h2(e.title or str(e), " ", e.obj2href( ar, u"⏏", **{'style': "text-decoration:none"}))) # s = ar.parse_memo(e.short_preview) s = e.short_preview tree = etree.parse(StringIO(s), html_parser) # elems.extend(tree.iter()) # elems.append(tree.iter().next()) elems.append(tree.getroot()) elems.append(E.p( _("{} by {}").format(dd.fdf(e.pub_date), e.user))) # elems.append(E.p( # _("{} by {}").format(dd.fdf(e.pub_date), e.user), # " ", e.obj2href(ar, "(edit)"))) return E.div(*elems)
def weeklyNavigation(cls, obj, ar): today = obj.date prev = cls.date2pk(DurationUnits.months.add_duration(today, -1)) next = cls.date2pk(DurationUnits.months.add_duration(today, 1)) elems = cls.calender_header(ar) header = [ ar.goto_pk(prev, "<<"), " ", "{} {}".format(monthname(today.month), today.year), " ", ar.goto_pk(next, ">>")] elems.append(E.h2(*header, align="center")) rows = [] for week in CALENDAR.monthdatescalendar(today.year, today.month): # each week is a list of seven datetime.date objects. cells = [] current_week = week[0].isocalendar()[1] cells.append(E.td(str(current_week))) for day in week: pk = cls.date2pk(day) if day.isocalendar()[1] == today.isocalendar()[1]: cells.append(E.td(str(day.day))) else: cells.append(E.td(ar.goto_pk(pk, str(day.day)))) rows.append(E.tr(*cells, align="center")) elems.append(E.table(*rows, align="center")) elems.append(E.p(ar.goto_pk(0, gettext("This week")), align="center")) # for o in range(-10, 10): # elems.append(ar.goto_pk(o, str(o))) # elems.append(" ") 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 = [] try: for item in forcetext(story): if 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) except Warning as e: elems.append(str(e)) return E.div(*elems)
def description(cls, fld, ar): if ar is None: return '' elems = [fld.help_text, E.br()] def x(label, lst, xlst): if lst is None: return spec = ' '.join([i.name or i.value for i in lst]) if xlst is not None: spec += ' ' + ' '.join([ "!"+(i.name or i.value) for i in xlst]) spec = spec.strip() if spec: elems.extend([label, " ", spec, E.br()]) x(_("columns"), fld.vat_columns, fld.exclude_vat_columns) x(_("regimes"), fld.vat_regimes, fld.exclude_vat_regimes) x(_("classes"), fld.vat_classes, fld.exclude_vat_classes) elems += [ fld.__class__.__name__, ' ', DCLABELS[fld.dc], "" if fld.both_dc else " only", E.br()] if fld.observed_fields: elems += [ _("Sum of"), ' ', ' '.join([i.name for i in fld.observed_fields]), E.br()] return E.div(*forcetext(elems))
def show_story(self, ar, story, stripped=True, **kwargs): """ Render the given story and return it as an HTML tree DIV element. Ignore `stripped` because it makes no sense in HTML. """ from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest elems = [] try: for item in forcetext(story): # print("20180907 {}".format(item)) if iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.extend(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.extend(self.table2story(item, **kwargs)) elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None elems.append( self.show_story(ar, item.actor.get_story(None, ar), **kwargs)) elif isinstance(item, DashboardItem): html = self.show_story(ar, item.render(ar), **kwargs) if html: elems.append( E.div(html, CLASS="dashboard-item " + item.actor.actor_id.replace(".", "-") if getattr(item, "actor", False) else "")) 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) except Warning as e: elems.append(str(e)) # print("20180907 show_story in {} : {}".format(ar.renderer, elems)) return E.div(*elems) if elems else ""
def week_number(cls, week, ar): label = str(week[0].isocalendar()[1]) pk = date2pk(week[0]) if ar.param_values is None: return None daily, weekly, monthly = make_link_funcs(ar) link = weekly(Day(pk), label) return E.div(*[link], align="center")
def votable_overview(self, ar): if ar is None or self.votable_id is None: return '' elems = self.votable.get_overview_elems(ar) # elems += [E.br()] # # elems += [E.br(), _("{} state:").format( # # self._meta.verbose_name), ' '] # elems += self.get_workflow_buttons(ar) return E.div(*elems)
def welcome_messages(ar): locked_rows = list(Lockable.get_lockable_rows(ar.get_user())) if locked_rows: chunks = [ ugettext("You have a dangling edit lock on"), " "] chunks += join_elems( [ar.obj2html(obj) for obj in locked_rows], ", ") chunks.append('.') yield E.div(*chunks)
def find_appointment(self, ar): if ar is None: return '' CalendarPanel = rt.models.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 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()))
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 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. A story is an iterable of things that can be rendered. """ from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest elems = [] try: for item in forcetext(story): # print("20180907 {}".format(item)) if iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.extend(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.extend(self.table2story(item, **kwargs)) elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None elems.append(self.show_story(ar, item.actor.get_story(None, ar), **kwargs)) elif isinstance(item, DashboardItem): elems.append(E.div( self.show_story(ar, item.render(ar), **kwargs), CLASS="dashboard-item " + item.actor.actor_id.replace(".","-") if getattr(item, "actor", False) else "" )) 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) except Warning as e: elems.append(str(e)) # print("20180907 show_story in {} : {}".format(ar.renderer, elems)) return E.div(*elems) if elems else ""
def get_calview_div(cls, obj, ar): """Return a <div> for this calendar entry in the view given by ar. """ time_text = "" if obj.start_time: time_text = "{} ".format(obj.start_time)[:5] # text = E.span(*cls.get_calview_chunks(obj, ar)) text = E.span(time_text, " ", *obj.get_event_summary(ar)) color = obj.get_diplay_color() if color: dot = E.span("\u00A0", CLASS="dot", style="background-color: {};".format(color)) # ele.attrib['style'] = "color: white;background-color: {};".format(data_color) # dot.attrib['style'] = "background-color: {};".format(data_color) return E.div(dot, text) else: return E.div(text)
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 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", tostring(e) if header_level is not None: return E.div(E.h2(str(self.actor.label)), e) return e
def ca_fmt(ar, ca): if ar is None or ca is None: return '' elems = [] obj = ca.get_object() if obj is None: elems.append(gettext("(undefined)")) else: elems.append(ar.obj2html(obj)) elems.append(u" ({})".format(ca)) return E.div(*elems)
def ca_fmt(ar, ca): if ar is None or ca is None: return '' elems = [] obj = ca.get_object() if obj is None: elems.append(gettext("(undefined)")) else: # elems.append(ar.obj2html(obj)) elems.append(str(obj)) elems.append(u" ({})".format(ca)) return E.div(*elems)
def get_table_summary(cls, mi, ar): elems = [] sar = ar.spawn(rt.models.ledger.MovementsByPartner, master_instance=mi, param_values=dict(cleared=dd.YesNo.no)) bal = ZERO for mvt in sar: 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 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 eid_info(self, ar): "Display some information about the eID card." attrs = {'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['class'] = "lino-info-red" return E.div(*elems, **attrs)
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 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): sar = self.request_from(ar, master_instance=obj) chunks = [] for mbr in sar: chunks.append(ar.obj2html(mbr, str(mbr.user))) chunks = join_elems(chunks, ', ') # sar = self.insert_action.request_from(sar) # if sar.get_permission(): # btn = sar.ar2button(None, _("Add member"), icon_name=None) # chunks.append(E.p((btn))) return E.div(*chunks)
def unused_get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) chunks = [] for mbr in sar: chunks.append(ar.obj2html(mbr, str(mbr.user))) chunks = join_elems(chunks, ', ') # sar = self.insert_action.request_from(sar) # if sar.get_permission(): # btn = sar.ar2button(None, _("Add member"), icon_name=None) # chunks.append(E.p((btn))) return E.div(*chunks)
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", tostring(e)) return e
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 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_calendar_summary(cls, obj, ar): # print("20181121 get_calendar_summary", cls) # note that objects can be either Event or Guest. if the view # is called for Guest, we waht to display the guest states # (not the event states). But when user clicks on a date they # want to show the event even when we are calling from Guest. if ar is None or obj is None: return '' state_coll = {} cal = CalendarRenderer(cls.model) # sar = ar.spawn(parent=ar, master_instance=obj) # sar = ar.actor.request(parent=ar, master_instance=obj) sar = cls.request_from(ar, master_instance=obj) # sar = cls.request(parent=ar, master_instance=obj) # print("20181121 {}".format(ar.actor)) # print("20181121 {}".format(cls.get_filter_kw(sar))) # print("20181121 {}".format(len(list(sar)))) for obj in sar: if obj.state in state_coll: state_coll[obj.state] += 1 else: state_coll[obj.state] = 1 cal.collect(obj) elems = [cal.to_html(ar)] # choicelist = EntryStates choicelist = cls.workflow_state_field.choicelist ul = [] for st in choicelist.get_list_items(): ul.append(_("{} : {}").format(st, state_coll.get(st, 0))) toolbar = [] toolbar += join_elems(ul, sep=', ') # elems = join_elems(ul, sep=E.br) if isinstance(obj, rt.models.cal.EventGenerator): ar1 = obj.do_update_events.request_from(sar) if ar1.get_permission(): btn = ar1.ar2button(obj) toolbar.append(btn) ar2 = cls.insert_action.request_from(sar) if ar2.get_permission(): btn = ar2.ar2button() toolbar.append(btn) if len(toolbar): toolbar = join_elems(toolbar, sep=' ') elems.append(E.p(*toolbar)) return ar.html_text(E.div(*elems))
def week_number(cls, obj, ar): # obj is the first day of the week if not isinstance(obj, Day): raise Exception("{} is not a Day".format(obj)) if ar.param_values is None: return None label = str(obj.date.isocalendar()[1]) # label = str(week[0].isocalendar()[1]) # pk = date2pk(week[0]) # nav = ar.master_instance.ar.actor.planner # 20200224 # daily, weekly, monthly = nav.make_link_funcs(ar) # weekly = nav.weekly_button_func(ar) # link = weekly(Day(pk), label) link = label return E.div(*[link], align="center")
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(*forcetext(elems), style="font-size:18px;font-weigth:bold;" "vertical-align:bottom;text-align:middle")] elems += AddressOwner.get_overview_elems(self, ar) elems += ContactDetailsOwner.get_overview_elems(self, ar) return 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): if ar is None: return '' sar = self.request_from(ar, master_instance=obj) elems = [] fmt = rt.models.cal.EventGenerator.get_cal_entry_renderer( day_and_month) for guest in sar: if len(elems): elems.append(', ') elems.extend(fmt(guest.event, ar)) # lbl = fmt(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_table_summary(cls, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_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 recent_comments(self, ar): if ar is None: return '' cls = rt.models.comments.CommentsByRFC sar = cls.request_from( ar, master_instance=self, limit=3) chunks = [] for com in sar.sliced_data_iterator: chunks.append(ar.obj2html(com, str(com))) chunks.append("...") chunks = join_elems(chunks, ', ') sar = cls.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button(None, _("Write comment"), icon_name=None) chunks.append(" ") chunks.append(btn) return E.div(*chunks)
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, obj, ar): if ar is None: return '' sar = self.request_from(ar, master_instance=obj) state_coll = {} cal = CalendarRenderer() for evt in sar: # if len(elems) > 0: # elems.append(', ') if evt.state in state_coll: state_coll[evt.state] += 1 else: state_coll[evt.state] = 1 cal.collect(evt.start_date, evt) elems = [cal.to_html(ar)] ul = [] for st in EntryStates.get_list_items(): ul.append(_("{} : {}").format(st, state_coll.get(st, 0))) toolbar = [] toolbar += join_elems(ul, sep=', ') # elems = join_elems(ul, sep=E.br) ar1 = obj.do_update_events.request_from(sar) if ar1.get_permission(): btn = ar1.ar2button(obj) toolbar.append(btn) ar2 = self.insert_action.request_from(sar) if ar2.get_permission(): btn = ar2.ar2button() toolbar.append(btn) if len(toolbar): toolbar = join_elems(toolbar, sep=' ') elems.append(E.p(*toolbar)) return ar.html_text(E.div(*elems))
def get_table_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, self._voucher_base): vtypes.append(vt) actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True if not ar.get_user().user_type.readonly: flt = {self._master_field_name: obj} for vt in vtypes: for jnl in vt.get_journals(): sar = vt.table_class.insert_action.request_from( ar, master_instance=jnl, known_values=flt) btn = sar.ar2button(label=str(jnl), icon_name=None) if len(actions): actions.append(', ') actions.append(btn) elems += [E.br(), str(_("Create voucher in journal")), " "] + actions return E.div(*elems)
def preview(self, ar): return E.div(*self.get_html_chunks())
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:`etgen.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, header_links=as_main) if not as_main: url = ar.get_request_url() # open in own window return E.div( E.div( E.div( E.a( E.span(**{'class':"glyphicon glyphicon-folder-open"}), href=url, style="margin-left: 4px;", **{'class':"btn btn-default pull-right"}), E.h5(ar.get_title(), style="display: inline-block;"), **{'class': "panel-title"}), **{'class':"panel-heading"}), t.as_element(), style="display: inline-block;", **{'class':"panel panel-default"}) 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())