def word2html(cls, w): hfr = w.text if w.haspire: hfr = "*" + hfr if Verbe.is_of_this_type(w) and w.form is not None: pronom = PRONOMS[w.form] if pronom[-1] == 'e' and cls.starts_with_vowel(w): pronom = pronom[:-1] #~ return u"%s'<b>%s</b>" % (pronom,hfr) yield pronom yield "'" yield E.b(hfr) return #~ return u"%s <b>%s</b>" % (pronom,hfr) yield pronom yield " " yield E.b(hfr) return if w.type and w.gender: #~ return u"<b>%s</b> (%s%s.)" % (hfr,w.type.text,w.gender) yield E.b(hfr) yield " (%s%s.)" % (w.type.text, w.gender) return if w.type and w.type.text: #~ return u"<b>%s</b> (%s)" % (hfr,w.type.text) yield E.b(hfr) yield " (%s)" % w.type.text return #~ return u"<b>%s</b>" % hfr yield E.b(hfr)
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) #~ print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) #~ raise ValueError("Expected float, go %r" % dt) return unicode(_("%(date)s at %(time)s")) % dict( date=dd.fdf(dt.date()), time=dt.time()) items = [] times = [] value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.p(unicode(_("Source timestamps:")))) for src in ("lino", "lino_welfare", 'django', 'atelier'): label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) def mycmp(a, b): return cmp(b[1], a[1]) times.sort(mycmp) for label, value in times: items.append(E.li(unicode(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) return E.div(*body, class_='htmlText')
def get_change_desc_html(self, f, old, new): from lino.core.choicelists import ChoiceListField if isinstance(f, models.TextField): old = old or '' new = new or '' return E.li( E.b(f.verbose_name), " : ", E.pre('\n'.join(difflib.unified_diff( old.splitlines(), new.splitlines(), fromfile="before", tofile="after", lineterm='')))) if isinstance(f, models.DateTimeField): return if isinstance(f, models.ForeignKey): if old: old = f.rel.to.objects.get(pk=old) if new: new = f.rel.to.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 = obj2str(old) new = obj2str(new) return E.li( E.b(f.verbose_name), " : ", u"{0} --> {1}".format(old, new))
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 '' return E.li( E.b(f.verbose_name), " : ", E.pre('\n'.join( difflib.unified_diff(old.splitlines(), new.splitlines(), fromfile="before", tofile="after", lineterm='')))) if isinstance(f, models.DateTimeField): return if isinstance(f, models.ForeignKey): if old: old = f.rel.to.objects.get(pk=old) if new: new = f.rel.to.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 = obj2str(old) new = obj2str(new) return E.li(E.b(f.verbose_name), " : ", u"{0} --> {1}".format(old, new))
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append(E.p(str(_("Languages")) + ": " + ', '.join([ lng.django_code for lng in settings.SITE.languages]))) # print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) # raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict( date=dd.fds(dt.date()), time=settings.SITE.strftime(dt.time())) value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p( str(label), ' : ', E.b(dtfmt(value)), ' ({})'.format(settings.TIME_ZONE))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format( dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) items = [] times = [] packages = set(['lino', 'django', 'atelier']) for p in settings.SITE.installed_plugins: packages.add(p.app_name.split('.')[0]) for src in packages: label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) times.sort(key=lambda x: x[1]) for label, value in times: items.append(E.li(str(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) # return E.div(*body, class_='htmlText') return rt.html_text(E.div(*body))
def present_word2html(cls, w, book): """ Format word for "presentation" (usually the first column in a table of new words). """ hfr = w.text if w.haspire: hfr = "*" + hfr if Nom.is_of_this_type(w): if w.gender == 'pl': #~ return u"les <b>%s</b> (%s)" % (hfr,w.gender) yield "les " yield E.b(hfr) return #~ if w.defini and (w.text[0].lower() in u'aeiouyàéœ' or (w.text[0].lower() == 'h' and not w.haspire)): if w.defini and cls.starts_with_vowel(w): #~ return u"l'<b>%s</b> (%s)" % (hfr,w.gender) yield "l'" yield E.b(hfr) yield " (%s)" % w.gender return #~ art = w.get_article() #~ def get_article(self): if w.defini: articles = ['le', 'la'] else: articles = ['un', 'une'] if w.gender == 'm': #~ return u"%s <b>%s</b>" % (articles[0],hfr) yield articles[0] yield ' ' yield E.b(hfr) return if w.gender == 'f': #~ return u"%s <b>%s</b>" % (articles[1],hfr) yield articles[1] yield ' ' yield E.b(hfr) return #~ return u"%s <b>%s</b>" % (articles[0],hfr) #~ raise Exception("Unknown gender for Nom %s" % w) yield articles[0] yield ' ' yield E.b(hfr) return for e in cls.word2html(w): yield 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_cosi.lib.sales` """ if description: elems = [E.p(E.b(title), E.br())] elems += rich_text_to_elems(ar, description) else: elems = [E.b(title)] # return E.span(self.title) return elems
def message_html(self, ar): from django.utils.translation import ugettext as _ elems = [] # elems += [_("Date"), dd.fds(self.transaction_date), " "] # elems += [_("Amount"), ' ', E.b(unicode(self.amount)), " "] # self.booking_date elems += self.message # .splitlines() elems.append(E.br()) # elems += [_("ref:"), ': ', self.ref, ' '] elems += [_("eref:"), ': ', self.eref] elems.append(E.br()) elems += [E.b(self.txcd_text), ' '] elems += [_("Value date"), ': ', E.b(dd.fds(self.value_date)), " "] elems += [_("Booking date"), ': ', E.b(dd.fds(self.booking_date)), " "] return E.div(*elems)
def welcome_messages(ar): """Yield messages for the welcome page.""" Session = rt.modules.clocking.Session # Ticket = rt.modules.tickets.Ticket # TicketStates = rt.modules.tickets.TicketStates me = ar.get_user() busy_tickets = set() # your open sessions (i.e. those you are busy with) qs = Session.objects.filter(user=me, end_time__isnull=True) if qs.count() > 0: chunks = [E.b(unicode(_("You are busy with ")))] sep = None for ses in qs: if sep: chunks.append(sep) busy_tickets.add(ses.ticket.id) txt = unicode(ses.ticket) chunks.append( ar.obj2html(ses.ticket, txt, title=ses.ticket.summary)) chunks += [ ' (', ar.instance_action_button( ses.end_session, EndTicketSession.label), ')'] sep = ', ' chunks.append('. ') yield E.p(*chunks)
def workflow_buttons(obj, ar): #~ logger.info('20120930 workflow_buttons %r', obj) l = [] if ar is not None: actor = ar.actor state = actor.get_row_state(obj) if state is not None: #~ l.append(E.b(unicode(state),style="vertical-align:middle;")) l.append(E.b(unicode(state))) #~ l.append(u" » ") #~ l.append(u" \u25b8 ") #~ l.append(u" \u2192 ") #~ sep = u" \u25b8 " sep = u" \u2192 " else: # logger.info('20150602 no state for %s in %s (%s)', # obj, actor, actor.model) sep = '' for ba in actor.get_actions(): if ba.action.show_in_workflow: if actor.get_row_permission(obj, ar, state, ba): l.append(sep) l.append(ar.action_button(ba, obj)) sep = ' ' return E.span(*l)
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 word2html(cls, w, book): #~ return html2rst(w.html_fr_lesson()) + ' ' + w.pronounciation w = w.get_partner(cls.gender) #~ return '<b>%s</b>' % w.text + ' ' + w.get_pron_html() yield E.b(w.text) yield ' ' yield w.get_pron_html()
def get_name_elems(self, ar): elems = [self.get_salutation(nominative=True), E.br()] if self.title: elems += [self.title, ' '] elems += [self.first_name, ' ', E.b(self.last_name)] return elems
def welcome_html(self, ui=None): "See :meth:`ad.Site.welcome_html`." from django.utils.translation import ugettext as _ p = [] sep = '' if self.verbose_name: p.append(_("This is ")) if self.url: p.append( E.a(self.verbose_name, href=self.url, target='_blank')) else: p.append(E.b(self.verbose_name)) if self.version: p.append(' ') p.append(self.version) sep = _(' using ') for name, version, url in self.get_used_libs(html=E): p.append(sep) p.append(E.a(name, href=url, target='_blank')) p.append(' ') p.append(version) sep = ', ' return E.span(*p)
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,) 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 href_button(self, url, text, title=None, target=None, icon_name=None, **kw): """ Returns an etree object of a "button-like" ``<a href>`` tag. """ # logger.info('20121002 href_button %s', unicode(text)) if target: kw.update(target=target) if title: # Remember that Python 2.6 doesn't like if title is a Promise kw.update(title=unicode(title)) #~ return xghtml.E.a(text,href=url,title=title) if not isinstance(text, (tuple, list)): text = (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 href_button( self, url, text, title=None, target=None, icon_name=None, **kw): """ Returns an etree object of a "button-like" ``<a href>`` tag. """ # logger.info('20121002 href_button %s', unicode(text)) if target: kw.update(target=target) if title: # Remember that Python 2.6 doesn't like if title is a Promise kw.update(title=unicode(title)) #~ return xghtml.E.a(text,href=url,title=title) if not isinstance(text, (tuple, list)): text = (text,) if url is None: return E.b(*text) kw.update(href=url) if icon_name is not None: src = settings.SITE.build_media_url( 'lino', 'extjs', '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 welcome_html(self, ui=None): """ Return a HTML version of the "This is APPLICATION version VERSION using ..." text. to be displayed in the About dialog, in the plain html footer, and maybe at other places. """ from django.utils.translation import ugettext as _ p = [] sep = '' if self.verbose_name: p.append(_("This is ")) if self.url: p.append( E.a(self.verbose_name, href=self.url, target='_blank')) else: p.append(E.b(self.verbose_name)) if self.version: p.append(' ') p.append(self.version) sep = _(' using ') for name, version, url in self.get_used_libs(html=E): p.append(sep) p.append(E.a(name, href=url, target='_blank')) p.append(' ') p.append(version) sep = ', ' return E.span(*p)
def what(self, obj, ar): chunks = [] if obj.name: chunks += [E.b(str(obj)), E.br()] chunks += sepjoin(obj.features.all()) #~ if obj.url: #~ chunks += [E.br(),E.a(_("More"),href=obj.url)] return E.p(*chunks)
def what(self, obj, ar): chunks = [] if obj.name: chunks += [E.b(unicode(obj)), E.br()] chunks += sepjoin(obj.features.all()) #~ if obj.url: #~ chunks += [E.br(),E.a(_("More"),href=obj.url)] return E.p(*chunks)
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append( E.p(str(_("Languages")) + ": " + ", ".join([lng.django_code for lng in settings.SITE.languages])) ) # print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) # raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict(date=dd.fds(dt.date()), time=settings.SITE.strftime(dt.time())) value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(str(label), " : ", E.b(dtfmt(value)), " ({})".format(settings.TIME_ZONE))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format(dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) items = [] times = [] packages = set(["lino", "django", "atelier"]) for p in settings.SITE.installed_plugins: packages.add(p.app_name.split(".")[0]) for src in packages: label = src value = codetime("%s.*" % src) if value is not None: times.append((label, value)) times.sort(key=lambda x: x[1]) for label, value in times: items.append(E.li(str(label), " : ", E.b(dtfmt(value)))) body.append(E.ul(*items)) # return E.div(*body, class_='htmlText') return rt.html_text(E.div(*body))
def show_state(): l.append(sep) #~ l.append(E.b(unicode(state),style="vertical-align:middle;")) # if state.button_text: # l.append(E.b(state.button_text)) # else: # l.append(E.b(str(state))) l.append(E.b(str(state)))
def about_html(cls): body = [] body.append(settings.SITE.welcome_html()) if settings.SITE.languages: body.append(E.p(str(_("Languages")) + ": " + ', '.join([ lng.django_code for lng in settings.SITE.languages]))) #~ print "20121112 startup_time", settings.SITE.startup_time.date() def dtfmt(dt): if isinstance(dt, float): dt = datetime.datetime.fromtimestamp(dt) #~ raise ValueError("Expected float, go %r" % dt) return str(_("%(date)s at %(time)s")) % dict( date=dd.fdf(dt.date()), time=dt.time()) items = [] times = [] value = settings.SITE.startup_time label = _("Server uptime") body.append(E.p(str(label), ' : ', E.b(dtfmt(value)))) if settings.SITE.is_demo_site: s = str(_("This is a Lino demo site.")) body.append(E.p(s)) if settings.SITE.the_demo_date: s = _("We are running with simulated date set to {0}.").format( dd.fdf(settings.SITE.the_demo_date)) body.append(E.p(s)) body.append(E.p(str(_("Source timestamps:")))) for src in ("lino", "lino_welfare", 'django', 'atelier'): label = src value = codetime('%s.*' % src) if value is not None: times.append((label, value)) def mycmp(a, b): return cmp(b[1], a[1]) times.sort(mycmp) for label, value in times: items.append(E.li(str(label), ' : ', E.b(dtfmt(value)))) body.append(E.ul(*items)) return E.div(*body, class_='htmlText')
def 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 word2html(cls, w, book): if not w.adjectif: yield '' return w = w.adjectif w = w.get_partner(cls.gender) #~ return '<b>%s</b>' % w.text + ' ' + w.get_pron_html() yield E.b(w.text) yield ' ' yield w.get_pron_html()
def obj2html(self, ar, obj, text=None): if text is None: text = (force_unicode(obj),) elif isinstance(text, basestring): text = (text,) if self.is_interactive: url = self.instance_handler(ar, obj) if url is not None: return E.a(*text, href=url) return E.b(*text)
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 = dict(class_="htmlText") 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 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): if ar is None: return [] elems = super(Client, self).get_overview_elems(ar) # elems.append(E.br()) elems.append(ar.get_data_value(self, 'eid_info')) notes = [] for note in rt.modules.notes.Note.objects.filter( project=self, important=True): notes.append(E.b(ar.obj2html(note, note.subject))) if len(notes): notes = join_elems(notes, " / ") elems += E.p(*notes, class_="lino-info-red") return elems
def get_mti_buttons(self, ar): """""" elems = [] if ar is None: return elems sep = None for m in self._mtinav_models: item = None if self.__class__ is m: item = [E.b(str(m._meta.verbose_name))] else: obj = mti.get_child(self, m) if obj is None: # parent link field p = m._meta.parents.get(self.__class__, None) if p is not None: item = [str(m._meta.verbose_name)] k = InsertChild.name_prefix + m.__name__.lower() ba = ar.actor.get_action_by_name(k) if ba and ba.get_row_permission(ar, self, None): # btn = ar.row_action_button(self, ba, _("+")) btn = ar.row_action_button(self, ba, _(u"➕")) # Heavy Plus Sign U+2795 # btn = ar.row_action_button(self, ba, # icon_name='add') item += [" [", btn, "]"] else: item = [ar.obj2html(obj, m._meta.verbose_name)] # no DeleteChild for my parents if self.__class__ in m.mro(): k = DeleteChild.name_prefix + m.__name__.lower() ba = ar.actor.get_action_by_name(k) if ba and ba.get_row_permission(ar, self, None): # btn = ar.row_action_button(self, ba, _("-")) btn = ar.row_action_button(self, ba, _(u"❌")) # Cross Mark U+274C item += [" [", btn, "]"] if item is not None: if sep is None: sep = ', ' else: elems.append(sep) elems += item return elems
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: sr = 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) url = sr.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(unicode(mnu.label), E.b(' ', class_="caret"), href="#", class_='dropdown-toggle', data_toggle="dropdown") elif level == 3: menu_title = E.a(unicode(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 answer_buttons(self, obj, ar): l = [] pv = dict(question=obj.question) ia = obj.response.toggle_choice for c in obj.question.get_choiceset().choices.all(): pv.update(choice=c) text = unicode(c) try: AnswerChoice.objects.get(**pv) text = [E.b('[', text, ']')] except AnswerChoice.DoesNotExist: pass request_kwargs = dict(action_param_values=pv) e = ar.instance_action_button( ia, text, request_kwargs=request_kwargs, style="text-decoration:none") l.append(e) return E.p(*join_elems(l))
def eid_info(self, ar): "Display some information about the eID card." if ar is None: return '' must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += [ "%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type) ] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < dd.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") if config: elems.append( ar.instance_action_button(self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def answer_buttons(self, obj, ar): # assert isinstance(obj, Answer) cs = obj.question.get_choiceset() if cs is None: return '' elems = [] pv = dict(question=obj.question) # ia = obj.response.toggle_choice sar = obj.response.toggle_choice.request_from(ar) if False: # since 20170129 ba = Responses.actions.toggle_choice if ba is None: raise Exception("No toggle_choice on {0}?".format(ar.actor)) sar = ba.request_from(ar) # print("20150203 answer_buttons({0})".format(sar)) # if the response is registered, just display the choice, no # toggle buttons since answer cannot be toggled: # 20151211 sar.selected_rows = [obj.response] if not sar.get_permission(): return str(obj) AnswerChoice = rt.modules.polls.AnswerChoice for c in cs.choices.all(): pv.update(choice=c) text = str(c) qs = AnswerChoice.objects.filter(response=obj.response, **pv) if qs.count() == 1: text = [E.b('[', text, ']')] elif qs.count() == 0: pass else: raise Exception("Oops: %s returned %d rows." % (qs.query, qs.count())) sar.set_action_param_values(**pv) e = sar.ar2button(obj.response, text, style="text-decoration:none") elems.append(e) return E.span(*join_elems(elems), class_="htmlText")
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: sr = 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) url = sr.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( unicode(mnu.label), E.b(' ', class_="caret"), href="#", class_='dropdown-toggle', data_toggle="dropdown") elif level == 3: menu_title = E.a(unicode(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 workflow_buttons(self, obj, ar): #~ logger.info('20120930 workflow_buttons %r', obj) actor = ar.actor #~ print 20120621 , actor, self #~ print 20120618, ar l = [] state = actor.get_row_state(obj) if state: #~ l.append(E.b(unicode(state),style="vertical-align:middle;")) l.append(E.b(unicode(state))) #~ l.append(u" » ") #~ l.append(u" \u25b8 ") #~ l.append(u" \u2192 ") #~ sep = u" \u25b8 " sep = u" \u2192 " for ba in ar.actor.get_workflow_actions(ar, obj): l.append(sep) l.append(ar.action_button(ba, obj)) sep = ' ' return E.p(*l)
def eid_info(self, ar): must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += ["%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type)] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < datetime.date.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") #~ if settings.SITE.use_eid_jslib or settings.SITE.use_eidreader: if config: #~ ba = cls.get_action_by_name('read_beid') #~ elems.append(ar.action_button(ba,self,_("Must read eID card!"))) elems.append(ar.instance_action_button( self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (unicode(m.role), _(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) if False: elems += [ E.br(), ar.instance_action_button(obj.create_household)] else: elems += [E.br(), _("Create a household"), ' : '] Type = rt.modules.households.Type Person = dd.resolve_model(config.person_model) T = Person.get_default_table() ba = T.get_action_by_name('create_household') buttons = [] for t in Type.objects.all(): apv = dict(type=t, head=obj) sar = ar.spawn(ba, # master_instance=obj, selected_rows=[obj], action_param_values=apv) buttons.append(ar.href_to_request(sar, unicode(t))) elems += join_elems(buttons, sep=' / ') return E.div(*elems)
def eid_info(self, ar): "Display some information about the eID card." if ar is None: return '' must_read = False attrs = dict(class_="lino-info") elems = [] if self.card_number: elems += ["%s %s (%s)" % (ugettext("Card no."), self.card_number, self.card_type)] if self.card_issuer: elems.append(", %s %s" % (ugettext("issued by"), self.card_issuer)) #~ card_issuer = _("issued by"), if self.card_valid_until is not None: valid = ", %s %s %s %s" % ( ugettext("valid from"), dd.dtos(self.card_valid_from), ugettext("until"), dd.dtos(self.card_valid_until)) if self.card_valid_until < dd.today(): must_read = True elems.append(E.b(valid)) elems.append(E.br()) else: elems.append(valid) else: must_read = True else: must_read = True if must_read: msg = _("Must read eID card!") if config: elems.append(ar.instance_action_button( self.read_beid, msg, icon_name=None)) else: elems.append(msg) # same red as in lino.css for .x-grid3-row-red td # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;") attrs.update(class_="lino-info-red") return E.div(*elems, **attrs)
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (unicode(m.role), _(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) if False: elems += [ E.br(), ar.instance_action_button(obj.create_household)] else: elems += [E.br(), _("Create a household"), ' : '] Type = rt.modules.households.Type Person = dd.resolve_model(config.person_model) T = Person.get_default_table() ba = T.get_action_by_name('create_household') buttons = [] for t in Type.objects.all(): apv = dict(type=t, head=obj) sar = ar.spawn(ba, # master_instance=obj, action_param_values=apv) buttons.append(ar.href_to_request(sar, unicode(t))) elems += join_elems(buttons, sep=' / ') return E.div(*elems)
def get_name_elems(self, ar): elems = [] if self.prefix: elems += [self.prefix, ' '] elems += [E.b(self.name)] return elems
def get_name_elems(self, ar): elems = [self.get_salutation(nominative=True), ' ', self.title, E.br()] elems += [self.first_name, ' ', E.b(self.last_name)] return elems
def get_name_elems(self, ar): return [E.b(self.name)]
def where(self, obj, ar): if obj.place is not None: return E.p(str(obj.place), ' ', E.b(str(obj.place.city))) # remember: "von Ans nach Eupen und nicht andersrum" return E.p(*sepjoin(obj.stages.order_by('seqno'), ' -- '))