Ejemplo n.º 1
0
    def html_render_table_footer(self, table):
        """
            Render the table footer

            @param table: the TABLE instance
        """

        data = self.data

        columns = data.get("c")
        totals = data.get("t")

        if not totals:
            return

        footer_row = TR(_class="gi-column-totals")
        if columns:
            label = None
            span = 0
            for column in columns:
                has_value = column in totals
                if label is None:
                    if not has_value:
                        span += 1
                        continue
                    else:
                        label = TD(SPAN(self.totals_label),
                                   _class = "gi-column-totals-label",
                                   _colspan = span,
                                   )
                        footer_row.append(label)
                value = totals[column] if has_value else ""
                footer_row.append(TD(value))
        table.append(TFOOT(footer_row))
Ejemplo n.º 2
0
    def render_row(row_id, label, widget, comment, hidden=False):

        _class = "hide" if hidden else None

        row = TR(TD(label, _class="w2p_fl"),
                 TD(widget),
                 _id=row_id,
                 _class=_class)

        if comment:
            row.append(
                TD(DIV(_class="tooltip", _title="%s|%s" % (label, comment)),
                   _class="w2p_fc"))
        return row
Ejemplo n.º 3
0
    def render_row(row_id, label, widget, comment, hidden=False):

        _class = "hide" if hidden else None

        row = TR(TD(label, _class="w2p_fl"),
                 TD(widget),
                 _id=row_id,
                 _class=_class)

        if comment:
            row.append(TD(DIV(_class="tooltip",
                              _title="%s|%s" % (label, comment)),
                          _class="w2p_fc"))
        return row
Ejemplo n.º 4
0
    def html_render_table_header(self, table):
        """
            Render the table header

            @param table: the TABLE instance
        """

        data = self.data

        columns = data.get("c")
        labels = data.get("l")

        header_row = TR(_class="gi-column-headers")
        if columns:
            for column in columns:
                label = labels.get(column, column)
                header_row.append(TH(label))
        table.append(THEAD(header_row))
Ejemplo n.º 5
0
    def get_html(self):
        submissions_data = self.get_data()

        card_content_table = TABLE(_class="bordered highlight")
        tbody = TBODY()

        for row in submissions_data:
            user_record = utilities.get_user_records([row[0]], "id", "id",
                                                     True)
            tr = TR(
                TD(
                    A(user_record.first_name + " " + user_record.last_name,
                      _href=URL("user",
                                "profile",
                                args=user_record.stopstalk_handle,
                                extension=False),
                      _target="_blank")))

            td = TD()
            for site in row[1]:
                if site == "total":
                    continue
                else:
                    td.append(
                        SPAN(IMG(_src=current.get_static_url(
                            "images/%s_small.png" % str(site).lower()),
                                 _class="parent-site-icon-very-small"),
                             " " + str(row[1][site]),
                             _style="padding-right: 10px;"))
            tr.append(td)
            tbody.append(tr)

        card_content_table.append(tbody)

        card_html = BaseCard.get_html(
            self,
            **dict(card_title=self.card_title,
                   card_content=card_content_table,
                   cta_links=self.get_cta_html(),
                   card_color_class="white",
                   card_text_color_class="black-text"))
        return card_html
def render_trending_table(caption, problems, column_name, user_id):
    """
        Create trending table from the rows
    """
    T = current.T

    table = TABLE(_class="bordered centered")
    thead = THEAD(
        TR(TH(T("Problem")), TH(T("Recent Submissions")), TH(column_name)))
    table.append(thead)
    tbody = TBODY()

    for problem in problems:
        tr = TR()
        link_class = get_link_class(problem[0], user_id)
        link_title = (" ".join(link_class.split("-"))).capitalize()

        tr.append(
            TD(
                problem_widget(problem[1]["name"], problem[0], link_class,
                               link_title)))
        tr.append(TD(problem[1]["total_submissions"]))
        tr.append(TD(len(problem[1]["users"]) + \
                     len(problem[1]["custom_users"])))
        tbody.append(tr)

    table.append(tbody)
    table = DIV(H5(caption, _class="center"), HR(), table)

    return table
