Пример #1
0
 def get_table_summary(cls, mi, ar):
     if ar is None:
         return None
     items = []
     for obj in cls.get_request_queryset(ar):
         elems = []
         table_class = obj.get_doc_report()
         sar = table_class.request(master_instance=obj)
         # elems.append(str(sar.get_total_count()))
         # elems.append(" ")
         # elems.append(ar.href_to_request(sar, text=str(obj)))
         elems.append(
             ar.href_to_request(sar,
                                text="{} {}".format(sar.get_total_count(),
                                                    obj)))
         if True:
             sar = table_class.insert_action.request_from(
                 ar, master_instance=obj)
             # print(20170217, sar)
             sar.known_values.update(journal=obj)
             # txt = dd.babelattr(obj, 'printed_name')
             # btn = sar.ar2button(None, _("New {}").format(txt), icon_name=None)
             btn = sar.ar2button(
                 label="⊕",
                 icon_name=None)  # U+2295 Circled Plus Unicode Character.
             # btn = sar.ar2button()
             # btn.set("style", "padding-left:10px")
             btn.set("style", "text-decoration:none")
             elems.append(" ")
             elems.append(btn)
         else:
             elems.append(" / ")
             elems.append(obj.insert_voucher_button(ar))
         items.append(E.li(*elems))
     return E.ul(*items)
Пример #2
0
    def get_table_summary(self, obj, ar):
        # For every child, we want to display its relationship to
        # every parent of this household.
        sar = self.request(master_instance=obj)
        if sar.master_household is None:
            return E.div(str(ar.no_data_text))
        # obj is the Person for which we display the household

        def format_item(m):
            elems = [str(m.role), ': ']
            if m.person:
                elems += [obj.format_family_member(ar, m.person)]
                hl = self.find_links(ar, m.person, obj)
                if len(hl):
                    elems += [' ('] + hl + [')']
            else:
                elems += [obj.format_family_member(ar, m)]
            return elems
            
        items = []
        for m in sar.data_iterator:
            items.append(E.li(*format_item(m)))
        elems = []
        if len(items) > 0:
            elems = []
            elems.append(E.ul(*items))
        return E.div(*elems)
Пример #3
0
    def get_table_summary(cls, obj, ar):
        """Customized :meth:`summary view
        <lino.core.actors.Actor.get_table_summary>` for this table.

        """
        sar = cls.request_from(ar, master_instance=obj)
        html = []
        # items = [ar.obj2html(o, str(o.milestone)) for o in sar]
        qs = cls.model.objects.filter(ticket=obj)
        qs = dd.plugins.tickets.milestone_model.add_param_filter(
            qs, lookup_prefix='milestone__',
            # show_active=dd.YesNo.yes
            )
        items = E.ul()
        for o in qs:
            items.append(
                E.li(o.obj2href(ar, text=getattr(o.wish_type,'text', _("Wish"))), " in ", o.milestone.obj2href(ar), " : ", o.remark)
            )
        if len(items) > 0:
            html.append(tostring(items))
        # items = [o.milestone.obj2href(ar) for o in sar]
        sar = cls.insert_action.request_from(sar)
        if sar.get_permission():
            btn = sar.ar2button()
            html.append(btn)

        return ar.html_text(ar.parse_memo(tostring(html)))
Пример #4
0
 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)))
Пример #5
0
    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))
Пример #6
0
 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")
Пример #7
0
    def get_table_summary(self, obj, ar):
        if obj is None:
            return

        visible_polls = Poll.objects.filter(
            state__in=(PollStates.active, PollStates.closed)).order_by('ref')

        qs = Response.objects.filter(partner=obj).order_by('date')
        polls_responses = {}
        for resp in qs:
            polls_responses.setdefault(resp.poll.pk, []).append(resp)

        items = []
        for poll in visible_polls:
            iar = self.insert_action.request_from(ar,
                                                  obj,
                                                  known_values=dict(poll=poll))
            elems = [str(poll), ' : ']
            responses = polls_responses.get(poll.pk, [])
            elems += join_elems(
                [ar.obj2html(r, dd.fds(r.date)) for r in responses], sep=', ')
            if poll.state == PollStates.active:
                elems += [' ', iar.ar2button()]
                #elems += [' ', iar.insert_button()]
            items.append(E.li(*elems))
        return E.div(E.ul(*items))
