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 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 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 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 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 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 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(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 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 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()])
def x(label, lst, xlst): if lst is None: spec = '' else: lst = sorted([i.name or i.value for i in lst]) spec = ' '.join(lst) if xlst is not None: xlst = sorted(["!"+(i.name or i.value) for i in xlst]) spec += ' ' + ' '.join(xlst) spec = spec.strip() if spec: elems.extend([label, " ", spec, E.br()])
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: spec = '' else: lst = sorted([i.name or i.value for i in lst]) spec = ' '.join(lst) if xlst is not None: xlst = sorted(["!"+(i.name or i.value) for i in xlst]) spec += ' ' + ' '.join(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 len(fld.observed_fields): names = [] for f in fld.observed_fields: n = f.value if f.value in fld.minus_observed_fields: n = "- " + n elif len(names) > 0: n = "+ " + n names.append(n) elems += ['= ', ' '.join(names), E.br()] return E.div(*forcetext(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 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 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_overview_elems(self, ar): elems = [] buttons = self.get_mti_buttons(ar) # buttons = join_elems(buttons, ', ') elems.append(E.p(str(_("See as ")), *buttons, style="font-size:8px;text-align:right;padding:3pt;")) elems += self.get_name_elems(ar) elems.append(E.br()) elems += join_elems(list(self.address_location_lines()), sep=E.br) elems = [ E.div(*forcetext(elems), style="font-size:18px;font-weigth:bold;" "vertical-align:bottom;text-align:middle")] elems += AddressOwner.get_overview_elems(self, ar) elems += ContactDetailsOwner.get_overview_elems(self, ar) return elems
def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) items = [] for c in sar: # todo have another js button that will expand the summary # into the complete description. items.append( E.li( E.a(c.sha[:6], href=c.url, target="_BLANK"), ":" if c.user else "", ar.obj2html(c.user) if c.user else "", ":", ar.obj2html(c, naturaltime(c.created), title=c.created.strftime('%Y-%m-%d %H:%M')), E.br(), c.summary)) return E.ul(*items)
def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) items = [] for c in sar: # todo have another js button that will expand the summary # into the complete description. items.append(E.li( E.a(c.sha[:6], href=c.url, target="_BLANK"), ":" if c.user else "", ar.obj2html(c.user) if c.user else "", ":", ar.obj2html( c, naturaltime(c.created), title=c.created.strftime('%Y-%m-%d %H:%M')), E.br(), c.summary)) return E.ul(*items)
def 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 get_overview_elems(self, ar): elems = [] buttons = self.get_mti_buttons(ar) if len(buttons) > 1: # buttons = join_elems(buttons, ', ') elems.append( E.p(str(_("See as ")), *buttons, style="font-size:8px;text-align:right;padding:3pt;")) elems += self.get_name_elems(ar) elems.append(E.br()) elems += join_elems(list(self.address_location_lines()), sep=E.br) elems = [ E.div(*forcetext(elems), style="font-size:18px;font-weigth:bold;" "vertical-align:bottom;text-align:middle") ] elems += AddressOwner.get_overview_elems(self, ar) elems += ContactDetailsOwner.get_overview_elems(self, ar) return elems
def get_table_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (str(m.role), gettext(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [gettext("%s is") % obj] elems.append(E.ul(*items)) if self.insert_action is not None: sar = self.insert_action.request_from(ar) if sar.get_permission(): elems.append(E.br()) sar.known_values.update(person=obj) # sar.known_values.pop('child', None) elems += [ sar.ar2button( None, gettext("Join an existing household"), icon_name=None), " ", gettext("or"), " ", ar.instance_action_button( obj.create_household, gettext("create a new one")), # " ", # rt.models.households.Household._meta.verbose_name, "."] return E.div(*elems)
def get_table_summary(self, obj, ar): chunks = [] for other in ar.spawn(self, master_instance=obj): chunks.append(ar.obj2html(other)) # sar = WordsByOwner.default_action.request_from( # ar, master_instance=obj) # if sar.get_permission(): # if len(chunks): # chunks.append(E.br()) # s = getattr(obj, obj.dupable_words_field) # words = ' '.join(obj.get_dupable_words(s)) # label = "({0})".format(words) # btn = sar.ar2button(label=label) # chunks.append(btn) if len(chunks): chunks.append(E.br()) s = getattr(obj, obj.dupable_words_field) words = ' '.join(obj.get_dupable_words(s)) chunks.append("({0})".format(words)) return E.p(*join_elems(chunks))
def get_table_summary(self, obj, ar): chunks = [] for other in ar.spawn(self, master_instance=obj): chunks.append(ar.obj2html(other)) # sar = WordsByOwner.default_action.request_from( # ar, master_instance=obj) # if sar.get_permission(): # if len(chunks): # chunks.append(E.br()) # s = getattr(obj, obj.dupable_words_field) # words = ' '.join(obj.get_dupable_words(s)) # label = "({0})".format(words) # btn = sar.ar2button(label=label) # chunks.append(btn) if len(chunks): chunks.append(E.br()) s = getattr(obj, obj.dupable_words_field) words = ' '.join(obj.get_dupable_words(s)) chunks.append("({0})".format(words)) return E.p(*join_elems(chunks))
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 get_table_summary(self, obj, ar): elems = [] sar = self.request(master_instance=obj) # elems += ["Partner:", unicode(ar.master_instance)] for voucher in sar: vc = voucher.get_mti_leaf() if vc and vc.state.name == "draft": # if voucher.state.name == "draft": elems += [ar.obj2html(vc), " "] vtypes = [] for vt in VoucherTypes.items(): if issubclass(vt.model, self._voucher_base): vtypes.append(vt) actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True if not ar.get_user().user_type.readonly: flt = {self._master_field_name: obj} for vt in vtypes: for jnl in vt.get_journals(): sar = vt.table_class.insert_action.request_from( ar, master_instance=jnl, known_values=flt) btn = sar.ar2button(label=str(jnl), icon_name=None) if len(actions): actions.append(', ') actions.append(btn) elems += [E.br(), str(_("Create voucher in journal")), " "] + actions return E.div(*elems)
def get_table_summary(self, obj, ar): elems = [] sar = self.request(master_instance=obj) # elems += ["Partner:", unicode(ar.master_instance)] for voucher in sar: vc = voucher.get_mti_leaf() if vc and vc.state.name == "draft": elems += [ar.obj2html(vc), " "] vtypes = [] for vt in VoucherTypes.items(): if issubclass(vt.model, self._voucher_base): vtypes.append(vt) actions = [] def add_action(btn): if btn is None: return False actions.append(btn) return True if not ar.get_user().user_type.readonly: flt = {self._master_field_name: obj} for vt in vtypes: for jnl in vt.get_journals(): sar = vt.table_class.insert_action.request_from( ar, master_instance=jnl, known_values=flt) btn = sar.ar2button(label=str(jnl), icon_name=None) if len(actions): actions.append(', ') actions.append(btn) elems += [E.br(), str(_("Create voucher in journal")), " "] + actions return E.div(*elems)
def 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 navigation_panel(cls, obj, ar): if ar is None: return None # if ar.actor.navigator is None: # # raise Exception("Oops, {} has no navigator".format(cls)) # print("Oops, {} has no navigator".format(cls)) # return None today = obj.date # daily, weekly, monthly = obj.cal_view.navigator.make_link_funcs(ar) daily = obj.planner.daily_button_func(ar) weekly = obj.planner.weekly_button_func(ar) monthly = obj.planner.monthly_button_func(ar) if obj.navigation_mode == 'day': long_unit = DurationUnits.months short_unit = DurationUnits.days current_view = daily elif obj.navigation_mode == 'week': long_unit = DurationUnits.months short_unit = DurationUnits.weeks current_view = weekly elif obj.navigation_mode == 'month': long_unit = DurationUnits.years short_unit = DurationUnits.months current_view = monthly else: raise Exception("20200224") daily_mode = bool(obj.navigation_mode == 'day') weekly_mode = bool(obj.navigation_mode == 'week') month_mode = bool(obj.navigation_mode == 'month') # todo ensure that the end of the month is always in the view. # long_unit = DurationUnits.years if month_mode else DurationUnits.months long_prev = cls.get_row_by_pk( ar, date2pk(long_unit.add_duration(today, -1))) long_next = cls.get_row_by_pk( ar, date2pk(long_unit.add_duration(today, 1))) # next_unit = DurationUnits.weeks if weekly_mode else DurationUnits.days if day_view else DurationUnits.months short_prev = cls.get_row_by_pk( ar, date2pk(short_unit.add_duration(today, -1))) short_next = cls.get_row_by_pk( ar, date2pk(short_unit.add_duration(today, 1))) # current_view = weekly if weekly_mode else daily # current_view = daily # if not day_view: # current_view = monthly if month_mode else weekly elems = [] #cls.calender_header(ar) # Month div rows, cells = [], [] for i, month in enumerate(YearMonths.get_list_items()): pk = date2pk( DurationUnits.months.add_duration(today, i + 1 - today.month)) if today.month == i + 1: if not month_mode: cells.append( E.td( E.b(monthly(cls.get_row_by_pk(ar, pk), str(month))))) else: cells.append(E.td(E.b(str(month)))) else: cells.append( E.td(monthly(cls.get_row_by_pk(ar, pk), str(month)))) if (i + 1) % 3 == 0: rows.append(E.tr(*cells, align="center")) cells = [] monthly_div = E.div(E.table(*rows, align="center"), CLASS="cal-month-table") header = [ current_view(long_prev, "<<"), " ", current_view(short_prev, "<"), E.span( E.span("{} {}".format(monthname(today.month), today.year), E.br(), monthly_div)), current_view(short_next, ">"), " ", current_view(long_next, ">>") ] elems.append(E.h2(*header, align="center")) weekdaysFirstLetter = " " + "".join( [gettext(week.text)[0] for week in Weekdays.objects()]) rows = [ E.tr(*[ E.td(E.b(day_of_week)) for day_of_week in weekdaysFirstLetter ], align='center') ] 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] this_week = False for day in week: pk = date2pk(day) link = daily(cls.get_row_by_pk(ar, pk), str(day.day)) if day == dd.today(): link = E.b(link, CLASS="cal-nav-today") if day == today and daily_mode: cells.append(E.td(E.b(str(day.day)))) else: cells.append(E.td(link)) if day.isocalendar()[1] == today.isocalendar()[1]: this_week = True else: if this_week and weekly_mode: txt = E.b(str(current_week)) else: pk = date2pk(week[0]) txt = weekly(cls.get_row_by_pk(ar, pk), str(current_week)) cells = [E.td(txt, CLASS="cal-week")] + cells rows.append(E.tr(*cells, align="center")) today = cls.get_row_by_pk(ar, 0) elems.append(E.table(*rows, align="center")) elems.append(E.p(daily(today, gettext("Today")), align="center")) elems.append(E.p(weekly(today, gettext("This week")), align="center")) elems.append(E.p(monthly(today, gettext("This month")), align="center")) # for o in range(-10, 10): # elems.append(ar.goto_pk(o, str(o))) # elems.append(" ") return E.div(*elems, CLASS="lino-nav-cal")
def get_table_summary(self, response, ar): if response is None: return if response.poll_id is None: return AnswerRemarks = rt.models.polls.AnswerRemarksByAnswer all_responses = rt.models.polls.Response.objects.filter( poll=response.poll).order_by('date') if response.partner: all_responses = all_responses.filter(partner=response.partner) ht = xghtml.Table() ht.attrib.update(cellspacing="5px", bgcolor="#ffffff", width="100%") cellattrs = dict(align="left", valign="top", bgcolor="#eeeeee") headers = [str(_("Question"))] for r in all_responses: if r == response: headers.append(dd.fds(r.date)) else: headers.append(ar.obj2html(r, dd.fds(r.date))) ht.add_header_row(*headers, **cellattrs) ar.master_instance = response # must set it because # get_data_rows() needs it. # 20151211 # editable = Responses.update_action.request_from(ar).get_permission( # response) sar = Responses.update_action.request_from(ar) sar.selected_rows = [response] editable = sar.get_permission() # editable = insert.get_permission(response) kv = dict(response=response) insert = AnswerRemarks.insert_action.request_from(ar, known_values=kv) detail = AnswerRemarks.detail_action.request_from(ar) for answer in self.get_data_rows(ar): cells = [self.question.value_from_object(answer, ar)] for r in all_responses: if editable and r == response: insert.known_values.update(question=answer.question) detail.known_values.update(question=answer.question) items = [self.answer_buttons.value_from_object(answer, ar)] if answer.remark.remark: items += [E.br(), answer.remark.remark] if answer.remark.pk: items += [ ' ', detail.ar2button(answer.remark, _("Remark"), icon_name=None) ] # ar.obj2html(answer.remark, _("Remark"))] else: btn = insert.ar2button(answer.remark, _("Remark"), icon_name=None) # sar = RemarksByAnswer.request_from(ar, answer) # btn = sar.insert_button(_("Remark"), icon_name=None) items += [" (", btn, ")"] else: other_answer = AnswersByResponseRow(r, answer.question) items = [str(other_answer)] if other_answer.remark.remark: items += [E.br(), answer.remark.remark] cells.append(E.p(*items)) ht.add_body_row(*cells, **cellattrs) return ar.html_text(ht.as_element())
def get_change_info(self, ar, cw): yield E.p( gettext("Subject"), ': ', self.subject, E.br(), gettext("Client"), ': ', ar.obj2memo(self.project))
def get_table_summary(self, response, ar): """Presents this response as a table with one row per question and one column for each response of the same poll. The answers for this response are editable if this response is not registered. The answers of other responses are never editable. """ if response is None: return if response.poll_id is None: return AnswerRemarks = rt.models.polls.AnswerRemarksByAnswer all_responses = rt.models.polls.Response.objects.filter( poll=response.poll).order_by('date') if response.partner: all_responses = all_responses.filter(partner=response.partner) ht = xghtml.Table() ht.attrib.update(cellspacing="5px", bgcolor="#ffffff", width="100%") cellattrs = dict(align="left", valign="top", bgcolor="#eeeeee") headers = [str(_("Question"))] for r in all_responses: if r == response: headers.append(dd.fds(r.date)) else: headers.append(ar.obj2html(r, dd.fds(r.date))) ht.add_header_row(*headers, **cellattrs) ar.master_instance = response # must set it because # get_data_rows() needs it. # 20151211 # editable = Responses.update_action.request_from(ar).get_permission( # response) sar = Responses.update_action.request_from(ar) sar.selected_rows = [response] editable = sar.get_permission() # editable = insert.get_permission(response) kv = dict(response=response) insert = AnswerRemarks.insert_action.request_from( ar, known_values=kv) detail = AnswerRemarks.detail_action.request_from(ar) for answer in self.get_data_rows(ar): cells = [self.question.value_from_object(answer, ar)] for r in all_responses: if editable and r == response: insert.known_values.update(question=answer.question) detail.known_values.update(question=answer.question) items = [ self.answer_buttons.value_from_object(answer, ar)] if answer.remark.remark: items += [E.br(), answer.remark.remark] if answer.remark.pk: items += [ ' ', detail.ar2button( answer.remark, _("Remark"), icon_name=None)] # ar.obj2html(answer.remark, _("Remark"))] else: btn = insert.ar2button( answer.remark, _("Remark"), icon_name=None) # sar = RemarksByAnswer.request_from(ar, answer) # btn = sar.insert_button(_("Remark"), icon_name=None) items += [" (", btn, ")"] else: other_answer = AnswersByResponseRow(r, answer.question) items = [str(other_answer)] if other_answer.remark.remark: items += [E.br(), answer.remark.remark] cells.append(E.p(*items)) ht.add_body_row(*cells, **cellattrs) return ar.html_text(ht.as_element())
def navigation_panel(cls, obj, ar): day_view = bool(cls.navigation_mode == 'day') weekly_view = bool(cls.navigation_mode == 'week') month_view = bool(cls.navigation_mode == 'month') # todo ensure that the end of the month is always in the view. today = obj.date daily, weekly, monthly = make_link_funcs(ar) long_unit = DurationUnits.years if month_view else DurationUnits.months prev_month = Day(date2pk(long_unit.add_duration(today, -1))) next_month = Day(date2pk(long_unit.add_duration(today, 1))) next_unit = DurationUnits.weeks if weekly_view else DurationUnits.days if day_view else DurationUnits.months prev_view = Day(date2pk(next_unit.add_duration(today, -1))) next_view = Day(date2pk(next_unit.add_duration(today, 1))) # current_view = weekly if weekly_view else daily current_view = daily if not day_view: current_view = monthly if month_view else weekly elems = [] #cls.calender_header(ar) # Month div rows, cells = [], [] for i, month in enumerate(YearMonths.get_list_items()): # each week is a list of seven datetime.date objects. pk = date2pk( DurationUnits.months.add_duration( today, int(month.value) - today.month)) if today.month == int(month.value): if not month_view: cells.append(E.td(E.b(monthly(Day(pk), str(month))))) else: cells.append(E.td(E.b(str(month)))) else: cells.append(E.td(monthly(Day(pk), str(month)))) if (i + 1) % 3 == 0: rows.append(E.tr(*cells, align="center")) cells = [] monthly_div = E.div(E.table(*rows, align="center"), CLASS="cal-month-table") header = [ current_view(prev_month, "<<"), " ", current_view(prev_view, "<"), E.span( E.span("{} {}".format(monthname(today.month), today.year), E.br(), monthly_div)), current_view(next_view, ">"), " ", current_view(next_month, ">>") ] elems.append(E.h2(*header, align="center")) weekdaysFirstLetter = " " + "".join( [gettext(week.text)[0] for week in Weekdays.objects()]) rows = [ E.tr(*[ E.td(E.b(day_of_week)) for day_of_week in weekdaysFirstLetter ], align='center') ] 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] this_week = False for day in week: pk = date2pk(day) link = daily(Day(pk), str(day.day)) if day == dd.today(): link = E.b(link, CLASS="cal-nav-today") if day == today and day_view: cells.append(E.td(E.b(str(day.day)))) else: cells.append(E.td(link)) if day.isocalendar()[1] == today.isocalendar()[1]: this_week = True else: cells = [ E.td(E.b(str(current_week)) if this_week and weekly_view else weekly(Day(pk), str(current_week)), CLASS="cal-week") ] + cells rows.append(E.tr(*cells, align="center")) elems.append(E.table(*rows, align="center")) elems.append(E.p(daily(Day(), gettext("Today")), align="center")) elems.append(E.p(weekly(Day(), gettext("This week")), align="center")) elems.append(E.p(monthly(Day(), gettext("This month")), align="center")) # for o in range(-10, 10): # elems.append(ar.goto_pk(o, str(o))) # elems.append(" ") return E.div(*elems, CLASS="lino-nav-cal")
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByHuman`. """ if obj is None: return '' # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(obj), lnk.parent) else: i = (lnk.type.as_parent(obj), lnk.child) links.append(i) try: links.sort( key=lambda a: a[1].birth_date.as_date(), reverse=True) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass items = [] for type, other in links: items.append(E.li( str(type), gettext(" of "), obj.format_family_member(ar, other), " (%s)" % other.age )) elems = [] if len(items) > 0: elems += [gettext("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(gettext("No relationships.")) # Buttons for creating relationships: if self.insert_action is not None: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in self.addable_link_types: sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) #sar = ar.spawn(self, known_values=dict(type=lt, parent=obj)) btn = sar.ar2button(None, lt.as_parent(obj), icon_name=None) actions.append(btn) if not lt.symmetric: actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn = sar.ar2button(None, lt.as_child(obj), icon_name=None) actions.append(btn) actions.append(' ') if len(actions) > 0: elems += [E.br(), gettext("Create relationship as ")] + actions return E.div(*elems)
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByHuman`. """ if obj is None: return '' # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(obj), lnk.parent) else: i = (lnk.type.as_parent(obj), lnk.child) links.append(i) try: links.sort(key=lambda a: a[1].birth_date.as_date(), reverse=True) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass items = [] for type, other in links: items.append( E.li(str(type), gettext(" of "), obj.format_family_member(ar, other), " (%s)" % other.age)) elems = [] if len(items) > 0: elems += [gettext("%s is") % obj.first_name] elems.append(E.ul(*items)) else: elems.append(gettext("No relationships.")) # Buttons for creating relationships: if self.insert_action is not None: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in self.addable_link_types: sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) #sar = ar.spawn(self, known_values=dict(type=lt, parent=obj)) btn = sar.ar2button(None, lt.as_parent(obj), icon_name=None) actions.append(btn) if not lt.symmetric: actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn = sar.ar2button(None, lt.as_child(obj), icon_name=None) actions.append(btn) actions.append(' ') if len(actions) > 0: elems += [E.br(), gettext("Create relationship as ")] + actions return E.div(*elems)
def get_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByTicket`. """ # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(), lnk.parent) else: i = (lnk.type.as_parent(), lnk.child) links.append(i) def by_age(a): return a[1].modified try: links.sort(key=by_age) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass tbt = dict() # tickets by lnktype for lnktype, other in links: lst = tbt.setdefault(lnktype, []) # txt = "#%d" % other.id lst.append(other.obj2href(ar)) items = [] for lnktype, lst in tbt.items(): items.append(E.li(unicode(lnktype), ": ", *join_elems(lst, ', '))) elems = [] if len(items) > 0: # elems += join_elems(items) # elems.append(l(*items)) elems.append(E.ul(*items)) # else: # elems.append(_("No dependencies.")) # Buttons for creating relationships: sar = obj.spawn_triggered.request_from(ar) if ar.renderer.is_interactive and sar.get_permission(): btn = sar.ar2button(obj) elems += [E.br(), btn] if self.insert_action is not None and ar.renderer.is_interactive: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in LinkTypes.objects(): actions.append(E.br()) sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) btn = sar.ar2button(None, lt.as_parent(), icon_name=None) if not lt.symmetric: # actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn2 = sar.ar2button(None, lt.as_child(), icon_name=None) # actions.append(btn) btn = E.span(btn, '/', btn2) actions.append(btn) # actions.append(' ') # actions = join_elems(actions, E.br) if len(actions) > 0: elems += [E.br(), _("Create dependency as ")] + actions return E.div(*elems)
def 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_table_summary(self, obj, ar): """The :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for :class:`LinksByTicket`. """ # if obj.pk is None: # return '' # raise Exception("20150218") sar = self.request_from(ar, master_instance=obj) links = [] for lnk in sar: if lnk.parent is None or lnk.child is None: pass else: if lnk.child_id == obj.id: i = (lnk.type.as_child(), lnk.parent) else: i = (lnk.type.as_parent(), lnk.child) links.append(i) def by_age(a): return a[1].modified try: links.sort(key=by_age) # except AttributeError: except (AttributeError, ValueError): # AttributeError: 'str' object has no attribute 'as_date' # possible when empty birth_date # ValueError: day is out of range for month pass tbt = dict() # tickets by lnktype for lnktype, other in links: lst = tbt.setdefault(lnktype, []) # txt = "#%d" % other.id lst.append(other.obj2href(ar)) items = [] for lnktype, lst in tbt.items(): items.append(E.li(str(lnktype), ": ", *join_elems(lst, ', '))) elems = [] if len(items) > 0: # elems += join_elems(items) # elems.append(l(*items)) elems.append(E.ul(*items)) # else: # elems.append(_("No dependencies.")) # Buttons for creating relationships: sar = obj.spawn_triggered.request_from(ar) if ar.renderer.is_interactive and sar.get_permission(): btn = sar.ar2button(obj) elems += [E.br(), btn] if self.insert_action is not None and ar.renderer.is_interactive: sar = self.insert_action.request_from(ar) if sar.get_permission(): actions = [] for lt in LinkTypes.objects(): actions.append(E.br()) sar.known_values.update(type=lt, parent=obj) sar.known_values.pop('child', None) btn = sar.ar2button(None, lt.as_parent(), icon_name=None) if not lt.symmetric: # actions.append('/') sar.known_values.update(type=lt, child=obj) sar.known_values.pop('parent', None) btn2 = sar.ar2button(None, lt.as_child(), icon_name=None) # actions.append(btn) btn = E.span(btn, '/', btn2) actions.append(btn) # actions.append(' ') # actions = join_elems(actions, E.br) if len(actions) > 0: elems += [E.br(), _("Create dependency as ")] + actions return E.div(*elems)
def get_change_info(self, ar, cw): yield E.p( gettext("Subject"), ': ', self.subject, E.br(), gettext("Client"), ': ', ar.obj2memo(self.project))