Ejemplo n.º 7
0
    def html_render_group_footer(self, tbody, group, level=0):
        """
            Render the group footer (=group totals)

            @param tbody: the TBODY or TABLE to append to
            @param group: the group dict
            @param level: the grouping level

            @todo: add group label to footer if no group headers
            @todo: add totals label
        """

        data = self.data

        columns = data.get("c")
        totals = group.get("t")
        value = group.get("v")

        footer_row = TR(_class="gi-group-footer gi-level-%s" % level)
        if not totals:
            if not self.group_headers:
                footer_row.append(TD(value, _colspan = len(columns)))
                tbody.append(footer_row)
            return

        if columns:
            label = None
            span = 0
            for column in columns:
                has_value = column in totals
                if label is None:
                    if not has_value:
                        span += 1
                        continue
                    else:
                        label = TD("%s %s" % (s3_unicode(s3_strip_markup(value)),
                                              self.totals_label,
                                              ),
                                   _class = "gi-group-footer-label",
                                   _colspan = span,
                                   )
                        footer_row.append(label)
                value = totals[column] if has_value else ""
                footer_row.append(TD(value))

        tbody.append(footer_row)
Ejemplo n.º 8
0
    def _render(cls, resource, data, meta_data, format=None):
        """
            Method to pre-render the contents for the message template

            @param resource: the S3Resource
            @param data: the data returned from S3Resource.select
            @param meta_data: the meta data for the notification
            @param format: the contents format ("text" or "html")
        """

        created_on_selector = resource.prefix_selector("created_on")
        created_on_colname = None
        notify_on = meta_data["notify_on"]
        last_check_time = meta_data["last_check_time"]
        rows = data["rows"]
        rfields = data["rfields"]
        output = {}
        new, upd = [], []

        if format == "html":
            # Pre-formatted HTML
            colnames = []

            new_headers = TR()
            mod_headers = TR()
            for rfield in rfields:
                if rfield.selector == created_on_selector:
                    created_on_colname = rfield.colname
                elif rfield.ftype != "id":
                    colnames.append(rfield.colname)
                    label = rfield.label
                    new_headers.append(TH(label))
                    mod_headers.append(TH(label))
            for row in rows:
                append_record = upd.append
                if created_on_colname:
                    try:
                        created_on = row["_row"][created_on_colname]
                    except (KeyError, AttributeError):
                        pass
                    else:
                        if s3_utc(created_on) >= last_check_time:
                            append_record = new.append
                tr = TR([TD(XML(row[colname])) for colname in colnames])
                append_record(tr)
            if "new" in notify_on and len(new):
                output["new"] = len(new)
                output["new_records"] = TABLE(THEAD(new_headers), TBODY(new))
            else:
                output["new"] = None
            if "upd" in notify_on and len(upd):
                output["upd"] = len(upd)
                output["upd_records"] = TABLE(THEAD(new_headers), TBODY(upd))
            else:
                output["upd"] = None

        else:
            # Standard text format
            labels = []
            append = labels.append

            for rfield in rfields:
                if rfield.selector == created_on_selector:
                    created_on_colname = rfield.colname
                elif rfield.ftype != "id":
                    append((rfield.colname, rfield.label))

            for row in rows:
                append_record = upd.append
                if created_on_colname:
                    try:
                        created_on = row["_row"][created_on_colname]
                    except (KeyError, AttributeError):
                        pass
                    else:
                        if s3_utc(created_on) >= last_check_time:
                            append_record = new.append

                record = []
                append_column = record.append
                for colname, label in labels:
                    append_column((label, row[colname]))
                append_record(record)

            if "new" in notify_on and len(new):
                output["new"] = len(new)
                output["new_records"] = new
            else:
                output["new"] = None
            if "upd" in notify_on and len(upd):
                output["upd"] = len(upd)
                output["upd_records"] = upd
            else:
                output["upd"] = None

        output.update(meta_data)
        return output