Пример #8
0
    def get_table_summary(self, mi, ar):
        if ar is None:
            return ''
        sar = self.request_from(ar, master_instance=mi)

        def fmt(obj):
            return str(obj)

        elems = []
        for obj in sar:
            # if len(elems) > 0:
            #     elems.append(', ')

            lbl = fmt(obj)
            # if obj.state.button_text:
            #     lbl = "{0}{1}".format(lbl, obj.state.button_text)
            elems.append(ar.obj2html(obj, lbl))
        elems = join_elems(elems, sep=', ')
        toolbar = []
        ar2 = self.insert_action.request_from(sar)
        if ar2.get_permission():
            btn = ar2.ar2button()
            toolbar.append(btn)

        if len(toolbar):
            toolbar = join_elems(toolbar, sep=' ')
            elems.append(E.p(*toolbar))

        return ar.html_text(E.div(*elems))
Пример #9
0
 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")
Пример #10
0
    def build_confirmation_message(self):
        self.analyze()
        items = []

        def collect_summary(prefix, fk_qs):
            parts = []
            for fld, qs in fk_qs:
                if qs.count() > 0:
                    parts.append(
                        "%d %s" % (
                            qs.count(), str(
                                fld.model._meta.verbose_name_plural)))
            if len(parts) != 0:
                items.append(E.li(', '.join(parts), ' ', E.b(prefix)))

        collect_summary(ugettext("will be deleted."), self.volatiles)
        collect_summary(ugettext("will get reassigned."),
                        self.related + self.generic_related)
        items.append(E.li(ugettext("%s will be deleted") % self.obj))
        msg = ugettext("Are you sure you want to merge "
                "%(this)s into %(merge_to)s?") % dict(
                    this=self.obj, merge_to=self.merge_to)
        if len(items) != 0:
            return rt.html_text(E.div(E.p(msg), E.ul(*items)))
        return msg
Пример #11
0
 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)))
Пример #12
0
    def get_table_summary(self, obj, ar):
        if obj is None:
            return

        visible_polls = Poll.objects.filter(state__in=(
            PollStates.active, PollStates.closed)).order_by('ref')

        qs = Response.objects.filter(partner=obj).order_by('date')
        polls_responses = {}
        for resp in qs:
            polls_responses.setdefault(resp.poll.pk, []).append(resp)

        items = []
        for poll in visible_polls:
            iar = self.insert_action.request_from(
                ar, obj, known_values=dict(poll=poll))
            elems = [str(poll), ' : ']
            responses = polls_responses.get(poll.pk, [])
            elems += join_elems(
                [ar.obj2html(r, dd.fds(r.date))
                 for r in responses], sep=', ')
            if poll.state == PollStates.active:
                elems += [' ', iar.ar2button()]
                #elems += [' ', iar.insert_button()]
            items.append(E.li(*elems))
        return E.div(E.ul(*items))
Пример #13
0
    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)
Пример #14
0
Файл: ui.py Проект: khchine5/xl
    def get_table_summary(self, master, ar):
        # master is None when called on a master table.
        if master is None:
            sar = ar
        else:
            sar = self.request_from(ar, master_instance=master)
            
        # every element of `items` is a tuple `(state,
        # list-of-objects)`.  in ar are ordered by state. we just group
        # them 
        items = []
        ci = None
            
        for obj in sar:  # self.get_request_queryset(ar):
            btn = obj.obj2href(ar)
            if ci is not None and ci[0] is obj.state:
                ci[1].append(btn)
            else:
                ci = (obj.state, [btn])
                items.append(ci)

        # now render them as a UL containing on LI per item
        items = [E.li(str(i[0]), ' : ', *join_elems(i[1], ", "))
                 for i in items]

        return E.ul(*items)
