Ejemplo n.º 1
0
    def get_slave_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(ar.no_data_text)
        # obj is the Person for which we display the household

        def format_item(m):
            elems = [unicode(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)
Ejemplo n.º 2
0
    def get_slave_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(ar.no_data_text)
        # obj is the Person for which we display the household

        def format_item(m):
            elems = [unicode(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)
Ejemplo n.º 3
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(dd.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, ', '))
Ejemplo n.º 4
0
def table2html(ar, as_main=True):
    """This is not a docstring."""
    as_main = True
    t = xghtml.Table()
    t.attrib.update(class_="table table-striped table-hover")
    if ar.limit is None:
        ar.limit = PLAIN_PAGE_LENGTH
    pglen = ar.limit
    if ar.offset is None:
        page = 1
    else:
        """
        (assuming pglen is 5)
        offset page
        0      1
        5      2
        """
        page = int(ar.offset / pglen) + 1

    ar.dump2html(t, ar.sliced_data_iterator)
    if not as_main:
        url = ar.get_request_url()  # open in own window
        return E.div(E.a(ar.get_title(), href=url), t.as_element())

    buttons = []
    kw = dict()
    kw = {}
    if pglen != PLAIN_PAGE_LENGTH:
        kw[constants.URL_PARAM_LIMIT] = pglen

    if page > 1:
        kw[constants.URL_PARAM_START] = pglen * (page - 2)
        prev_url = ar.get_request_url(**kw)
        kw[constants.URL_PARAM_START] = 0
        first_url = ar.get_request_url(**kw)
    else:
        prev_url = None
        first_url = None
    buttons.append(('<<', _("First page"), first_url))
    buttons.append(('<', _("Previous page"), prev_url))

    next_start = pglen * page
    if next_start < ar.get_total_count():
        kw[constants.URL_PARAM_START] = next_start
        next_url = ar.get_request_url(**kw)
        last_page = int((ar.get_total_count() - 1) / pglen)
        kw[constants.URL_PARAM_START] = pglen * last_page
        last_url = ar.get_request_url(**kw)
    else:
        next_url = None
        last_url = None
    buttons.append(('>', _("Next page"), next_url))
    buttons.append(('>>', _("Last page"), last_url))

    return E.div(buttons2pager(buttons), t.as_element())
Ejemplo n.º 5
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(
                    dd.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, ', '))
Ejemplo n.º 6
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(_("will be deleted."), self.volatiles)
        collect_summary(_("will get reassigned."),
                        self.related + self.generic_related)
        items.append(E.li(_("%s will be deleted") % self.obj))
        msg = _("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 E.div(E.p(msg), E.ul(*items), class_="htmlText")
            return rt.html_text(E.div(E.p(msg), E.ul(*items)))
        return msg
Ejemplo n.º 7
0
Archivo: ui.py Proyecto: TonisPiip/cosi
    def get_slave_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, VatDocument):
                vtypes.append(vt)

        actions = []

        if not ar.get_user().profile.readonly:
            for vt in vtypes:
                for jnl in vt.get_journals():
                    sar = vt.table_class.insert_action.request_from(
                        ar, master_instance=jnl,
                        known_values=dict(partner=obj))
                    btn = sar.ar2button(label=unicode(jnl), icon_name=None)
                    if len(actions):
                        actions.append(', ')
                    actions.append(btn)

        elems += [E.br(), _("Create voucher in journal"), " "] + actions
        return E.div(*elems)