Ejemplo n.º 9
0
    def pdf(self, r, **attr):
        """
            Generate the PDF

            @param r: the S3Request instance
            @param attr: controller attributes
        """

        T = current.T

        db = current.db
        s3db = current.s3db

        # Look up the report organisation
        logo = None
        org_id, org_label = self.get_report_organisation(r)
        if org_id:
            # Look up the root organisation's logo
            otable = s3db.org_organisation
            rotable = otable.with_alias("root_organisation")
            join = rotable.on(rotable.id == otable.root_organisation)
            field = rotable.logo
            row = db(otable.id == org_id).select(field,
                                                 join = join,
                                                 limitby = (0, 1),
                                                 ).first()
            if row and row.logo:
                if field.uploadfolder:
                    path = field.uploadfolder
                else:
                    path = os.path.join(current.request.folder, 'uploads')
                logo = os.path.join(path, row.logo)

        # Look up the report programme
        prog_id, prog_label = self.get_report_programme(r)

        # Extract the HR records
        data, pictures = self.extract(r.resource)

        # Construct the header
        title = T("Official Volunteer List")
        header = TABLE(_class = "no-grid",
                       )
        trow = TR()
        if logo:
            trow.append(TD(IMG(_src=logo, _width="80"),
                           _rowspan = 3 if prog_id else 2,
                           ))
        trow.append(TD(H4(title), _colspan = 3))
        header.append(trow)
        if org_id:
            header.append(TR(TD(H5(org_label), _colspan = 3)))
        if prog_id:
            header.append(TR(TD(prog_label, _colspan = 3)))
        header.append(TR(TD()))

        # Should we show the branch column?
        branches = set(row["_row"]["hrm_human_resource.organisation_id"] for row in data.rows)
        if org_id:
            show_branch = len(branches) > 1
            org_repr = s3db.org_OrganisationRepresent(show_link = False,
                                                      parent = False,
                                                      acronym = True,
                                                      )
        else:
            show_branch = True
            org_repr = r.table.organisation_id.represent
        org_repr.bulk(list(branches))

        # Construct the table header
        labels = TR(TH(T("Picture")),
                    TH(T("Name")),
                    TH(T("Last Name")),
                    TH(T("National ID")),
                    TH(T("Volunteer ID")),
                    TH(T("Signature")),
                    )
        if not prog_id:
            labels.insert(1, TH(T("Program")))
        if show_branch:
            labels.insert(1, TH(T("Branch")))

        # Build the table
        body = TABLE(labels, _class="repeat-header shrink-to-fit")

        # Add the data rows
        for row in data.rows:

            raw = row._row

            # Picture
            picture = pictures.get(raw["pr_person.pe_id"])
            if picture:
                picture = IMG(_src=picture,
                              _width=80,
                              )
            else:
                picture = ""

            # Name
            name = s3_format_fullname(fname = raw["pr_person.first_name"],
                                      mname = raw["pr_person.middle_name"],
                                      lname = "",
                                      truncate = False,
                                      )

            # Build the row
            trow = TR(TD(picture),
                      TD(name),
                      TD(row["pr_person.last_name"]),
                      TD(row["pr_national_id_identity.value"]),
                      TD(row["hrm_human_resource.code"]),
                      TD(),
                      )
            if not prog_id:
                trow.insert(1, TD(row["hrm_programme_hours.programme_id"]))
            if show_branch:
                trow.insert(1, TD(org_repr(raw["hrm_human_resource.organisation_id"])))
            body.append(trow)

        footer = DIV()

        from s3.codecs.pdf import EdenDocTemplate, S3RL_PDF

        doc = EdenDocTemplate(title=title)
        printable_width = doc.printable_width

        get_html_flowable = S3RL_PDF().get_html_flowable

        header_flowable = get_html_flowable(header, printable_width)
        body_flowable = get_html_flowable(body, printable_width)
        footer_flowable = get_html_flowable(footer, printable_width)

        # Build the PDF
        doc.build(header_flowable,
                  body_flowable,
                  footer_flowable,
                  )
        filename = "siglist.pdf"

        # Return the generated PDF
        response = current.response
        response.headers["Content-Type"] = contenttype(".pdf")
        disposition = "attachment; filename=\"%s\"" % filename
        response.headers["Content-disposition"] = disposition

        return doc.output.getvalue()