Пример #15
0
    def get_table_summary(cls, obj, ar):
        """Customized :meth:`summary view
        <lino.core.actors.Actor.get_table_summary>` for this table.

        """
        sar = cls.request_from(ar, master_instance=obj)
        html = []
        # items = [ar.obj2html(o, str(o.milestone)) for o in sar]
        qs = cls.model.objects.filter(ticket=obj)
        qs = dd.plugins.tickets.milestone_model.add_param_filter(
            qs,
            lookup_prefix='milestone__',
            # show_active=dd.YesNo.yes
        )
        items = E.ul()
        for o in qs:
            items.append(
                E.li(
                    o.obj2href(ar,
                               text=getattr(o.wish_type, 'text', _("Wish"))),
                    " in ", o.milestone.obj2href(ar), " : ", o.remark))
        if len(items) > 0:
            html.append(tostring(items))
        # items = [o.milestone.obj2href(ar) for o in sar]
        sar = cls.insert_action.request_from(sar)
        if sar.get_permission():
            btn = sar.ar2button()
            html.append(btn)

        return ar.html_text(ar.parse_memo(tostring(html)))
Пример #16
0
    def get_table_summary(self, obj, ar):
        # For every child, we want to display its relationship to
        # every parent of this household.
        sar = self.request(master_instance=obj)
        if sar.master_household is None:
            return E.div(str(ar.no_data_text))
        # obj is the Person for which we display the household

        def format_item(m):
            elems = [str(m.role), ': ']
            if m.person:
                elems += [obj.format_family_member(ar, m.person)]
                hl = self.find_links(ar, m.person, obj)
                if len(hl):
                    elems += [' ('] + hl + [')']
            else:
                elems += [obj.format_family_member(ar, m)]
            return elems

        items = []
        for m in sar.data_iterator:
            items.append(E.li(*format_item(m)))
        elems = []
        if len(items) > 0:
            elems = []
            elems.append(E.ul(*items))
        return E.div(*elems)
Пример #17
0
    def get_table_summary(cls, obj, ar, max_num=10, **context):

        context = ar.get_printable_context(**context)
        qs = rt.models.blogs.Entry.objects.filter(pub_date__isnull=False)
        qs = qs.order_by("-pub_date")
        render = dd.plugins.jinja.render_jinja
        elems = []
        for num, e in enumerate(qs):
            if num >= max_num:
                break
            context.update(obj=e)
            # s = render(ar, 'blogs/entry.html', context)
            elems.append(E.h2(e.title or str(e), " ", e.obj2href(
                ar, u"⏏", **{'style': "text-decoration:none"})))
            # s = ar.parse_memo(e.short_preview)
            s = e.short_preview
            tree = etree.parse(StringIO(s), html_parser)
            # elems.extend(tree.iter())
            # elems.append(tree.iter().next())
            elems.append(tree.getroot())
            elems.append(E.p(
                _("{} by {}").format(dd.fdf(e.pub_date), e.user)))
            # elems.append(E.p(
            #     _("{} by {}").format(dd.fdf(e.pub_date), e.user),
            #     " ", e.obj2href(ar, "(edit)")))

        return E.div(*elems)
Пример #18
0
    def get_table_summary(self, mi, ar):
        if ar is None:
            return ''
        sar = self.request_from(ar, master_instance=mi)

        def fmt(obj):
            return str(obj)

        elems = []
        for obj in sar:
            # if len(elems) > 0:
            #     elems.append(', ')

            lbl = fmt(obj)
            # if obj.state.button_text:
            #     lbl = "{0}{1}".format(lbl, obj.state.button_text)
            elems.append(ar.obj2html(obj, lbl))
        elems = join_elems(elems, sep=', ')
        toolbar = []
        ar2 = self.insert_action.request_from(sar)
        if ar2.get_permission():
            btn = ar2.ar2button()
            toolbar.append(btn)

        if len(toolbar):
            toolbar = join_elems(toolbar, sep=' ')
            elems.append(E.p(*toolbar))

        return ar.html_text(E.div(*elems))
Пример #19
0
    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)
Пример #20
0
    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)
Пример #21
0
 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
Пример #22
0
    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)
Пример #23
0
 def get_sidebar_item(self, request, other):
     kw = dict()
     add_user_language(kw, request)
     url = self.get_absolute_url(**kw)
     a = E.a(self.get_sidebar_caption(), href=url)
     if self == other:
         return E.li(a, **{'class': 'active'})
     return E.li(a)