Ejemplo n.º 8
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(_("will be deleted."), self.volatiles)
        collect_summary(_("will get reassigned."),
                        self.related + self.generic_related)
        items.append(E.li(_("%s will be deleted") % self.obj))
        msg = _("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 E.div(E.p(msg), E.ul(*items), class_="htmlText")
            return rt.html_text(E.div(E.p(msg), E.ul(*items)))
        return msg
Ejemplo n.º 9
0
    def about_html(cls):

        body = []

        body.append(settings.SITE.welcome_html())

        #~ print "20121112 startup_time", settings.SITE.startup_time.date()
        def dtfmt(dt):
            if isinstance(dt, float):
                dt = datetime.datetime.fromtimestamp(dt)
                #~ raise ValueError("Expected float, go %r" % dt)
            return unicode(_("%(date)s at %(time)s")) % dict(
                date=dd.fdf(dt.date()),
                time=dt.time())

        items = []
        times = []
        value = settings.SITE.startup_time
        label = _("Server uptime")
        body.append(E.p(unicode(label), ' : ', E.b(dtfmt(value))))
        body.append(E.p(unicode(_("Source timestamps:"))))
        for src in ("lino", "lino_welfare", 'django', 'atelier'):
            label = src
            value = codetime('%s.*' % src)
            if value is not None:
                times.append((label, value))

        def mycmp(a, b):
            return cmp(b[1], a[1])
        times.sort(mycmp)
        for label, value in times:
            items.append(E.li(unicode(label), ' : ', E.b(dtfmt(value))))
        body.append(E.ul(*items))
        return E.div(*body, class_='htmlText')
Ejemplo n.º 10
0
    def get_slave_summary(self, obj, ar):
        vtypes = set()
        for m in dd.models_by_base(vat.VatDocument):
            vtypes.add(
                VoucherTypes.get_by_value(dd.full_model_name(m)))

        elems = []
        actions = []

        def add_action(btn):
            if btn is None:
                return False
            actions.append(btn)
            return True

        for jnl in Journal.objects.filter(voucher_type__in=vtypes):
            sar = ar.spawn(
                InvoicesByJournal,
                master_instance=jnl,
                known_values=dict(partner=obj))
            # logger.info(
            #     "20140604 sar.requesting_panel %s",
            #     sar.requesting_panel)
            if add_action(sar.insert_button(unicode(jnl), icon_name=None)):
                actions.append(' ')

        elems += [E.br(), _("Create voucher in journal ")] + actions
        return E.div(*elems)
Ejemplo n.º 11
0
    def get_notify_message(self, ar, cw):
        """Returns the text of the notification message to emit.

        The default implementation returns a message of style
        "{object} has been modified by {user}" followed by a summary
        of the changes.  

        Application code can override this. Returning None or an empty
        string means to suppress notification.

        """
        if cw is None:
            return
        items = list(cw.get_updates_html())
        if len(items) == 0:
            return
        elems = [E.p(
            ar.obj2html(self),
            ' ', _("has been modified by {user}").format(
                user=ar.get_user()),
            ":")]
        elems.append(E.ul(*items))
        if False:
            elems.append(E.p(_(
                "Subsequent changes to {obj} will not be notified "
                "until you visit {url} and mark this notification "
                "as seen.").format(
                url=settings.SITE.server_url or "Lino",
                obj=self.get_notify_owner(ar))))
        return E.tostring(E.div(*elems))
Ejemplo n.º 12
0
    def get_change_body(self, ar, cw):
        """Returns the text of the notification message to emit.

        The default implementation returns a message of style
        "{object} has been modified by {user}" followed by a summary
        of the changes.  

        Application code can override this. Returning None or an empty
        string means to suppress notification.

        """
        if cw is None:
            elems = [
                E.p(ar.obj2memo(self), ' ',
                    _("has been created by {user}").format(user=ar.get_user()))
            ]
        else:
            items = list(cw.get_updates_html())
            if len(items) == 0:
                return
            elems = [
                E.p(
                    ar.obj2memo(self), ' ',
                    _("has been modified by {user}").format(
                        user=ar.get_user()), ":")
            ]
            elems.append(E.ul(*items))
        return E.tostring(E.div(*elems))
Ejemplo n.º 13
0
Archivo: ui.py Proyecto: khchine5/cosi
    def get_slave_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, VatDocument):
                vtypes.append(vt)

        actions = []

        if not ar.get_user().profile.readonly:
            for vt in vtypes:
                for jnl in vt.get_journals():
                    sar = vt.table_class.insert_action.request_from(
                        ar, master_instance=jnl,
                        known_values=dict(partner=obj))
                    btn = sar.ar2button(label=unicode(jnl), icon_name=None)
                    if len(actions):
                        actions.append(', ')
                    actions.append(btn)

        elems += [E.br(), _("Create voucher in journal"), " "] + actions
        return E.div(*elems)
Ejemplo n.º 14
0
    def get_slave_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 = set()
        for m in rt.models_by_base(vat.VatDocument):
            vtypes.add(
                VoucherTypes.get_by_value(dd.full_model_name(m)))

        actions = []

        def add_action(btn):
            if btn is None:
                return False
            actions.append(btn)
            return True

        for vt in vtypes:
            for jnl in vt.get_journals():
                sar = ar.spawn(
                    vt.table_class,
                    master_instance=jnl,
                    known_values=dict(partner=obj))
                if add_action(sar.insert_button(unicode(jnl),
                                                icon_name=None)):
                    actions.append(' ')

        elems += [E.br(), _("Create voucher in journal ")] + actions
        return E.div(*elems)