Ejemplo n.º 10
0
def render_user_editorials_table(user_editorials,
                                 user_id=None,
                                 logged_in_user_id=None,
                                 read_editorial_class=""):
    """
        Render User editorials table

        @param user_editorials (Rows): Rows object of the editorials
        @param user_id (Number): For which user is the listing happening
        @param logged_in_user_id (Number): Which use is logged in
        @param read_editorial_class (String): HTML class for GA tracking

        @return (HTML): HTML table representing the user editorials
    """

    db = current.db
    atable = db.auth_user
    ptable = db.problem
    T = current.T

    user_ids = set([x.user_id for x in user_editorials])
    users = db(atable.id.belongs(user_ids)).select()
    user_mappings = {}
    for user in users:
        user_mappings[user.id] = user

    query = (ptable.id.belongs([x.problem_id for x in user_editorials]))
    problem_records = db(query).select(ptable.id, ptable.name, ptable.link)
    precords = {}
    for precord in problem_records:
        precords[precord.id] = {"name": precord.name, "link": precord.link}

    table = TABLE(_class="centered user-editorials-table")
    thead = THEAD(
        TR(TH(T("Problem")), TH(T("Editorial By")), TH(T("Added on")),
           TH(T("Votes")), TH()))
    tbody = TBODY()
    color_mapping = {"accepted": "green", "rejected": "red", "pending": "blue"}

    for editorial in user_editorials:
        if logged_in_user_id != 1 and user_id != editorial.user_id and editorial.verification != "accepted":
            continue

        user = user_mappings[editorial.user_id]
        record = precords[editorial.problem_id]
        number_of_votes = len(
            editorial.votes.split(",")) if editorial.votes else 0
        link_class = get_link_class(record["link"], logged_in_user_id)
        link_title = (" ".join(link_class.split("-"))).capitalize()
        tr = TR(
            TD(
                problem_widget(record["name"], record["link"], link_class,
                               link_title)))

        if logged_in_user_id is not None and \
           (editorial.user_id == logged_in_user_id or
            logged_in_user_id == 1):
            tr.append(TD(A(user.first_name + " " + user.last_name,
                         _href=URL("user",
                                   "profile",
                                   args=user.stopstalk_handle)),
                         " ",
                         DIV(editorial.verification.capitalize(),
                             _class="verification-badge " + \
                                    color_mapping[editorial.verification])))
        else:
            tr.append(
                TD(
                    A(user.first_name + " " + user.last_name,
                      _href=URL("user", "profile",
                                args=user.stopstalk_handle))))

        tr.append(TD(editorial.added_on))
        vote_class = ""
        if logged_in_user_id is not None and \
           str(logged_in_user_id) in set(editorial.votes.split(",")):
            vote_class = "red-text"
        tr.append(
            TD(
                DIV(SPAN(I(_class="fa fa-heart " + vote_class),
                         _class="love-editorial",
                         data={"id": editorial.id}),
                    " ",
                    DIV(number_of_votes,
                        _class="love-count",
                        _style="margin-left: 5px;"),
                    _style="display: inline-flex;")))

        actions_td = TD(
            A(I(_class="fa fa-eye fa-2x"),
              _href=URL("problems",
                        "read_editorial",
                        args=editorial.id,
                        extension=False),
              _class="btn btn-primary tooltipped " + read_editorial_class,
              _style="background-color: #13AA5F;",
              data={
                  "position": "bottom",
                  "delay": 40,
                  "tooltip": T("Read Editorial")
              }))
        if logged_in_user_id is not None and \
           (user.id == logged_in_user_id or logged_in_user_id == 1) and \
           editorial.verification != "accepted":
            actions_td.append(
                BUTTON(
                    I(_class="fa fa-trash fa-2x"),
                    _style="margin-left: 2%;",
                    _class="btn btn-primary red tooltipped delete-editorial",
                    data={
                        "position": "bottom",
                        "delay": 40,
                        "tooltip": T("Delete Editorial"),
                        "id": editorial.id
                    }))
        tr.append(actions_td)

        tbody.append(tr)

    table.append(thead)
    table.append(tbody)

    return table