Пример #24
0
 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)
Пример #25
0
 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)
Пример #26
0
 def get_sidebar_item(self, request, other):
     kw = dict()
     add_user_language(kw, request)
     url = self.get_absolute_url(**kw)
     a = E.a(self.get_sidebar_caption(), href=url)
     if self == other:
         return E.li(a, **{'class':'active'})
     return E.li(a)
Пример #27
0
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
Пример #28
0
 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)))
Пример #29
0
        def f(obj, ar):
            if obj is None or ar is None:
                return E.div()
            try:
                utype = UploadType.objects.get(shortcut=i)
            except UploadType.DoesNotExist:
                return E.div()
            items = []
            target = sender.modules.resolve(i.target)
            sar = ar.spawn_request(actor=target,
                                   master_instance=obj,
                                   known_values=dict(type=utype))
            # param_values=dict(pupload_type=et))
            n = sar.get_total_count()
            if n == 0:
                iar = target.insert_action.request_from(sar,
                                                        master_instance=obj)
                btn = iar.ar2button(
                    None,
                    _("Upload"),
                    icon_name="page_add",
                    title=_("Upload a file from your PC to the server."))
                items.append(btn)
            elif n == 1:
                after_show = ar.get_status()
                obj = sar.data_iterator[0]
                items.append(
                    sar.renderer.href_button(
                        sender.build_media_url(obj.file.name),
                        _("show"),
                        target='_blank',
                        icon_name='page_go',
                        style="vertical-align:-30%;",
                        title=_("Open the uploaded file in a "
                                "new browser window")))
                after_show.update(record_id=obj.pk)
                items.append(
                    sar.window_action_button(
                        sar.ah.actor.detail_action,
                        after_show,
                        _("Edit"),
                        icon_name='application_form',
                        title=_("Edit metadata of the uploaded file.")))
            else:
                obj = sar.sliced_data_iterator[0]
                items.append(
                    ar.obj2html(obj, pgettext("uploaded file", "Last")))

                btn = sar.renderer.action_button(obj,
                                                 sar,
                                                 sar.bound_action,
                                                 _("All {0} files").format(n),
                                                 icon_name=None)
                items.append(btn)

            return E.div(*join_elems(items, ', '))
Пример #30
0
 def colored_calendar_fmt(self, pv):
     ele = E.span(self.calendar_fmt(pv))
     data_color = self.get_diplay_color()
     if data_color:
         dot = E.span(u"\u00A0", CLASS="dot")
         # ele.attrib['style'] = "color: white;background-color: {};".format(data_color)
         dot.attrib['style'] = "background-color: {};".format(data_color)
         return E.div(*[dot, ele])
     else:
         return E.div(*[ele])
Пример #31
0
 def fmt(obj):
     s = tostring(ar.action_button(ba, obj))
     s += fds(obj.created) + " " + obj.created.strftime(
         settings.SITE.time_format_strftime) + " "
     if obj.body:
         s += ar.parse_memo(obj.body)
     else:
         s += ar.parse_memo(obj.subject)
     e = etree.parse(StringIO(s), html_parser)
     return E.li(E.div(*e.iter()))
Пример #32
0
 def fmt(obj):
     s = tostring(ar.action_button(ba, obj))
     s += fds(obj.created) + " " + obj.created.strftime(
         settings.SITE.time_format_strftime) + " "
     if obj.body:
         s += ar.parse_memo(obj.body)
     else:
         s += ar.parse_memo(obj.subject)
     e = etree.parse(StringIO(s), html_parser)
     return E.li(E.div(*e.iter()))