Ejemplo n.º 15
0
    def get_slave_summary(self, obj, ar):
        """Displays a summary of all responses for a given partner using a
        bullet list grouped by poll.

        """
        if obj is None:
            return

        visible_polls = Poll.objects.filter(
            state__in=(PollStates.published,
                       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.published:
                elems += [' ', iar.ar2button()]
                #elems += [' ', iar.insert_button()]
            items.append(E.li(*elems))
        return E.div(E.ul(*items))
Ejemplo n.º 16
0
    def about_html(cls):

        body = []

        body.append(settings.SITE.welcome_html())

        #~ print "20121112 startup_time", settings.SITE.startup_time.date()
        def dtfmt(dt):
            if isinstance(dt, float):
                dt = datetime.datetime.fromtimestamp(dt)
                #~ raise ValueError("Expected float, go %r" % dt)
            return unicode(_("%(date)s at %(time)s")) % dict(
                date=dd.fdf(dt.date()), time=dt.time())

        items = []
        times = []
        value = settings.SITE.startup_time
        label = _("Server uptime")
        body.append(E.p(unicode(label), ' : ', E.b(dtfmt(value))))
        body.append(E.p(unicode(_("Source timestamps:"))))
        for src in ("lino", "lino_welfare", 'django', 'atelier'):
            label = src
            value = codetime('%s.*' % src)
            if value is not None:
                times.append((label, value))

        def mycmp(a, b):
            return cmp(b[1], a[1])

        times.sort(mycmp)
        for label, value in times:
            items.append(E.li(unicode(label), ' : ', E.b(dtfmt(value))))
        body.append(E.ul(*items))
        return E.div(*body, class_='htmlText')
Ejemplo n.º 17
0
 def server_status(cls, obj, ar):
     body = []
     body.append(
         E.p(
             _("%s pending threads") %
             len(settings.SITE.kernel.pending_threads)))
     return E.div(*body, class_='htmlText')
Ejemplo n.º 18
0
    def get_slave_summary(self, obj, ar):
        """Displays a summary of all responses for a given partner using a
        bullet list grouped by poll.

        """
        if obj is None:
            return

        visible_polls = Poll.objects.filter(state__in=(PollStates.published, 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 = [unicode(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.published:
                elems += [" ", iar.ar2button()]
                # elems += [' ', iar.insert_button()]
            items.append(E.li(*elems))
        return E.div(E.ul(*items))
Ejemplo n.º 19
0
    def get_slave_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.modules.polls.AnswerRemarksByAnswer
        all_responses = rt.modules.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 = [_("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.
        editable = Responses.update_action.request_from(ar).get_permission(response)
        kv = dict(response=response)
        insert = AnswerRemarks.insert_action.request_from(ar, known_values=kv)
        detail = AnswerRemarks.detail_action.request_from(ar)
        # editable = insert.get_permission(response)
        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 = [unicode(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 E.div(ht.as_element(), class_="htmlText")
Ejemplo n.º 20
0
Archivo: base.py Proyecto: DarioGT/lino
 def render(cls, w, book):
     s = html2rst(E.div(*tuple(cls.word2html(w, book))))
     #~ s = html2rst(e) for e (cls.word2html(w,book)))
     if "<" in s:
         raise Exception("2013116 %r" % cls.word2html(w, book))
     if s.startswith('('):
         s = '\\' + s
     return s
Ejemplo n.º 21
0
 def get_overview_elems(self, ar):
     elems = self.get_name_elems(ar)
     elems += join_elems(list(self.address_location_lines()), sep=E.br)
     elems = [
         E.div(*elems,
               style="font-size:18px;font-weigth:bold;"
               "vertical-align:bottom;text-align:middle")]
     return elems
Ejemplo n.º 22
0
 def table2xhtml(self, header_level=None, **kw):
     t = xghtml.Table()
     self.dump2html(t, self.sliced_data_iterator, **kw)
     e = t.as_element()
     if header_level is not None:
         # return E.div(E.h2(self.get_title()), e)
         return E.div(E.h2(self.actor.label), e)
     return e
Ejemplo n.º 23
0
Archivo: base.py Proyecto: cuchac/lino
 def render(cls, w, book):
     s = html2rst(E.div(*tuple(cls.word2html(w, book))))
     #~ s = html2rst(e) for e (cls.word2html(w,book)))
     if "<" in s:
         raise Exception("2013116 %r" % cls.word2html(w, book))
     if s.startswith('('):
         s = '\\' + s
     return s
Ejemplo n.º 24
0
 def pupil_info(cls, self, ar):
     elems = [ar.obj2html(self.pupil,
                          self.pupil.get_full_name(nominative=True))]
     elems += [', ']
     elems += join_elems(
         list(self.pupil.address_location_lines()),
         sep=', ')
     return E.div(*elems)
Ejemplo n.º 25
0
    def eid_info(self, ar):
        "Display some information about the eID card."
        attrs = dict(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.update(class_="lino-info-red")
        return E.div(*elems, **attrs)
Ejemplo n.º 26
0
    def get_slave_summary(self, obj, ar):
        sar = self.request(master_instance=obj)
        links = []
        for lnk in sar:
            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)

        def by_age(a, b):
            return cmp(b[1].birth_date.as_date(), a[1].birth_date.as_date())

        try:
            links.sort(by_age)
        except AttributeError:
            # 'str' object has no attribute 'as_date'
            # possible when incomplete or empty birth_date
            pass

        items = []
        for type, other in links:
            items.append(E.li(
                unicode(type), _(" of "),
                obj.format_family_member(ar, other),
                " (%s)" % other.age()
            ))
        elems = []
        if len(items) > 0:
            elems += [_("%s is") % obj.first_name]
            elems.append(E.ul(*items))
        else:
            elems.append(_("No relationships."))

        actions = []

        def add_action(btn):
            if btn is None:
                return False
            actions.append(btn)
            return True

        for lt in addable_link_types:
            sar = ar.spawn(Links, known_values=dict(type=lt, parent=obj))
            if add_action(sar.insert_button(
                    lt.as_parent(obj), icon_name=None)):
                if not lt.symmetric:
                    actions.append('/')
                    sar = ar.spawn(
                        Links, known_values=dict(type=lt, child=obj))
                    add_action(sar.insert_button(
                        lt.as_child(obj), icon_name=None))
                actions.append(' ')

        elems += [E.br(), _("Create relationship as ")] + actions
        return E.div(*elems)
Ejemplo n.º 27
0
        def f(obj, ar):
            if ar is None:
                return ''
            if obj is None:
                return E.div()
            try:
                et = ExcerptType.objects.get(shortcut=i)
            except ExcerptType.DoesNotExist:
                return E.div()
            items = []
            if True:
                sar = ar.spawn(ExcerptsByOwner,
                               master_instance=obj,
                               param_values=dict(excerpt_type=et))
                n = sar.get_total_count()
                if n > 0:
                    ex = sar.sliced_data_iterator[0]
                    items.append(ar.obj2html(ex, _("Last")))

                    ba = sar.bound_action
                    btn = sar.renderer.action_button(obj,
                                                     sar,
                                                     ba,
                                                     "%s (%d)" % (_("All"), n),
                                                     icon_name=None)
                    items.append(btn)

                ia = getattr(obj, et.get_action_name())
                btn = ar.instance_action_button(ia,
                                                _("Create"),
                                                icon_name=None)
                items.append(btn)

            else:
                ot = ContentType.objects.get_for_model(obj.__class__)
                qs = Excerpt.objects.filter(owner_id=obj.pk,
                                            owner_type=ot,
                                            excerpt_type=et)
                if qs.count() > 0:
                    ex = qs[0]
                    txt = ExcerptsByOwner.format_excerpt(ex)
                    items.append(ar.obj2html(ex, txt))
            return E.div(*join_elems(items, ', '))
Ejemplo n.º 28
0
 def find_appointment(self, ar):
     if ar is None:
         return ''
     CalendarPanel = rt.modules.extensible.CalendarPanel
     elems = []
     for obj in self.coachings_by_client.all():
         sar = CalendarPanel.request(
             subst_user=obj.user, current_project=self.pk)
         elems += [ar.href_to_request(sar, obj.user.username), ' ']
     return E.div(*elems)
Ejemplo n.º 29
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", E.tostring(e)
     if header_level is not None:
         return E.div(E.h2(self.actor.label), e)
     return e
Ejemplo n.º 30
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", E.tostring(e)
     if header_level is not None:
         return E.div(E.h2(self.actor.label), e)
     return e
Ejemplo n.º 31
0
    def body(cls, self, ar):
        html = []
        for item in self.get_story(ar):
            if E.iselement(item):
                html.append(item)
            elif isinstance(item, type) and issubclass(item, Actor):
                html.append(ar.show(item, master_instance=self))
            else:
                raise Exception("Cannot handle %r" % item)

        return E.div(*html)
Ejemplo n.º 32
0
    def get_slave_summary(self, obj, ar):
        """Displays the uploads related to this controller as a list grouped
by uploads type.

Note that this also works on
:class:`lino_welfare.modlib.uploads.models.UploadsByClient` and their
subclasses for the different `_upload_area`.

        """
        UploadType = rt.modules.uploads.UploadType
        # Upload = rt.modules.uploads.Upload
        elems = []
        types = []

        for ut in UploadType.objects.filter(
                upload_area=self._upload_area):
            sar = ar.spawn(
                self, master_instance=obj,
                known_values=dict(type_id=ut.id))
            # logger.info("20140430 %s", sar.data_iterator.query)
            files = []
            for m in sar:
                text = self.format_row_in_slave_summary(ar, m)
                if text is None:
                    continue
                edit = ar.obj2html(
                    m,  text,  # _("Edit"),
                    # icon_name='application_form',
                    title=_("Edit metadata of the uploaded file."))
                if m.file.name:
                    show = ar.renderer.href_button(
                        settings.SITE.build_media_url(m.file.name),
                        _(" [show]"),  # fmt(m),
                        target='_blank',
                        icon_name='../xsite/link',
                        # icon_name='page_go',
                        # style="vertical-align:-30%;",
                        title=_("Open the uploaded file in a new browser window"))
                    # logger.info("20140430 %s", E.tostring(e))
                    files.append(E.span(edit, ' ', show))
                else:
                    files.append(edit)
            if ut.wanted and (
                    ut.max_number < 0 or len(files) < ut.max_number):
                files.append(sar.insert_button())
            if len(files) > 0:
                e = E.p(unicode(ut), ': ', *join_elems(files, ', '))
                types.append(e)
        # logger.info("20140430 %s", [E.tostring(e) for e in types])
        if len(types) == 0:
            elems.append(E.ul(E.li(ar.no_data_text)))
        else:
            elems.append(E.ul(*[E.li(e) for e in types]))
        return E.div(*elems)
Ejemplo n.º 33
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)
Ejemplo n.º 34
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)
Ejemplo n.º 35
0
        def f(obj, ar):
            if ar is None:
                return ''
            if obj is None:
                return E.div()
            try:
                et = ExcerptType.objects.get(shortcut=i)
            except ExcerptType.DoesNotExist:
                return E.div()
            items = []
            if True:
                sar = ar.spawn(
                    ExcerptsByOwner,
                    master_instance=obj,
                    param_values=dict(excerpt_type=et))
                n = sar.get_total_count()
                if n > 0:
                    ex = sar.sliced_data_iterator[0]
                    items.append(ar.obj2html(ex, _("Last")))

                    ba = sar.bound_action
                    btn = sar.renderer.action_button(
                        obj, sar, ba, "%s (%d)" % (_("All"), n),
                        icon_name=None)
                    items.append(btn)
    
                ia = getattr(obj, et.get_action_name())
                btn = ar.instance_action_button(
                    ia, _("Create"), icon_name=None)
                items.append(btn)

            else:
                ot = ContentType.objects.get_for_model(obj.__class__)
                qs = Excerpt.objects.filter(
                    owner_id=obj.pk, owner_type=ot, excerpt_type=et)
                if qs.count() > 0:
                    ex = qs[0]
                    txt = ExcerptsByOwner.format_excerpt(ex)
                    items.append(ar.obj2html(ex, txt))
            return E.div(*join_elems(items, ', '))
Ejemplo n.º 36
0
    def eid_info(self, ar):
        "Display some information about the eID card."
        attrs = dict(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 config:
                elems.append(ar.instance_action_button(
                    self.read_beid, msg, icon_name=None))
            else:
                elems.append(msg)
            # same red as in lino.css for .x-grid3-row-red td
            # ~ attrs.update(style="background-color:#FA7F7F; padding:3pt;")
            attrs.update(class_="lino-info-red")
        return E.div(*elems, **attrs)
Ejemplo n.º 37
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 E.div(*body, class_='htmlText')
        return rt.html_text(E.div(*body))
Ejemplo n.º 38
0
 def custom_actions(self, ar, **kw):
     if self.aid_type_id is None or ar is None:
         return ''
     at = self.aid_type
     ct = at.confirmation_type
     if not ct:
         return ''
     sar = ct.table_class.insert_action.request_from(
         ar, master_instance=self)
     # print(20150218, sar)
     txt = _("Create confirmation")
     btn = sar.ar2button(None, txt, icon_name=None)
     # btn = sar.insert_button(txt, icon_name=None)
     return E.div(btn)
Ejemplo n.º 39
0
 def get_overview_elems(self, ar):
     elems = []
     buttons = self.get_mti_buttons(ar)
     buttons = join_elems(buttons, ', ')
     elems.append(E.p(unicode(_("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(*elems,
               style="font-size:18px;font-weigth:bold;"
               "vertical-align:bottom;text-align:middle")]
     return elems
Ejemplo n.º 40
0
 def description_print(cls, self, ar):
     elems = body_subject_to_elems(ar, self.title, self.description)
     # dd.logger.info("20160511a %s", cls)
     if cls.include_qty_in_description:
         if self.qty != 1:
             elems += [
                 " ",
                 _("({qty}*{unit_price}/{unit})").format(
                     qty=self.quantity,
                     unit=self.product.delivery_unit,
                     unit_price=self.unit_price)]
     e = E.div(*elems)
     # dd.logger.info("20160704d %s", E.tostring(e))
     return e
Ejemplo n.º 41
0
 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)
Ejemplo n.º 42
0
 def write_body(self,fd):
     Section.write_body(self,fd)
     self.from_language.words.sort(sort_by_fr)
     uca_sort(self.from_language.words)
     #~ self.from_language.words = uca_sorted(self.from_language.words)
     def fmt(w):
         for x in self.from_language.word2html(w):
             yield x
         yield " " 
         for x in  ET.word2html(w,self): 
             yield x
         yield " " 
         yield ", ".join([u.rst_ref_to() for u in w.units])
     for w in self.from_language.words:
         fd.write("| %s\n" % html2rst(E.div(*fmt(w))))
Ejemplo n.º 43
0
 def description_print(cls, self, ar):
     elems = body_subject_to_elems(ar, self.title, self.description)
     # dd.logger.info("20160511a %s", cls)
     if cls.include_qty_in_description:
         if self.qty != 1:
             elems += [
                 " ",
                 _("({qty}*{unit_price}/{unit})").format(
                     qty=self.quantity,
                     unit=self.product.delivery_unit,
                     unit_price=self.unit_price)
             ]
     e = E.div(*elems)
     # dd.logger.info("20160704d %s", E.tostring(e))
     return e
Ejemplo n.º 44
0
 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)
Ejemplo n.º 45
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(*elems,
               style="font-size:18px;font-weigth:bold;"
               "vertical-align:bottom;text-align:middle")
     ]
     return elems
Ejemplo n.º 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 E.div(*body, class_='htmlText')
        return rt.html_text(E.div(*body))
Ejemplo n.º 47
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.fdf(dt.date()),
                time=dt.time())

        items = []
        times = []
        value = settings.SITE.startup_time
        label = _("Server uptime")
        body.append(E.p(str(label), ' : ', E.b(dtfmt(value))))
        if settings.SITE.is_demo_site:
            s = str(_("This is a Lino demo site."))
            body.append(E.p(s))
        if settings.SITE.the_demo_date:
            s = _("We are running with simulated date set to {0}.").format(
                dd.fdf(settings.SITE.the_demo_date))
            body.append(E.p(s))
        body.append(E.p(str(_("Source timestamps:"))))
        for src in ("lino", "lino_welfare", 'django', 'atelier'):
            label = src
            value = codetime('%s.*' % src)
            if value is not None:
                times.append((label, value))

        def mycmp(a, b):
            return cmp(b[1], a[1])
        times.sort(mycmp)
        for label, value in times:
            items.append(E.li(str(label), ' : ', E.b(dtfmt(value))))
        body.append(E.ul(*items))
        return E.div(*body, class_='htmlText')
Ejemplo n.º 48
0
Archivo: base.py Proyecto: DarioGT/lino
    def write_body(self, fd):
        Section.write_body(self, fd)
        self.from_language.words.sort(sort_by_fr)
        uca_sort(self.from_language.words)

        #~ self.from_language.words = uca_sorted(self.from_language.words)

        def fmt(w):
            for x in self.from_language.word2html(w):
                yield x
            yield " "
            for x in ET.word2html(w, self):
                yield x
            yield " "
            yield ", ".join([u.rst_ref_to() for u in w.units])

        for w in self.from_language.words:
            fd.write("| %s\n" % html2rst(E.div(*fmt(w))))
Ejemplo n.º 49
0
    def get_slave_summary(self, obj, ar):
        """The summary view for this table.

        See :meth:`lino.core.actors.Actor.get_slave_summary`.

        """
        if ar is None:
            return ''
        sar = self.request_from(ar, master_instance=obj)

        elems = []
        for guest in sar:
            lbl = dd.fds(guest.event.start_date)
            if guest.state.button_text:
                lbl = "{0}{1}".format(lbl, guest.state.button_text)
            elems.append(ar.obj2html(guest.event, lbl))
        elems = join_elems(elems, sep=', ')
        return ar.html_text(E.div(*elems))
Ejemplo n.º 50
0
Archivo: ui.py Proyecto: TonisPiip/cosi
    def get_slave_summary(cls, obj, ar):
        """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>`
        for this table.

        """
        elems = []
        sar = ar.spawn(rt.models.ledger.Movements,
                       param_values=dict(cleared=dd.YesNo.no, partner=obj))
        bal = ZERO
        for mvt in sar:
            if mvt.dc:
                bal -= mvt.amount
            else:
                bal += mvt.amount
        txt = _("{0} open movements ({1} {2})").format(
            sar.get_total_count(), bal, dd.plugins.ledger.currency_symbol)

        elems.append(ar.href_to_request(sar, txt))
        return ar.html_text(E.div(*elems))
Ejemplo n.º 51
0
    def get_slave_summary(self, obj, ar):
        sar = self.request(master_instance=obj)
        elems = []
        # n = sar.get_total_count()
        # if n == 0:
        #     elems += [_("Not member of any household."), E.br()]
        # else:

        items = []
        for m in sar.data_iterator:
            
            args = (unicode(m.role), _(" in "),
                    ar.obj2html(m.household))
            if m.primary:
                items.append(E.li(E.b("\u2611 ", *args)))
            else:
                btn = m.set_primary.as_button_elem(
                    ar, "\u2610 ", style="text-decoration:none;")
                items.append(E.li(btn, *args))
        if len(items) > 0:
            elems += [_("%s is") % obj]
            elems.append(E.ul(*items))
        if False:
            elems += [
                E.br(), ar.instance_action_button(obj.create_household)]
        else:
            elems += [E.br(), _("Create a household"), ' : ']
            Type = rt.modules.households.Type
            Person = dd.resolve_model(config.person_model)
            T = Person.get_default_table()
            ba = T.get_action_by_name('create_household')
            buttons = []
            for t in Type.objects.all():
                apv = dict(type=t, head=obj)
                sar = ar.spawn(ba,  # master_instance=obj,
                               selected_rows=[obj],
                               action_param_values=apv)
                buttons.append(ar.href_to_request(sar, unicode(t)))
            elems += join_elems(buttons, sep=' / ')
        return E.div(*elems)
Ejemplo n.º 52
0
    def show_story(self, ar, story, stripped=True, **kwargs):
        """Render the given story as an HTML element. Ignore `stripped`
        because it makes no sense in HTML.

        """
        from lino.core.actors import Actor
        from lino.core.tables import TableRequest
        elems = []
        for item in story:
            if E.iselement(item):
                elems.append(item)
            elif isinstance(item, type) and issubclass(item, Actor):
                ar = item.default_action.request(parent=ar)
                elems.append(self.table2story(ar, **kwargs))
            elif isinstance(item, TableRequest):
                assert item.renderer is not None
                elems.append(self.table2story(item, **kwargs))
            elif isiterable(item):
                elems.append(self.show_story(ar, item, **kwargs))
                # for i in self.show_story(item, *args, **kwargs):
                #     yield i
            else:
                raise Exception("Cannot handle %r" % item)
        return E.div(*elems)
Ejemplo n.º 53
0
 def result(self, ar):
     return E.div(*tuple(get_poll_result(self)))
Ejemplo n.º 54
0
    def get_slave_summary(self, obj, ar):
        """Displays the uploads related to this controller as a list grouped
        by uploads type.

        Note that this also works on
        :class:`lino_welfare.modlib.uploads.models.UploadsByClient`
        and their subclasses for the different `_upload_area`.

        """
        UploadType = rt.modules.uploads.UploadType
        # Upload = rt.modules.uploads.Upload
        elems = []
        types = []

        perm = ar.get_user().profile.has_required_roles(self.required_roles)

        for ut in UploadType.objects.filter(upload_area=self._upload_area):
            sar = ar.spawn(self,
                           master_instance=obj,
                           known_values=dict(type_id=ut.id))
            # logger.info("20140430 %s", sar.data_iterator.query)
            files = []
            for m in sar:
                text = self.format_row_in_slave_summary(ar, m)
                if text is None:
                    continue
                edit = ar.obj2html(
                    m,
                    text,  # _("Edit"),
                    # icon_name='application_form',
                    title=_("Edit metadata of the uploaded file."))
                if m.file.name:
                    show = ar.renderer.href_button(
                        settings.SITE.build_media_url(m.file.name),
                        # u"\u21A7",  # DOWNWARDS ARROW FROM BAR (↧)
                        # u"\u21E8",
                        u"\u21f2",  # SOUTH EAST ARROW TO CORNER (⇲)
                        style="text-decoration:none;",
                        # _(" [show]"),  # fmt(m),
                        target='_blank',
                        # icon_name=settings.SITE.build_static_url(
                        #     'images/xsite/link'),
                        # icon_name='page_go',
                        # style="vertical-align:-30%;",
                        title=_(
                            "Open the uploaded file in a new browser window"))
                    # logger.info("20140430 %s", E.tostring(e))
                    files.append(E.span(edit, ' ', show))
                else:
                    files.append(edit)
            if perm and ut.wanted \
               and (ut.max_number < 0 or len(files) < ut.max_number):
                btn = self.insert_action.request_from(
                    sar, master_instance=obj,
                    known_values=dict(type_id=ut.id)).ar2button()
                if btn is not None:
                    files.append(btn)
            if len(files) > 0:
                e = E.p(unicode(ut), ': ', *join_elems(files, ', '))
                types.append(e)
        # logger.info("20140430 %s", [E.tostring(e) for e in types])
        if len(types) == 0:
            elems.append(E.ul(E.li(ar.no_data_text)))
        else:
            elems.append(E.ul(*[E.li(e) for e in types]))
        return E.div(*elems)
Ejemplo n.º 55
0
 def overview(self, ar):
     return E.div(*self.get_overview_elems(ar))
Ejemplo n.º 56
0
 def overview(self, ar):
     if ar is None:
         return ''
     return E.div(*self.get_overview_elems(ar))
Ejemplo n.º 57
0
    def get_slave_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.modules.polls.AnswerRemarksByAnswer
        all_responses = rt.modules.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 = [_("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.
        editable = Responses.update_action.request_from(ar).get_permission(
            response)
        kv = dict(response=response)
        insert = AnswerRemarks.insert_action.request_from(ar, known_values=kv)
        detail = AnswerRemarks.detail_action.request_from(ar)
        # editable = insert.get_permission(response)
        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 = [unicode(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 E.div(ht.as_element(), class_="htmlText")
Ejemplo n.º 58
0
def table2html(ar, as_main=True):
    """Represent the given table request as an HTML table.

    `ar` is the request to be rendered, an instance of
    :class:`lino.core.tablerequest.TableRequest`.

    The returned HTML enclosed in a ``<div>`` tag and generated using
    :mod:`lino.utils.xmlgen.html`.

    If `as_main` is True, include additional elements such as a paging
    toolbar. (This argument is currently being ignored.)

    """
    as_main = True
    t = xghtml.Table()
    t.attrib.update(class_="table table-striped table-hover")
    if ar.limit is None:
        ar.limit = PLAIN_PAGE_LENGTH
    pglen = ar.limit
    if ar.offset is None:
        page = 1
    else:
        """
        (assuming pglen is 5)
        offset page
        0      1
        5      2
        """
        page = int(old_div(ar.offset, pglen)) + 1

    ar.dump2html(t, ar.sliced_data_iterator)
    if not as_main:
        url = ar.get_request_url()  # open in own window
        return E.div(E.a(ar.get_title(), href=url), t.as_element())

    buttons = []
    kw = dict()
    kw = {}
    if pglen != PLAIN_PAGE_LENGTH:
        kw[constants.URL_PARAM_LIMIT] = pglen

    if page > 1:
        kw[constants.URL_PARAM_START] = pglen * (page - 2)
        prev_url = ar.get_request_url(**kw)
        kw[constants.URL_PARAM_START] = 0
        first_url = ar.get_request_url(**kw)
    else:
        prev_url = None
        first_url = None
    buttons.append(('<<', _("First page"), first_url))
    buttons.append(('<', _("Previous page"), prev_url))

    next_start = pglen * page
    if next_start < ar.get_total_count():
        kw[constants.URL_PARAM_START] = next_start
        next_url = ar.get_request_url(**kw)
        last_page = int(old_div((ar.get_total_count() - 1), pglen))
        kw[constants.URL_PARAM_START] = pglen * last_page
        last_url = ar.get_request_url(**kw)
    else:
        next_url = None
        last_url = None
    buttons.append(('>', _("Next page"), next_url))
    buttons.append(('>>', _("Last page"), last_url))

    return E.div(buttons2pager(buttons), t.as_element())
Ejemplo n.º 59
0
    def get_slave_summary(self, obj, ar):
        """The :meth:`summary view <lino.core.actors.Actor.get_slave_summary>`
        for :class:`LinksByHuman`.

        """
        # 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)

        def by_age(a, b):
            return cmp(b[1].birth_date.as_date(), a[1].birth_date.as_date())

        try:
            links.sort(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

        items = []
        for type, other in links:
            items.append(
                E.li(unicode(type), _(" of "),
                     obj.format_family_member(ar, other), " (%s)" % other.age))
        elems = []
        if len(items) > 0:
            elems += [_("%s is") % obj.first_name]
            elems.append(E.ul(*items))
        else:
            elems.append(_("No relationships."))

        # Buttons for creating relationships:
        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(), _("Create relationship as ")] + actions
        return E.div(*elems)