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))
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
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
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))
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
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)
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
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()
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
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()