Пример #33
0
Файл: ui.py Проект: khchine5/xl
 def to_html(self, ar):
     self.analyze_view()
     get_rnd = rt.models.cal.EventGenerator.get_cal_entry_renderer
     if self.mode == TABLE_MODE:
         sep = ' '
         fmt = get_rnd(day_and_weekday)
     elif self.mode == UL_MODE:
         sep = ' '
         fmt = get_rnd(day_and_weekday)
     elif self.mode == PLAIN_MODE:
         sep = ', '
         fmt = get_rnd(dd.fds)
         
     def xxx(list_of_entries):
         elems = []
         for e in list_of_entries:
             if len(elems):
                 elems.append(sep)
             elems.extend(fmt(e, ar))
         return elems
     
     if self.mode == TABLE_MODE:
         rows = []
         cells = [E.th("")] + [E.th(monthname(m+1)) for m in range(12)]
         # print(''.join([tostring(c) for c in cells]))
         rows.append(E.tr(*cells))
         for y in self.years.values():
             cells = [E.td(str(y.year), width="4%")]
             for m in y.months:
                 # every m is a list of etree elems
                 cells.append(E.td(*xxx(m), width="8%", **ar.renderer.cellattrs))
             # print(str(y.year) +":" + ''.join([tostring(c) for c in cells]))
             rows.append(E.tr(*cells))
         return E.table(*rows, **ar.renderer.tableattrs)
     
     if self.mode == UL_MODE:
         items = []
         for y in self.years.values():
             for m, lst in enumerate(y.months):
                 if len(lst):
                     items.append(E.li(
                         monthname(m+1), " ", str(y.year), ": ", *xxx(lst)))
         return E.ul(*items)
     
     if self.mode == PLAIN_MODE:
         elems = []
         for y in self.years.values():
             for lst in y.months:
                 if len(lst):
                     if len(elems):
                         elems.append(sep)
                     elems.extend(xxx(lst))
         return E.p(*elems)
     
     raise Exception("20180720")
Пример #34
0
 def table2xhtml(self, header_level=None, **kw):
     """
     Return an HTML representation of this table request.
     """
     t = xghtml.Table()
     self.dump2html(t, self.sliced_data_iterator, **kw)
     e = t.as_element()
     # print "20150822 table2xhtml", tostring(e)
     if header_level is not None:
         return E.div(E.h2(str(self.actor.label)), e)
     return e
Пример #35
0
 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)
Пример #36
0
 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
Пример #37
0
    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))
Пример #38
0
 def calender_header(ar):
     header = "Calendar Type"
     elems = [E.h2(*header, align="center")]
     today_url = ar.renderer.js2url("""
             Lino.cal.DailyView.detail.run(null, {"record_id": 0})
             """)
     week_url = ar.renderer.js2url("""
                     Lino.cal.WeeklyView.detail.run(null, {"record_id": 0})
                     """)
     elems.append(E.p(ar.renderer.href(today_url, gettext("Day")), align="center"))
     elems.append(E.p(ar.renderer.href(week_url, gettext("Week")), align="center"))
     elems.append(E.p(ar.goto_pk(0, gettext("This month")), align="center"))
     return elems
Пример #39
0
    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)
Пример #40
0
        def f(obj, ar):
            if obj is None or ar is None:
                return E.div()
            try:
                utype = UploadType.objects.get(shortcut=i)
            except UploadType.DoesNotExist:
                return E.div()
            items = []
            target = sender.modules.resolve(i.target)
            sar = ar.spawn_request(
                actor=target,
                master_instance=obj,
                known_values=dict(type=utype))
                # param_values=dict(pupload_type=et))
            n = sar.get_total_count()
            if n == 0:
                iar = target.insert_action.request_from(
                    sar, master_instance=obj)
                btn = iar.ar2button(
                    None, _("Upload"), icon_name="page_add",
                    title=_("Upload a file from your PC to the server."))
                items.append(btn)
            elif n == 1:
                after_show = ar.get_status()
                obj = sar.data_iterator[0]
                items.append(sar.renderer.href_button(
                    sender.build_media_url(obj.file.name),
                    _("show"),
                    target='_blank',
                    icon_name='page_go',
                    style="vertical-align:-30%;",
                    title=_("Open the uploaded file in a "
                            "new browser window")))
                after_show.update(record_id=obj.pk)
                items.append(sar.window_action_button(
                    sar.ah.actor.detail_action,
                    after_show,
                    _("Edit"), icon_name='application_form',
                    title=_("Edit metadata of the uploaded file.")))
            else:
                obj = sar.sliced_data_iterator[0]
                items.append(ar.obj2html(
                    obj, pgettext("uploaded file", "Last")))

                btn = sar.renderer.action_button(
                    obj, sar, sar.bound_action,
                    _("All {0} files").format(n),
                    icon_name=None)
                items.append(btn)

            return E.div(*join_elems(items, ', '))