Ejemplo n.º 11
0
    def pdf(self, r, **attr):
        """
            Generate the PDF

            Args:
                r: the S3Request instance
                attr: controller attributes
        """

        T = current.T

        db = current.db
        s3db = current.s3db

        # Look up the report organisation
        logo = None
        org_id, org_label = self.get_report_organisation(r)
        if org_id:
            # Look up the root organisation's logo
            otable = s3db.org_organisation
            rotable = otable.with_alias("root_organisation")
            join = rotable.on(rotable.id == otable.root_organisation)
            field = rotable.logo
            row = db(otable.id == org_id).select(
                field,
                join=join,
                limitby=(0, 1),
            ).first()
            if row and row.logo:
                if field.uploadfolder:
                    path = field.uploadfolder
                else:
                    path = os.path.join(current.request.folder, 'uploads')
                logo = os.path.join(path, row.logo)

        # Look up the report programme
        prog_id, prog_label = self.get_report_programme(r)

        # Extract the HR records
        data, pictures = self.extract(r.resource)

        # Construct the header
        title = T("Official Volunteer List")
        header = TABLE(_class="no-grid", )
        trow = TR()
        if logo:
            trow.append(
                TD(
                    IMG(_src=logo, _width="80"),
                    _rowspan=3 if prog_id else 2,
                ))
        trow.append(TD(H4(title), _colspan=3))
        header.append(trow)
        if org_id:
            header.append(TR(TD(H5(org_label), _colspan=3)))
        if prog_id:
            header.append(TR(TD(prog_label, _colspan=3)))
        header.append(TR(TD()))

        # Should we show the branch column?
        branches = set(row["_row"]["hrm_human_resource.organisation_id"]
                       for row in data.rows)
        if org_id:
            show_branch = len(branches) > 1
            org_repr = s3db.org_OrganisationRepresent(
                show_link=False,
                parent=False,
                acronym=True,
            )
        else:
            show_branch = True
            org_repr = r.table.organisation_id.represent
        org_repr.bulk(list(branches))

        # Construct the table header
        labels = TR(
            TH(T("Picture")),
            TH(T("Name")),
            TH(T("Last Name")),
            TH(T("National ID")),
            TH(T("Volunteer ID")),
            TH(T("Signature")),
        )
        if not prog_id:
            labels.insert(1, TH(T("Program")))
        if show_branch:
            labels.insert(1, TH(T("Branch")))

        # Build the table
        body = TABLE(labels, _class="repeat-header shrink-to-fit")

        # Add the data rows
        for row in data.rows:

            raw = row._row

            # Picture
            picture = pictures.get(raw["pr_person.pe_id"])
            if picture:
                picture = IMG(
                    _src=picture,
                    _width=80,
                )
            else:
                picture = ""

            # Name
            name = s3_format_fullname(
                fname=raw["pr_person.first_name"],
                mname=raw["pr_person.middle_name"],
                lname="",
                truncate=False,
            )

            # Build the row
            trow = TR(
                TD(picture),
                TD(name),
                TD(row["pr_person.last_name"]),
                TD(row["pr_national_id_identity.value"]),
                TD(row["hrm_human_resource.code"]),
                TD(),
            )
            if not prog_id:
                trow.insert(1, TD(row["hrm_programme_hours.programme_id"]))
            if show_branch:
                trow.insert(
                    1, TD(org_repr(raw["hrm_human_resource.organisation_id"])))
            body.append(trow)

        footer = DIV()

        from s3.codecs.pdf import EdenDocTemplate, S3RL_PDF

        doc = EdenDocTemplate(title=title)
        printable_width = doc.printable_width

        get_html_flowable = S3RL_PDF().get_html_flowable

        header_flowable = get_html_flowable(header, printable_width)
        body_flowable = get_html_flowable(body, printable_width)
        footer_flowable = get_html_flowable(footer, printable_width)

        # Build the PDF
        doc.build(
            header_flowable,
            body_flowable,
            footer_flowable,
        )
        filename = "siglist.pdf"

        # Return the generated PDF
        response = current.response
        response.headers["Content-Type"] = contenttype(".pdf")
        disposition = "attachment; filename=\"%s\"" % filename
        response.headers["Content-disposition"] = disposition

        return doc.output.getvalue()
