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(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 show_state(): l.append(sep) #~ l.append(E.b(unicode(state),style="vertical-align:middle;")) if state.button_text: l.append(E.b(u"{} {}".format(state.button_text, state))) else: l.append(E.b(str(state)))
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 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 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(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): sar = self.request_from(ar, master_instance=obj) items = [o.detail_type.as_html(o, sar) for o in sar if not o.end_date] html = [] if len(items) == 0: html += _("No contact details") else: html += join_elems(items, sep=', ') ins = self.insert_action.request_from(sar) if ins.get_permission(): # kw = dict(label=u"⊕") # 2295 circled plus # kw.update(icon_name=None) # # kw.update( # # style="text-decoration:none; font-size:120%;") # btn = ins.ar2button(**kw) btn = ins.ar2button() # if len(items) > 0: # html.append(E.br()) html.append(' ') html.append(btn) if True: html.append(' ') html.append(sar.as_button(icon_name="wrench")) # GEAR # html.append(sar.as_button(u"⚙")) # GEAR # html.append(sar.as_button( # u"⚙", style="text-decoration:none; font-size:140%;")) # GEAR else: html.append(E.br()) html.append(sar.as_button(_("Manage contact details"))) return E.p(*html)
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, 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(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 format_as_html(self, ar): elems = [] if len(self.used_events) == 0: return E.p(gettext("No invoiced events")) # used_events = list(self.used_events) invoiced = self.used_events[self.invoiced_events:] coming = self.used_events[:self.invoiced_events] fmt = self.generator.get_invoiceable_event_formatter() # def fmt(ev): # return self.generator.format_invoiceable_event(ev, ar) if len(invoiced) > 0: elems.append("{0} : ".format(_("Invoiced"))) if len(invoiced) > MAX_SHOWN: elems.append("(...) ") invoiced = invoiced[-MAX_SHOWN:] elems += join_elems(map(fmt, invoiced), sep=', ') # s += ', '.join(map(fmt, invoiced)) # elems.append(E.p(s)) if len(coming) > 0: if len(elems) > 0: elems.append(E.br()) elems.append("{0} : ".format(_("Not invoiced"))) elems += join_elems(map(fmt, coming), sep=', ') # s += ', '.join(map(fmt, coming)) # elems.append(E.p(s)) return E.p(*elems)
def href_button(self, url, text, title=None, icon_name=None, **kw): """Returns an etree object of a ``<a href>`` tag to the given URL `url`. `url` is what goes into the `href` part. If `url` is `None`, then we return just a ``<b>`` tag. `text` is what goes between the ``<a>`` and the ``</a>``. This can be either a string or a tuple (or list) of strings (or etree elements). """ # logger.info('20121002 href_button %s', unicode(text)) if title: # Remember that Python 2.6 doesn't like if title is a Promise kw.update(title=str(title)) #~ return xghtml.E.a(text,href=url,title=title) if not isinstance(text, (tuple, list)): text = (text,) text = forcetext(text) if url is None: return E.b(*text) kw.update(href=url) if icon_name is not None: src = settings.SITE.build_static_url( 'images', 'mjames', icon_name + '.png') img = E.img(src=src, alt=icon_name) return E.a(img, **kw) else: return E.a(*text, **kw)
def get_name_elems(self, ar): elems = [ self.get_salutation(nominative=True), ' ', self.prefix, E.br() ] elems += [self.first_name, ' ', E.b(self.last_name)] return elems
def href_button(self, url, text, title=None, icon_name=None, **kw): """Return an etree element of a ``<a href>`` tag to the given URL `url`. `url` is what goes into the `href` part. If `url` is `None`, then we return just a ``<b>`` tag. `text` is what goes between the ``<a>`` and the ``</a>``. This can be either a string or a tuple (or list) of strings (or etree elements). """ # logger.info('20121002 href_button %s', unicode(text)) if title: # Remember that Python 2.6 doesn't like if title is a Promise kw.update(title=str(title)) #~ return xghtml.E.a(text,href=url,title=title) if not isinstance(text, (tuple, list)): text = (text,) text = forcetext(text) if url is None: return E.b(*text) kw.update(href=url) if icon_name is not None: src = settings.SITE.build_static_url( 'images', 'mjames', icon_name + '.png') img = E.img(src=src, alt=icon_name) return E.a(img, **kw) else: return E.a(*text, **kw)
def get_sidebar_item(self, request, other): kw = dict() add_user_language(kw, request) url = self.get_absolute_url(**kw) a = E.a(self.get_sidebar_caption(), href=url) if self == other: return E.li(a, **{'class': 'active'}) return E.li(a)
def what(self, obj, ar): chunks = [] if obj.name: chunks += [E.b(str(obj)), E.br()] chunks += sepjoin(obj.features.all()) #~ if obj.url: #~ chunks += [E.br(),E.a(_("More"),href=obj.url)] return E.p(*chunks)
def get_sidebar_item(self, request, other): kw = dict() add_user_language(kw, request) url = self.get_absolute_url(**kw) a = E.a(self.get_sidebar_caption(), href=url) if self == other: return E.li(a, **{'class':'active'}) return E.li(a)
def body_subject_to_elems(ar, title, description): if description: elems = [E.p(E.b(title), E.br())] elems += rich_text_to_elems(ar, description) else: elems = [E.b(title)] # return E.span(self.title) return elems
def 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)))
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 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 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 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 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 get_overview_elems(self, ar): elems = super(Client, self).get_overview_elems(ar) # elems.append(E.br()) elems.append(ar.get_data_value(self, 'eid_info')) notes = [] for obj in rt.models.cal.Task.objects.filter( project=self, state=TaskStates.important): notes.append(E.b(ar.obj2html(obj, obj.summary))) if len(notes): notes = join_elems(notes, " / ") elems.append(E.p(*notes, **{'class': "lino-info-yellow"})) return elems
def question(self, obj, ar): if obj.question.number: txt = obj.question.NUMBERED_TITLE_FORMAT % ( obj.question.number, obj.question.title) else: txt = obj.question.title attrs = {} if obj.question.details: attrs.update(title=obj.question.details) if obj.question.is_heading: txt = E.b(txt, **attrs) return ar.html_text(E.span(txt, **attrs))
def calender_header(ar): header = "Calendar Type" elems = [E.h2(*header, align="center")] today_url = ar.renderer.js2url(""" Lino.cal.DailyView.detail.run(null, {"record_id": 0}) """) week_url = ar.renderer.js2url(""" Lino.cal.WeeklyView.detail.run(null, {"record_id": 0}) """) elems.append(E.p(ar.renderer.href(today_url, gettext("Day")), align="center")) elems.append(E.p(ar.renderer.href(week_url, gettext("Week")), align="center")) elems.append(E.p(ar.goto_pk(0, gettext("This month")), align="center")) return elems
def get_question_html(obj, ar): if obj.question.number: txt = obj.question.NUMBERED_TITLE_FORMAT % (obj.question.number, obj.question.title) else: txt = obj.question.title attrs = {} if obj.question.details: attrs.update(title=obj.question.details) if obj.question.is_heading: txt = E.b(txt, **attrs) return E.span(txt, **attrs)
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 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 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_change_desc_html(self, f, old, new): from lino.core.choicelists import ChoiceListField if isinstance(f, models.TextField): old = old or '' new = new or '' if False: diff = difflib.unified_diff(old.splitlines(), new.splitlines(), fromfile="before", tofile="after", lineterm='') txt = E.pre('\n'.join(diff)) else: labels = { '+': _("lines added"), '-': _("lines removed"), '?': _("modifications"), ' ': _("lines changed") } diff = list(difflib.ndiff(old.splitlines(), new.splitlines())) counters = {} for ln in diff: if ln: k = ln[0] c = counters.get(k, 0) counters[k] = c + 1 txt = ', '.join([ "{0} {1}".format(n, labels[op]) for op, n in counters.items() ]) return E.li(E.b(str(f.verbose_name)), " : ", txt) if isinstance(f, models.DateTimeField): return if isinstance(f, models.ForeignKey): if old: old = f.remote_field.model.objects.get(pk=old) if new: new = f.remote_field.model.objects.get(pk=new) elif isinstance(f, ChoiceListField): if isinstance(old, six.string_types): old = f.choicelist.get_by_value(old) if isinstance(new, six.string_types): new = f.choicelist.get_by_value(new) else: old = obj2unicode(old) new = obj2unicode(new) return E.li(E.b(str(f.verbose_name)), " : ", u"{0} --> {1}".format(old, new))
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 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_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 body_subject_to_elems(ar, title, description): """ Convert the given `title` and `description` to a list of HTML elements. Used by :mod:`lino.modlib.notify` and by :mod:`lino_xl.lib.sales` """ if description: elems = [E.p(E.b(title), E.br())] elems += rich_text_to_elems(ar, description) else: elems = [E.b(title)] # return E.span(self.title) return elems
def func(fld, obj, ar): # obj is a Plannable instance qs = Event.objects.all() qs = Event.calendar_param_filter(qs, ar.param_values) delta_days = int(ar.rqdata.get('mk', 0) or 0) if ar.rqdata else ar.master_instance.pk # current_day = dd.today() + timedelta(days=delta_days) current_day = dd.today(delta_days) current_week_day = current_day + \ timedelta(days=int(week_day.value) - current_day.weekday() - 1) qs = qs.filter(start_date=current_week_day) qs = qs.order_by('start_time') chunks = obj.get_weekly_chunks(ar, qs, current_week_day) return E.table(E.tr(E.td(E.div(*join_elems(chunks)))), CLASS="fixed-table")
def get_change_desc_html(self, f, old, new): from lino.core.choicelists import ChoiceListField if isinstance(f, models.TextField): old = old or '' new = new or '' if False: diff = difflib.unified_diff( old.splitlines(), new.splitlines(), fromfile="before", tofile="after", lineterm='') txt = E.pre('\n'.join(diff)) else: labels = { '+': _("lines added"), '-': _("lines removed"), '?': _("modifications"), ' ': _("lines changed")} diff = list(difflib.ndiff( old.splitlines(), new.splitlines())) counters = {} for ln in diff: if ln: k = ln[0] c = counters.get(k, 0) counters[k] = c + 1 txt = ', '.join([ "{0} {1}".format(n, labels[op]) for op, n in counters.items()]) return E.li( E.b(str(f.verbose_name)), " : ", txt) if isinstance(f, models.DateTimeField): return if isinstance(f, models.ForeignKey): if old: old = f.remote_field.model.objects.get(pk=old) if new: new = f.remote_field.model.objects.get(pk=new) elif isinstance(f, ChoiceListField): if isinstance(old, six.string_types): old = f.choicelist.get_by_value(old) if isinstance(new, six.string_types): new = f.choicelist.get_by_value(new) else: old = obj2unicode(old) new = obj2unicode(new) return E.li( E.b(str(f.verbose_name)), " : ", u"{0} --> {1}".format(old, new))
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_story(cls, self, ar): for topic in rt.models.courses.Topic.objects.all(): sar = ar.spawn( rt.models.courses.CoursesByTopic, master_instance=topic) if sar.get_total_count(): yield E.h3(str(topic)) yield sar
def get_story(cls, self, ar): pv = ar.param_values cls.check_params(pv) # if not pv.start_period: # yield E.p(gettext("Select at least a start period")) # return bpv = dict(start_period=pv.start_period, end_period=pv.end_period) balances = [] if pv.with_general: balances.append(GeneralAccountBalances.request( param_values=bpv)) for tt in TradeTypes.get_list_items(): k = 'with_'+tt.name if pv[k]: balances.append( PartnerBalancesByTradeType.request( master_instance=tt, param_values=bpv)) # if pv.with_sales: # balances.append(CustomerAccountsBalance) # if pv.with_purchases: # balances.append(SupplierAccountsBalance) if pv.with_balances: for sar in balances: yield E.h1(str(sar.get_title())) yield sar
def print_actions(self, ar): if ar is None: return '' elems = [] elems.append(ar.instance_action_button( self.write_xml)) return E.p(*join_elems(elems, sep=", "))
def get_file_button(self, text=None): if text is None: text = str(self) if self.file.name: url = settings.SITE.build_media_url(self.file.name) return E.a(text, href=url, target="_blank") return text
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 suppliers(self, ar): """Displays a list of candidate suppliers. This means: all suppliers who have at least one of the skills required by this object. """ if ar is None: return '' if not isinstance(self, dd.plugins.skills.demander_model): return '' Offer = rt.models.skills.Competence Demand = rt.models.skills.Demand skills = set() for dem in Demand.objects.filter(demander=self): skills.add(dem.skill) # skills |= set(dem.skill.get_parental_line()) elems = [] for spl in Offer.objects.filter(faculty__in=skills): if spl.end_user is not None: elems.append(spl.end_user.obj2href(ar)) elems = join_elems(elems, ', ') return E.p(*elems)
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)