Пример #41
0
 def weeklyNavigation(cls, obj, ar):
     today = obj.date
     prev = cls.date2pk(DurationUnits.months.add_duration(today, -1))
     next = cls.date2pk(DurationUnits.months.add_duration(today, 1))
     elems = cls.calender_header(ar)
     header = [
         ar.goto_pk(prev, "<<"), " ",
         "{} {}".format(monthname(today.month), today.year),
         " ", ar.goto_pk(next, ">>")]
     elems.append(E.h2(*header, align="center"))
     rows = []
     for week in CALENDAR.monthdatescalendar(today.year, today.month):
         # each week is a list of seven datetime.date objects.
         cells = []
         current_week = week[0].isocalendar()[1]
         cells.append(E.td(str(current_week)))
         for day in week:
             pk = cls.date2pk(day)
             if day.isocalendar()[1] == today.isocalendar()[1]:
                 cells.append(E.td(str(day.day)))
             else:
                 cells.append(E.td(ar.goto_pk(pk, str(day.day))))
         rows.append(E.tr(*cells, align="center"))
     elems.append(E.table(*rows, align="center"))
     elems.append(E.p(ar.goto_pk(0, gettext("This week")), align="center"))
     # for o in range(-10, 10):
     #     elems.append(ar.goto_pk(o, str(o)))
     #     elems.append(" ")
     return E.div(*elems)
Пример #42
0
    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))
Пример #43
0
    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))
Пример #44
0
def get_calendar_summary(cls, obj, ar):
    # print("20181121 get_calendar_summary", cls)
    # note that objects can be either Event or Guest. if the view
    # is called for Guest, we waht to display the guest states
    # (not the event states). But when user clicks on a date they
    # want to show the event even when we are calling from Guest.
    if ar is None or obj is None:
        return ''
    state_coll = {}
    cal = CalendarRenderer(cls.model)
    # sar = ar.spawn(parent=ar, master_instance=obj)
    # sar = ar.actor.request(parent=ar, master_instance=obj)
    sar = cls.request_from(ar, master_instance=obj)
    # sar = cls.request(parent=ar, master_instance=obj)
    # print("20181121 {}".format(ar.actor))
    # print("20181121 {}".format(cls.get_filter_kw(sar)))
    # print("20181121 {}".format(len(list(sar))))
    for obj in sar:
        if obj.state in state_coll:
            state_coll[obj.state] += 1
        else:
            state_coll[obj.state] = 1
        cal.collect(obj)

    elems = [cal.to_html(ar)]
    # choicelist = EntryStates
    choicelist = cls.workflow_state_field.choicelist
    ul = []
    for st in choicelist.get_list_items():
        ul.append(_("{} : {}").format(st, state_coll.get(st, 0)))
    toolbar = []
    toolbar += join_elems(ul, sep=', ')
    # elems = join_elems(ul, sep=E.br)
    if isinstance(obj, rt.models.cal.EventGenerator):
        ar1 = obj.do_update_events.request_from(sar)
        if ar1.get_permission():
            btn = ar1.ar2button(obj)
            toolbar.append(btn)

    ar2 = cls.insert_action.request_from(sar)
    if ar2.get_permission():
        btn = ar2.ar2button()
        toolbar.append(btn)

    if len(toolbar):
        toolbar = join_elems(toolbar, sep=' ')
        elems.append(E.p(*toolbar))

    return ar.html_text(E.div(*elems))