Ejemplo n.º 12
0
    def _render(cls, resource, data, meta_data, format=None):
        """
            Method to pre-render the contents for the message template

            @param resource: the S3Resource
            @param data: the data returned from S3Resource.select
            @param meta_data: the meta data for the notification
            @param format: the contents format ("text" or "html")
        """

        created_on_selector = resource.prefix_selector("created_on")
        created_on_colname = None
        notify_on = meta_data["notify_on"]
        last_check_time = meta_data["last_check_time"]
        rows = data["rows"]
        rfields = data["rfields"]
        output = {}
        new, upd = [], []

        if format == "html":
            # Pre-formatted HTML
            colnames = []

            new_headers = TR()
            mod_headers = TR()
            for rfield in rfields:
                if rfield.selector == created_on_selector:
                    created_on_colname = rfield.colname
                elif rfield.ftype != "id":
                    colnames.append(rfield.colname)
                    label = rfield.label
                    new_headers.append(TH(label))
                    mod_headers.append(TH(label))
            for row in rows:
                append_record = upd.append
                if created_on_colname:
                    try:
                        created_on = row["_row"][created_on_colname]
                    except (KeyError, AttributeError):
                        pass
                    else:
                        if s3_utc(created_on) >= last_check_time:
                            append_record = new.append
                tr = TR([TD(XML(row[colname])) for colname in colnames])
                append_record(tr)
            if "new" in notify_on and len(new):
                output["new"] = len(new)
                output["new_records"] = TABLE(THEAD(new_headers), TBODY(new))
            else:
                output["new"] = None
            if "upd" in notify_on and len(upd):
                output["upd"] = len(upd)
                output["upd_records"] = TABLE(THEAD(new_headers), TBODY(upd))
            else:
                output["upd"] = None

        else:
            # Standard text format
            labels = []
            append = labels.append

            for rfield in rfields:
                if rfield.selector == created_on_selector:
                    created_on_colname = rfield.colname
                elif rfield.ftype != "id":
                    append((rfield.colname, rfield.label))

            for row in rows:
                append_record = upd.append
                if created_on_colname:
                    try:
                        created_on = row["_row"][created_on_colname]
                    except (KeyError, AttributeError):
                        pass
                    else:
                        if s3_utc(created_on) >= last_check_time:
                            append_record = new.append

                record = []
                append_column = record.append
                for colname, label in labels:
                    append_column((label, row[colname]))
                append_record(record)

            if "new" in notify_on and len(new):
                output["new"] = len(new)
                output["new_records"] = new
            else:
                output["new"] = None
            if "upd" in notify_on and len(upd):
                output["upd"] = len(upd)
                output["upd_records"] = upd
            else:
                output["upd"] = None

        output.update(meta_data)
        return output