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 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 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 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 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_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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 description(self, ar): if self.ref is None: s = self.get_designation() else: s = self.ref s = u' ' * (len(s)-1) + s s += " " + self.get_designation() if self.is_heading(): s = E.b(s) return s
def description(self, ar): if self.ref is None: s = self.get_designation() else: s = self.ref s = u' ' * (len(s) - 1) + s s += " " + self.get_designation() if self.is_heading(): s = E.b(s) return s
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 get_rfc_description(self, ar): html = '' _ = gettext if self.description: # html += tostring(E.b(_("Description"))) html += ar.parse_memo(self.description) if self.upgrade_notes: html += tostring(E.b(_("Resolution"))) + ": " html += ar.parse_memo(self.upgrade_notes) if self.duplicate_of_id: html += tostring(_("Duplicate of")) + " " html += tostring(self.duplicate_of.obj2href(ar)) return html
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 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 welcome_messages(ar): """Yield messages for the welcome page.""" #todo show all users active sessions Session = rt.models.working.Session # Ticket = rt.models.tickets.Ticket # TicketStates = rt.models.tickets.TicketStates me = ar.get_user() # your open sessions (i.e. those you are busy with) qs = Session.objects.filter(end_time__isnull=True) working = {me: [E.b(str(_("You are busy with ")))]} if qs.count() == 0: return for ses in qs: if ses.user not in working: working[ses.user] = [ ar.obj2html(ses.user), gettext(" is working on: ") ] txt = str(ses.ticket) working[ses.user].append( ar.obj2html(ses.ticket, txt, title=getattr(ses.ticket, 'summary', "") or getattr(ses.ticket, 'name', ""))) if ses.user == me: working[ses.user] += [ ' (', ar.instance_action_button(ses.end_session, EndTicketSession.label), ')' ] working[ses.user].append(', ') if len(working[me]) > 1: working[me][-1] = working[me][-1].replace(", ", ".") result = E.p(*working.pop(me)) else: result = E.p() working.pop(me) for u, s in working.items(): if len(result): result.append(E.br()) s[-1] = s[-1].replace(", ", ".") result.append(E.span(*s)) yield result
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: da = obj.get_detail_action(ar) if da is not None: 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, _(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 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, is_on_main_actor=False) # print(20170731, sar.is_on_main_actor) 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.models.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 ar.html_text(E.span(*join_elems(elems)))
def get_table_summary(cls, mi, ar): if mi is None: return items = [] ar = ar.spawn(cls, master_instance=mi, is_on_main_actor=False) for obj in ar: chunks = [] for e in cls.get_handle().get_columns(): if e.hidden: continue v = e.field._lino_atomizer.full_value_from_object(obj, ar) if v: if len(chunks) > 0: chunks.append(", ") chunks += [e.get_label(), ": ", E.b(e.format_value(ar, v))] items.append(E.li(*forcetext(chunks))) return E.ul(*items)
def 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, is_on_main_actor=False) # print(20170731, sar.is_on_main_actor) 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.models.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 ar.html_text(E.span(*join_elems(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: sar = mnu.bound_action.actor.request( action=mnu.bound_action, user=ar.user, subst_user=ar.subst_user, requesting_panel=ar.requesting_panel, renderer=self, **mnu.params) # print("20170113", sar) url = sar.get_request_url() else: url = mnu.href assert mnu.label is not None if url is None: return E.p() # spacer return E.li(E.a(mnu.label, href=url, tabindex="-1")) items = [self.show_menu(ar, mi, level + 1) for mi in mnu.items] # ~ print 20120901, items if level == 1: return E.ul(*items, **{'class': 'nav navbar-nav'}) if mnu.label is None: raise Exception("%s has no label" % mnu) if level == 2: cl = 'dropdown' menu_title = E.a(str(mnu.label), E.b(' ', **{'class': "caret"}), href="#", data_toggle="dropdown", **{'class': 'dropdown-toggle'}) elif level == 3: menu_title = E.a(str(mnu.label), href="#") cl = 'dropdown-submenu' else: raise Exception("Menu with more than three levels") return E.li(menu_title, E.ul(*items, **{'class': 'dropdown-menu'}), **{'class': cl})
def welcome_messages(ar): """Yield messages for the welcome page.""" #todo show all users active sessions Session = rt.models.working.Session # Ticket = rt.models.tickets.Ticket # TicketStates = rt.models.tickets.TicketStates me = ar.get_user() # your open sessions (i.e. those you are busy with) qs = Session.objects.filter(end_time__isnull=True) working = {me:[E.b(six.text_type(_("You are busy with ")))]} if qs.count() == 0: return for ses in qs: if ses.user not in working: working[ses.user] = [ar.obj2html(ses.user), gettext(" is working on: ")] txt = six.text_type(ses.ticket) working[ses.user].append( ar.obj2html(ses.ticket, txt, title=getattr(ses.ticket,'summary',"") or getattr(ses.ticket,'name',""))) if ses.user == me: working[ses.user] += [ ' (', ar.instance_action_button( ses.end_session, EndTicketSession.label), ')'] working[ses.user].append(', ') if len(working[me]) > 1: working[me][-1] = working[me][-1].replace(", ", ".") result = E.p(*working.pop(me)) else: result = E.p() working.pop(me) for u, s in working.items(): if len(result): result.append(E.br()) s[-1] = s[-1].replace(", ", ".") result.append(E.span(*s)) yield result
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 show_menu(self, ar, mnu, level=1): """ Render the given menu as an HTML element. Used for writing test cases. """ if not isinstance(mnu, Menu): assert isinstance(mnu, MenuItem) if mnu.bound_action: sar = mnu.bound_action.actor.request( action=mnu.bound_action, user=ar.user, subst_user=ar.subst_user, requesting_panel=ar.requesting_panel, renderer=self, **mnu.params) # print("20170113", sar) url = sar.get_request_url() else: url = mnu.href assert mnu.label is not None if url is None: return E.p() # spacer return E.li(E.a(str(mnu.label), href=url, tabindex="-1")) items = [self.show_menu(ar, mi, level + 1) for mi in mnu.items] #~ print 20120901, items if level == 1: return E.ul(*items, **{'class':'nav navbar-nav'}) if mnu.label is None: raise Exception("%s has no label" % mnu) if level == 2: cl = 'dropdown' menu_title = E.a( str(mnu.label), E.b(' ', **{'class': "caret"}), href="#", data_toggle="dropdown", **{'class':'dropdown-toggle'}) elif level == 3: menu_title = E.a(str(mnu.label), href="#") cl = 'dropdown-submenu' else: raise Exception("Menu with more than three levels") return E.li( menu_title, E.ul(*items, **{'class':'dropdown-menu'}), **{'class':cl})
def 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 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 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 pick_choice(self, ar): if ar is None: return fld.value_from_object(self) # ▶: U+25B6, ◀: U+25C0 selected_tpl = "▶{}◀" elems = [] ba = ar.actor.get_action_by_name(action_name) for v in cls.get_list_items(): kw = dict(action_param_values=dict(choice=v)) label = str(v.button_text or v.text) if fld.value_from_object(self, ar) == v: elems.append(E.b(selected_tpl.format(label))) else: if fldname in ar.actor.get_disabled_fields(self, ar): pass # elems.append(label) else: elems.append( ar.action_button(ba, self, label=label, request_kwargs=kw, title=v.text)) return E.p(*join_elems(elems, sep=" | "))
def get_name_elems(self, ar): elems = [] if self.prefix: elems += [self.prefix, ' '] elems.append(E.b(self.name)) return 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.prefix, E.br()] elems += [self.first_name, ' ', E.b(self.last_name)] return elems
def get_name_elems(self, ar): elems = [] if self.prefix: elems += [self.prefix, ' '] elems.append(E.b(self.name)) return elems
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'), ' -- '))
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'), ' -- '))