Пример #45
0
def get_calendar_summary(cls, obj, ar):
    # print("20181121 get_calendar_summary", cls)
    # note that objects can be either Event or Guest. if the view
    # is called for Guest, we waht to display the guest states
    # (not the event states). But when user clicks on a date they
    # want to show the event even when we are calling from Guest.
    if ar is None or obj is None:
        return ''
    state_coll = {}
    cal = CalendarRenderer(cls.model)
    # sar = ar.spawn(parent=ar, master_instance=obj)
    # sar = ar.actor.request(parent=ar, master_instance=obj)
    sar = cls.request_from(ar, master_instance=obj)
    # sar = cls.request(parent=ar, master_instance=obj)
    # print("20181121 {}".format(ar.actor))
    # print("20181121 {}".format(cls.get_filter_kw(sar)))
    # print("20181121 {}".format(len(list(sar))))
    for obj in sar:
        if obj.state in state_coll:
            state_coll[obj.state] += 1
        else:
            state_coll[obj.state] = 1
        cal.collect(obj)

    elems = [cal.to_html(ar)]
    # choicelist = EntryStates
    choicelist = cls.workflow_state_field.choicelist
    ul = []
    for st in choicelist.get_list_items():
        ul.append(_("{} : {}").format(st, state_coll.get(st, 0)))
    toolbar = []
    toolbar += join_elems(ul, sep=', ')
    # elems = join_elems(ul, sep=E.br)
    if isinstance(obj, rt.models.cal.EventGenerator):
        ar1 = obj.do_update_events.request_from(sar)
        if ar1.get_permission():
            btn = ar1.ar2button(obj)
            toolbar.append(btn)

    ar2 = cls.insert_action.request_from(sar)
    if ar2.get_permission():
        btn = ar2.ar2button()
        toolbar.append(btn)

    if len(toolbar):
        toolbar = join_elems(toolbar, sep=' ')
        elems.append(E.p(*toolbar))

    return ar.html_text(E.div(*elems))
Пример #46
0
    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))
Пример #47
0
    def get_sidebar_html(self, request):
        items = []
        #~ loop over top-level nodes
        for n in Page.objects.filter(parent__isnull=True).order_by('seqno'):
            #~ items += [li for li in n.get_sidebar_items(request,self)]
            items.append(n.get_sidebar_item(request, self))
            if self.is_parented(n):
                children = []
                for ch in n.children.order_by('seqno'):
                    children.append(ch.get_sidebar_item(request, self))
                if len(children):
                    items.append(E.ul(*children, **{'class':'nav nav-list'}))

        e = E.ul(*items, **{'class':'nav nav-list'})
        return tostring_pretty(e)
Пример #48
0
    def get_sidebar_html(self, request):
        items = []
        #~ loop over top-level nodes
        for n in Page.objects.filter(parent__isnull=True).order_by('seqno'):
            #~ items += [li for li in n.get_sidebar_items(request,self)]
            items.append(n.get_sidebar_item(request, self))
            if self.is_parented(n):
                children = []
                for ch in n.children.order_by('seqno'):
                    children.append(ch.get_sidebar_item(request, self))
                if len(children):
                    items.append(E.ul(*children, **{'class': 'nav nav-list'}))

        e = E.ul(*items, **{'class': 'nav nav-list'})
        return tostring_pretty(e)
Пример #49
0
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
Пример #50
0
 def func(fld, obj, ar):
     # obj is a Plannable instance
     qs = Event.objects.all()
     qs = Event.calendar_param_filter(qs, ar.param_values)
     delta_days = int(ar.rqdata.get('mk', 0)
                      or 0) if ar.rqdata else ar.master_instance.pk
     # current_day = dd.today() + timedelta(days=delta_days)
     current_day = dd.today(delta_days)
     current_week_day = current_day + \
         timedelta(days=int(week_day.value) - current_day.weekday() - 1)
     qs = qs.filter(start_date=current_week_day)
     qs = qs.order_by('start_time')
     chunks = obj.get_weekly_chunks(ar, qs, current_week_day)
     return E.table(E.tr(E.td(E.div(*join_elems(chunks)))),
                    CLASS="fixed-table")
Пример #51
0
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
Пример #52
0
 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))
Пример #53
0
    def get_table_summary(cls, mi, ar):
        qs = rt.models.notify.Message.objects.filter(
            user=ar.get_user()).order_by(cls.created_order)
        qs = qs.filter(seen__isnull=True)
        # mark_all = rt.models.notify.MyMessages.get_action_by_name(
        #     'mark_all_seen')
        # html = tostring(ar.action_button(mark_all, None))
        # TODO: make action_button() work with list actions
        # html = ''
        ba = rt.models.notify.MyMessages.get_action_by_name('mark_seen')

        def fmt(obj):
            s = tostring(ar.action_button(ba, obj))
            s += fds(obj.created) + " " + obj.created.strftime(
                settings.SITE.time_format_strftime) + " "
            if obj.body:
                s += ar.parse_memo(obj.body)
            else:
                s += ar.parse_memo(obj.subject)
            e = etree.parse(StringIO(s), html_parser)
            return E.li(E.div(*e.iter()))
            # s += obj.body
            # return "<li>{}</li>".format(s)

        items = []
        for obj in qs:
            items.append(fmt(obj))
        return E.ul(*items)
Пример #54
0
 def get_story(cls, self, ar):
     for topic in rt.models.courses.Topic.objects.all():
         sar = ar.spawn(
             rt.models.courses.CoursesByTopic, master_instance=topic)
         if sar.get_total_count():
             yield E.h3(str(topic))
             yield sar
Пример #55
0
Файл: ui.py Проект: khchine5/xl
 def get_story(cls, self, ar):
     pv = ar.param_values
     cls.check_params(pv)
     # if not pv.start_period:
     #     yield E.p(gettext("Select at least a start period"))
     #     return
     bpv = dict(start_period=pv.start_period, end_period=pv.end_period)
     balances = []
     if pv.with_general:
         balances.append(GeneralAccountBalances.request(
             param_values=bpv))
     for tt in TradeTypes.get_list_items():
         k = 'with_'+tt.name
         if pv[k]:
             balances.append(
                 PartnerBalancesByTradeType.request(
                     master_instance=tt, param_values=bpv))
     # if pv.with_sales:
     #     balances.append(CustomerAccountsBalance)
     # if pv.with_purchases:
     #     balances.append(SupplierAccountsBalance)
     if pv.with_balances:
         for sar in balances:
             yield E.h1(str(sar.get_title()))
             yield sar
Пример #56
0
 def print_actions(self, ar):
     if ar is None:
         return ''
     elems = []
     elems.append(ar.instance_action_button(
         self.write_xml))
     return E.p(*join_elems(elems, sep=", "))
Пример #57
0
 def get_file_button(self, text=None):
     if text is None:
         text = str(self)
     if self.file.name:
         url = settings.SITE.build_media_url(self.file.name)
         return E.a(text, href=url, target="_blank")
     return text
Пример #58
0
 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
Пример #59
0
        def suppliers(self, ar):
            """Displays a list of candidate suppliers.

            This means: all suppliers who have at least one of the
            skills required by this object.

            """
            if ar is None:
                return ''

            if not isinstance(self, dd.plugins.skills.demander_model):
                return ''
            
            Offer = rt.models.skills.Competence
            Demand = rt.models.skills.Demand
            skills = set()
            for dem in Demand.objects.filter(demander=self):
                skills.add(dem.skill)
                # skills |= set(dem.skill.get_parental_line())

            elems = []
            for spl in Offer.objects.filter(faculty__in=skills):
                if spl.end_user is not None:
                    elems.append(spl.end_user.obj2href(ar))
            elems = join_elems(elems, ', ')
            return E.p(*elems)
Пример #60
0
    def get_table_summary(self, obj, ar):
        items = []

        def add(title, flt):
            links = []
            sar = self.request(master_instance=obj, filter=flt)
            # logger.info("20141009 %s", sar.data_iterator.query)
            n = sar.get_total_count()
            if n:
                for i, ex in enumerate(sar):
                    txt = self.format_excerpt(ex)
                    if ex.build_time is not None:
                        txt += " (%s)" % naturaltime(ex.build_time)
                    links.append(ar.obj2html(ex, txt))
                    if i >= self.MORE_LIMIT:
                        # links.append(ar.href_to_request(sar, _("more")))
                        links.append('...')
                        break

                items.append(E.li(title, " : ", *join_elems(links, sep=', ')))

        # qs = sar.data_iterator
        Q = models.Q
        add(gettext("not printed"), Q(build_time__isnull=True))
        add(gettext("Today"), Q(build_time__gte=dd.today() - ONE_DAY))
        t7 = dd.today() - ONE_WEEK
        add(gettext("Last week"),
            Q(build_time__lte=dd.today(), build_time__gte=t7))
        add(gettext("Older"), Q(build_time__lt=t7))
        return E.ul(*items)