Exemple #1
0
 def headers(self):
     return DataTablesHeader(
         DataTablesColumn('Region', sortable=False),
         DataTablesColumn('District', sortable=False),
         DataTablesColumn('Site', sortable=False),
         DataTablesColumnGroup(
             u'Patients Agés de - 5 Ans',
             DataTablesColumn('Nombre Total de cas vus (toutes affections confondues)', sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme', sortable=False),
             DataTablesColumn('Nombre de Tests (TDR) réalisés', sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés', sortable=False)
         ),
         DataTablesColumnGroup(
             u'Patients Agés de 5 ans et +',
             DataTablesColumn('Nombre Total de cas vus (toutes affections confondues)', sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme', sortable=False),
             DataTablesColumn('Nombre de Tests (TDR) réalisés', sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés', sortable=False)
         ),
         DataTablesColumnGroup(
             u'Femmes Enceintes MALADES',
             DataTablesColumn('Nombre Total de cas vus (toutes affections confondues)', sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme', sortable=False),
             DataTablesColumn('Nombre de Tests (TDR) réalisés', sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés', sortable=False)
         ),
         DataTablesColumnGroup(
             u'TOTAL',
             DataTablesColumn('Nombre Total de cas vus (toutes affections confondues)', sortable=False),
             DataTablesColumn('Nombre de cas Suspects. de paludisme (A)', sortable=False),
             DataTablesColumn('Nombre de Tests (TDR) réalisés (B)', sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés (P)', sortable=False),
             DataTablesColumn('Taux de Réalisation des TDR (B) / (A)', sortable=False)
         )
     )
Exemple #2
0
 def headers(self):
     return DataTablesHeader(
         DataTablesColumn("Date"),
         DataTablesColumnGroup(
             "Credit Line",
             DataTablesColumn("Account"),
             DataTablesColumn("Subscription"),
             DataTablesColumn("Product Type"),
             DataTablesColumn("Feature Type"),
         ),
         DataTablesColumn("Project Space"),
         DataTablesColumn("Reason"),
         DataTablesColumn("Invoice"),
         DataTablesColumn("Note"),
         DataTablesColumn("Amount"),
         DataTablesColumn("New Balance"),
         DataTablesColumn("By User"),
         DataTablesColumnGroup(
             "Related Credit Line",
             DataTablesColumn("Account"),
             DataTablesColumn("Subscription"),
             DataTablesColumn("Product Type"),
             DataTablesColumn("Feature Type"),
         ),
     )
 def headers(self):
     columns = [
         DataTablesColumn("", sortable=False),
         DataTablesColumn(_("Number"),
                          help_text=_("Number of individual items")),
     ]
     columns.append(
         DataTablesColumnGroup(
             "",
             DataTablesColumn(
                 _("Mobile Worker Messages"),
                 help_text=
                 _("SMS Messages to or from mobile workers' phones, incoming and outgoing"
                   )),
             DataTablesColumn(
                 _("Case Messages"),
                 help_text=
                 _("SMS Messages to or from a phone number in a case, incoming and outgoing"
                   ))))
     columns.append(
         DataTablesColumnGroup(
             "",
             DataTablesColumn(_("Incoming"),
                              help_text=_("Total incoming SMS")),
             DataTablesColumn(_("Outgoing"),
                              help_text=_("Total outgoing SMS"))))
     return DataTablesHeader(*columns)
Exemple #4
0
    def headers(self):
        startdate = self.datespan.startdate
        enddate = self.datespan.enddate

        column_headers = []
        group_by = self.group_by[:-2]
        for place in group_by:
            column_headers.append(DataTablesColumn(place.capitalize()))
        column_headers.append(DataTablesColumn("Disease"))

        prev_month = startdate.month
        month_columns = [startdate.strftime(USER_MONTH_FORMAT)]
        for n, day in enumerate(self.daterange(startdate, enddate)):
            day_obj = iso_string_to_date(day)
            month = day_obj.month
            day_column = DataTablesColumn("Day%(n)s (%(day)s)" % {
                'n': n + 1,
                'day': day
            })

            if month == prev_month:
                month_columns.append(day_column)
            else:
                month_group = DataTablesColumnGroup(*month_columns)
                column_headers.append(month_group)
                month_columns = [
                    day_obj.strftime(USER_MONTH_FORMAT), day_column
                ]
                prev_month = month

        month_group = DataTablesColumnGroup(*month_columns)
        column_headers.append(month_group)

        return DataTablesHeader(*column_headers)
Exemple #5
0
    def headers(self, data):
        column_headers = []
        groupped_headers = [
            list(v) for l, v in groupby(
                sorted(data.keys(), key=lambda x: x[2]), lambda x: x[2])
        ]
        for domain in groupped_headers:
            groupped_practices = [
                list(v) for l, v in groupby(sorted(domain, key=lambda x: x[3]),
                                            lambda x: x[3])
            ]
            domain_group = DataTablesColumnGroup(
                self.group_name_fn(domain[0][2]))
            for practice in groupped_practices:
                domain_group.add_column(
                    DataTablesColumn(self.group_name_fn(practice[0][3])))

            column_headers.append(domain_group)
        column_headers = sorted(column_headers, key=lambda x: x.html)

        i = 1
        for column in column_headers:
            for j in range(0, len(column.columns)):
                column.columns[j] = DataTablesColumn(
                    'Practice ' + i.__str__(),
                    help_text=column.columns[j].html)
                i += 1

        return column_headers
Exemple #6
0
 def headers(self, data):
     headers = DataTablesHeader(
         DataTablesColumnGroup('Domain', DataTablesColumn('Practice')),
         DataTablesColumnGroup('Total', DataTablesColumn('Total')))
     for column in super(TableCardReportIndividualPercentSqlData,
                         self).headers(data):
         headers.add_column(column)
     return headers
Exemple #7
0
 def headers(self, data):
     column_headers = []
     i = 1
     for domain in self.domains_with_practices:
         domain_group = DataTablesColumnGroup(domain['text'])
         for practice in domain['practices']:
             domain_group.add_column(DataTablesColumn('Practice %i' % i, help_text=practice.text))
             i += 1
         column_headers.append(domain_group)
     return column_headers
Exemple #8
0
 def headers(self):
     headers = DataTablesHeader(DataTablesColumn(_("CHW Name")),
                                DataTablesColumn(_("Child Name"), sortable=False),
                                DataTablesColumn(_("Father and Mother Name"), sortable=False),
                                DataTablesColumnGroup(
                                    _("Beneficiary Information"),
                                    DataTablesColumn(_("Mother's MCTS ID"), sortable=False),
                                    DataTablesColumn(_("Gender"), sortable=False),
                                    DataTablesColumn(_("City/ward/village"), sortable=False),
                                    DataTablesColumn(_("Address"), sortable=False),
                                    DataTablesColumn(_("Mobile number"), sortable=False),
                                    DataTablesColumn(_("Whose Mobile Number"), sortable=False),
                                    DataTablesColumn(_("DOB / AGE"), sortable=False),
                                    DataTablesColumn(_("Place of delivery (home - SBA/Non-SBA) (Hospital -  public/private)"), sortable=False),
                                    DataTablesColumn(_("Caste"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("Provider Information"),
                                    DataTablesColumn(_("ASHA Name"), sortable=False),
                                    DataTablesColumn(_("Asha phone"), sortable=False),
                                    DataTablesColumn(_("AWC Code , AWC name"), sortable=False),
                                    DataTablesColumn(_("AWW name"), sortable=False),
                                    DataTablesColumn(_("AWW phone number"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("At Birth"),
                                    DataTablesColumn(_("BCG"), sortable=False),
                                    DataTablesColumn(_("OPV0"), sortable=False),
                                    DataTablesColumn(_("Hepatitis-Birth dose "), sortable=False)),
                                DataTablesColumnGroup(
                                    _("At 6 Weeks"),
                                    DataTablesColumn(_("DPT1"), sortable=False),
                                    DataTablesColumn(_("OPV1"), sortable=False),
                                    DataTablesColumn(_("Hepatitis-B1"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("At 10 Weeks"),
                                    DataTablesColumn(_("DPT2"), sortable=False),
                                    DataTablesColumn(_("OPV2"), sortable=False),
                                    DataTablesColumn(_("Hepatitis-B2"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("At 14 Weeks"),
                                    DataTablesColumn(_("DPT3"), sortable=False),
                                    DataTablesColumn(_("OPV3"), sortable=False),
                                    DataTablesColumn(_("Hepatitis-B3"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("Between 9-12 Months"),
                                    DataTablesColumn(_("Measles (1st  dose)"), sortable=False)),
                                DataTablesColumnGroup(
                                    _("Between 16-24 Months"),
                                    DataTablesColumn(
                                        _("Vitamin A dose-1 "), sortable=False),
                                    DataTablesColumn(_("Measles (2nd dose)/ MR Vaccine"))),
                                DataTablesColumnGroup(
                                    _("After 2 Years"),
                                    DataTablesColumn(_("DPT Booster"), sortable=False),
                                    DataTablesColumn(_("OPV Booster"), sortable=False),
                                    DataTablesColumn(_("Vitamin A dose-2"), sortable=False),
                                    DataTablesColumn(_("Vitamin A dose-3"), sortable=False),
                                    DataTablesColumn(_("JE Vaccine"), sortable=False))
     )
     return headers
    def headers(self):
        headers = DataTablesHeader(*[
            DataTablesColumn('', sortable=False, sort_type="title-numeric"),
            DataTablesColumnGroup(_('ASHAs'), DataTablesColumn(_('Name of ASHAs'), sortable=False)),
        ])

        for index, v in enumerate(self.ashas):
            headers.add_column(DataTablesColumnGroup(index + 1,
                                                     DataTablesColumn(v['hv_asha_name'], sortable=False)))
        headers.add_column(DataTablesColumn('', sortable=False))
        return headers
Exemple #10
0
    def headers(self, data):
        column_headers = []
        groupped_headers = [list(v) for l,v in groupby(sorted(data.keys(), key=lambda x:x[2]), lambda x: x[2])]
        for domain in groupped_headers:
            groupped_practices = [list(v) for l,v in groupby(sorted(domain, key=lambda x:x[3]), lambda x: x[3])]
            domain_group = DataTablesColumnGroup(self.group_name_fn(domain[0][2]))
            for practice in groupped_practices:
                domain_group.add_column(DataTablesColumn(self.group_name_fn(practice[0][3])))

            column_headers.append(domain_group)
        column_headers = sorted(column_headers, key=lambda x: x.html)
        return column_headers
Exemple #11
0
 def headers(self):
     blocks = self.get_blocks_for_district()
     headers = [DataTablesColumnGroup('')]
     headers.extend([DataTablesColumnGroup(block) for block in self.get_blocks_for_district()])
     columns = [DatabaseColumn(_("Percentage of ASHAs functional on "
                               "(Number of functional ASHAs/total number of ASHAs) x 100"), SimpleColumn(''),
                               header_group=headers[0])]
     for i, block in enumerate(blocks):
         columns.append(DatabaseColumn(_('%s of ASHAs') % '%',
                                       SimpleColumn(block), header_group=headers[i + 1]))
         columns.append(DatabaseColumn(_('Grade of Block'), SimpleColumn(block), header_group=headers[i + 1]))
     return DataTablesHeader(*headers)
Exemple #12
0
 def headers(self):
     return NoSortDataTablesHeader(
         DataTablesColumn('Type of Patient'),
         DataTablesColumnGroup(
             _('Cured'), DataTablesColumn('1')
         ),
         DataTablesColumnGroup(
             _('Treatment Completed'), DataTablesColumn('2')
         ),
         DataTablesColumnGroup(
             _('Died'), DataTablesColumn('3')
         ),
         DataTablesColumnGroup(
             _('Treatment Failure'), DataTablesColumn('4')
         ),
         DataTablesColumnGroup(
             _('Lost to follow up'), DataTablesColumn('5')
         ),
         DataTablesColumnGroup(
             _('Regimen changed'), DataTablesColumn('6')
         ),
         DataTablesColumnGroup(
             _('Not evaluated'), DataTablesColumn('7')
         ),
         DataTablesColumnGroup(
             _('Total'), DataTablesColumn('')
         )
     )
 def headers(self):
     return DataTablesHeader(
         DataTablesColumn('Region', sortable=False),
         DataTablesColumn('District', sortable=False),
         DataTablesColumn('Site', sortable=False),
         DataTablesColumnGroup(
             u'Patients Agés de - 5 Ans',
             DataTablesColumn(
                 'Nombre Total de cas vus (toutes affections confondues)',
                 sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme',
                              sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés',
                              sortable=False)),
         DataTablesColumnGroup(
             u'Patients Agés de 5 - 10 ans',
             DataTablesColumn(
                 'Nombre Total de cas vus (toutes affections confondues)',
                 sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme',
                              sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés',
                              sortable=False)),
         DataTablesColumnGroup(
             u'Patients Agés de 10 ans et +',
             DataTablesColumn(
                 'Nombre Total de cas vus (toutes affections confondues)',
                 sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme',
                              sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés',
                              sortable=False)),
         DataTablesColumnGroup(
             u'Femmes Enceintes MALADES',
             DataTablesColumn(
                 'Nombre Total de cas vus (toutes affections confondues)',
                 sortable=False),
             DataTablesColumn('Nombre de cas Suspects de paludisme',
                              sortable=False),
             DataTablesColumn('Nombre de cas de paludisme confirmés',
                              sortable=False)),
         DataTablesColumnGroup(
             u'Rapport par Catégorie',
             DataTablesColumn('Total Cas', sortable=False),
             DataTablesColumn('% des Moins de 5 ans', sortable=False),
             DataTablesColumn('% des 5 - 10 ans', sortable=False),
             DataTablesColumn('% des Plus de 10 ans', sortable=False),
             DataTablesColumn('% des Femmes Enceinte', sortable=False)),
         DataTablesColumn('Zones', sortable=False))
Exemple #14
0
 def headers(self):
     chw = DataTablesColumn("CHW Name")
     sections = list()
     for i, section in enumerate(self.indicator_slugs):
         col_group = DataTablesColumnGroup(section.get('title', ''))
         for j, indicator in enumerate(self.indicators[i]):
             col_group.add_column(
                 DataTablesColumn(
                     indicator.title or indicator.description,
                     rotate=True,
                     expected=section.get('indicators',
                                          [])[j].get('expected'),
                 ))
         sections.append(col_group)
     return DataTablesHeader(chw, *sections)
Exemple #15
0
 def headers(self):
     chw = DataTablesColumn("CHW Name")
     sections = list()
     for i, section in enumerate(self.indicator_slugs):
         col_group = DataTablesColumnGroup(section.get("title", ""))
         for j, indicator in enumerate(self.indicators[i]):
             col_group.add_column(
                 DataTablesColumn(
                     indicator.title or indicator.description,
                     rotate=True,
                     expected=section.get("indicators", [])[j].get("expected"),
                 )
             )
         sections.append(col_group)
     return DataTablesHeader(chw, *sections)
Exemple #16
0
 def columns(self):
     cat_group = DataTablesColumnGroup("Category of abuse")
     return [
         self.location_column,
         DatabaseColumn("Physical",
                        SumColumn('abuse_category_physical_total'),
                        header_group=cat_group),
         DatabaseColumn("Sexual",
                        SumColumn('abuse_category_sexual_total'),
                        header_group=cat_group),
         DatabaseColumn("Emotional",
                        SumColumn('abuse_category_psychological_total'),
                        header_group=cat_group),
         DatabaseColumn("Neglect",
                        SumColumn('abuse_category_neglect_total'),
                        header_group=cat_group),
         DatabaseColumn("Exploitation",
                        SumColumn('abuse_category_exploitation_total'),
                        header_group=cat_group),
         DatabaseColumn("Other",
                        SumColumn('abuse_category_other_total'),
                        header_group=cat_group),
         DatabaseColumn("Total incidents reported",
                        SumColumn('abuse_category_total_total'),
                        header_group=cat_group)
     ]
    def headers(self):
        column_headers = [DataTablesColumn(loc.capitalize()) for loc in self.group_by[:-2]]
        test_lots_map = self.test_lots_map
        for test in self.selected_tests:
            lots_headers = [test]
            lots = test_lots_map.get(test, None)
            if not lots:
                lots_headers.append(DataTablesColumn("NO-LOTS"))
                column_headers.append(DataTablesColumnGroup(*lots_headers))
                continue
            for lot in lots:
                lots_headers.append(DataTablesColumn(str(lot)))
            lots_headers.append(DataTablesColumn("TOTAL"))
            column_headers.append(DataTablesColumnGroup(*lots_headers))

        return DataTablesHeader(*column_headers)
Exemple #18
0
 def headers(self):
     return DataTablesHeader(
         DataTablesColumn("Invoice #"),
         DataTablesColumn("Account Name (Fogbugz Client Name)"),
         DataTablesColumn("Project Space"),
         DataTablesColumn("New This Month?"),
         DataTablesColumn("Company Name"),
         DataTablesColumn("Emails"),
         DataTablesColumn("First Name"),
         DataTablesColumn("Last Name"),
         DataTablesColumn("Phone Number"),
         DataTablesColumn("Address Line 1"),
         DataTablesColumn("Address Line 2"),
         DataTablesColumn("City"),
         DataTablesColumn("State/Province/Region"),
         DataTablesColumn("Postal Code"),
         DataTablesColumn("Country"),
         DataTablesColumnGroup("Statement Period",
                               DataTablesColumn("Start"),
                               DataTablesColumn("End")),
         DataTablesColumn("Date Due"),
         DataTablesColumn("Total"),
         DataTablesColumn("Amount Due"),
         DataTablesColumn("Payment Status"),
         DataTablesColumn("Do Not Invoice"),
     )
Exemple #19
0
 def headers(self):
     columns = [DataTablesColumn(_("Users"))]
     for landmark in self.landmarks:
         num_cases = DataTablesColumn(
             _("# Modified or Closed"),
             sort_type=DTSortType.NUMERIC,
             help_text=_(
                 "The number of cases that have been modified between %d days ago and today."
                 % landmark.days))
         proportion = DataTablesColumn(
             _("Proportion"),
             sort_type=DTSortType.NUMERIC,
             help_text=_(
                 "The number of modified cases / (#active + #closed cases in the last %d days)."
                 % landmark.days))
         columns.append(
             DataTablesColumnGroup(
                 _("Cases in Last %s Days") %
                 landmark.days if landmark else _("Ever"), num_cases,
                 proportion))
     columns.append(
         DataTablesColumn(
             _("# Active Cases"),
             sort_type=DTSortType.NUMERIC,
             help_text=
             _('Number of cases modified in the last %s days that are still open'
               ) % self.milestone.days))
     columns.append(
         DataTablesColumn(
             _("# Inactive Cases"),
             sort_type=DTSortType.NUMERIC,
             help_text=
             _("Number of cases that are open but haven't been touched in the last %s days"
               ) % self.milestone.days))
     return DataTablesHeader(*columns)
Exemple #20
0
 def headers(self, data):
     headers = DataTablesHeader(*[
         DataTablesColumnGroup('Domain', DataTablesColumn('Practice')),
     ])
     for column in super(TableCardReportGrouppedPercentSqlData,
                         self).headers(data):
         headers.add_column(column)
     return headers
Exemple #21
0
    def headers(self):
        header = DataTablesHeader()
        columns = self.model.columns
        if self.model.have_groups:
            header.add_column(DataTablesColumnGroup('', columns[0].data_tables_column))
        else:
            header.add_column(columns[0].data_tables_column)

        self.groups = SQLProduct.objects.filter(domain=self.domain, is_archived=False)
        for group in self.groups:
            if self.model.have_groups:
                header.add_column(DataTablesColumnGroup(group.name,
                    *[columns[j].data_tables_column for j in xrange(1, len(columns))]))
            else:
                header.add_column(DataTablesColumn(group.name))

        return header
Exemple #22
0
    def headers(self, data):
        column_headers = []
        groupped_headers = [list(v) for l,v in groupby(sorted(data.keys(), key=lambda x:x[2]), lambda x: x[2])]
        for domain in groupped_headers:
            groupped_practices = [list(v) for l,v in groupby(sorted(domain, key=lambda x:x[3]), lambda x: x[3])]
            domain_group = DataTablesColumnGroup(self.group_name_fn(domain[0][2]))
            for practice in groupped_practices:
                domain_group.add_column(DataTablesColumn(self.group_name_fn(practice[0][3])))

            column_headers.append(domain_group)
        column_headers = sorted(column_headers, key=lambda x: x.html)

        i = 1
        for column in column_headers:
            for j in range(0, len(column.columns)):
                column.columns[j] = DataTablesColumn('Practice ' + i.__str__(), help_text=column.columns[j].html)
                i += 1

        return column_headers
    def headers(self):
        region = DataTablesColumn("Region")
        district = DataTablesColumn("District")
        site = DataTablesColumn("Site")
        num_births = DataTablesColumn("No. Birth Events Recorded")
        num_referred_in_births = DataTablesColumn("No. Referred In Births")

        maternal_deaths = DataTablesColumn("Maternal Deaths",
                                           sort_type=DTSortType.NUMERIC)
        maternal_near_miss = DataTablesColumn("Maternal Near Miss",
                                              sort_type=DTSortType.NUMERIC)
        still_births = DataTablesColumn("Still Births",
                                        sort_type=DTSortType.NUMERIC)
        neonatal_mortality = DataTablesColumn("Neonatal Mortality",
                                              sort_type=DTSortType.NUMERIC)

        outcomes_on_discharge = DataTablesColumnGroup("Outcomes on Discharge",
                                                      maternal_deaths,
                                                      maternal_near_miss,
                                                      still_births,
                                                      neonatal_mortality)
        outcomes_on_discharge.css_span = 2

        outcomes_on_7days = DataTablesColumnGroup("Outcomes on 7 Days",
                                                  maternal_deaths,
                                                  maternal_near_miss,
                                                  still_births,
                                                  neonatal_mortality)
        outcomes_on_7days.css_span = 2

        positive_outcomes = DataTablesColumnGroup("Total Positive Outcomes",
                                                  maternal_deaths,
                                                  maternal_near_miss,
                                                  still_births,
                                                  neonatal_mortality)
        positive_outcomes.css_span = 2

        primary_outcome = DataTablesColumn("Primary Outcome Yes")
        negative_outcome = DataTablesColumn("Primary Outcome No")
        lost = DataTablesColumn("Lost to Followup")

        return DataTablesHeader(region, district, site, num_births,
                                num_referred_in_births, outcomes_on_discharge,
                                outcomes_on_7days, positive_outcomes,
                                primary_outcome, negative_outcome, lost)
Exemple #24
0
    def headers(self):
        """
        Override the headers method to be able to add male/female sub
        header columns.
        """
        header_columns = []
        for idx, column in enumerate(self.columns):
            if idx >= self.first_indicator_column_index() and self.show_gender(
            ):
                group = DataTablesColumnGroup(column.header)
                group.add_column(DataTablesColumn("male", sortable=False))
                group.add_column(DataTablesColumn("female", sortable=False))
                header_columns.append(group)
            else:
                # gender is included in the columns to populate data
                # but we don't show it on the page
                if column.header != 'Gender':
                    header_columns.append(
                        DataTablesColumn(column.header, sortable=False))

        # insert a blank header to display the "all genders/ages" message
        if not self.show_gender() and not self.show_age():
            header_columns.insert(1, DataTablesColumn('', sortable=False))

        return DataTablesHeader(*header_columns)
Exemple #25
0
    def headers(self):
        header = DataTablesHeader()
        columns = self.model.columns
        if self.model.have_groups:
            header.add_column(
                DataTablesColumnGroup('', columns[0].data_tables_column))
        else:
            header.add_column(columns[0].data_tables_column)

        self.groups = [group.name for group in Product.by_domain(self.domain)]
        for group in self.groups:
            if self.model.have_groups:
                header.add_column(
                    DataTablesColumnGroup(
                        group, *[
                            columns[j].data_tables_column
                            for j in xrange(1, len(columns))
                        ]))
            else:
                header.add_column(DataTablesColumn(group))

        return header
Exemple #26
0
    def headers(self):
        """
        Override the headers method to be able to add male/female sub
        header columns.
        """
        header_columns = []
        for idx, column in enumerate(self.columns):
            if idx >= self.first_indicator_column_index() and self.show_gender():
                group = DataTablesColumnGroup(column.header)
                group.add_column(DataTablesColumn("male", sortable=False))
                group.add_column(DataTablesColumn("female", sortable=False))
                header_columns.append(group)
            else:
                # gender is included in the columns to populate data
                # but we don't show it on the page
                if column.header != 'Gender':
                    header_columns.append(DataTablesColumn(column.header, sortable=False))

        # insert a blank header to display the "all genders/ages" message
        if not self.show_gender() and not self.show_age():
            header_columns.insert(1, DataTablesColumn('', sortable=False))

        return DataTablesHeader(*header_columns)
Exemple #27
0
    def columns(self):
        user = DatabaseColumn("User", "user_id", column_type=SimpleColumn)
        columns = [user]

        if not self.show_gender() and not self.show_age():
            # hack: we have to give it a column type so there are no errors
            # but this isn't a column we let be auto populated anyway
            columns.append(
                DatabaseColumn("", "gender", column_type=SimpleColumn))
        if self.show_gender():
            columns.append(
                DatabaseColumn("Gender", "gender", column_type=SimpleColumn))
        if self.show_age():
            columns.append(
                DatabaseColumn("Age", "age_group", column_type=SimpleColumn))

        for column_attrs in self.report_columns:
            text, name = column_attrs[:2]
            name = '%s_total' % name
            if len(column_attrs) == 2:
                group = DataTablesColumnGroup(text)
                column = DatabaseColumn(text, name, header_group=group)
                if self.show_gender():
                    column = DatabaseColumn('%s (male)' % text,
                                            name,
                                            header_group=group)
                    column2 = DatabaseColumn('%s (female)' % text,
                                             name,
                                             header_group=group,
                                             alias='%s_b' % name)
            else:
                # if there are more than 2 values, the third is the column
                # class override
                column = DatabaseColumn(text, name, column_attrs[2])
                if self.show_gender():
                    column = DatabaseColumn('%s (male)' % text, name,
                                            column_attrs[2])
                    column2 = DatabaseColumn('%s (female)' % text,
                                             name,
                                             header_group=group,
                                             alias='%s_b' % name)

            columns.append(column)
            # hacky but double the column if we are sorting by gender
            if self.show_gender():
                columns.append(column2)

        return columns
Exemple #28
0
    def headers(self):

        maternal_deaths = NumericColumn("Maternal Deaths")
        maternal_near_miss = NumericColumn("Maternal Near Miss")
        still_births = NumericColumn("Still Births")
        neonatal_mortality = NumericColumn("Neonatal Mortality")

        outcomes_on_discharge = DataTablesColumnGroup("Outcomes on Discharge",
            maternal_deaths,
            still_births,
            neonatal_mortality)
        outcomes_on_discharge.css_span = 2

        outcomes_on_7days = DataTablesColumnGroup("Outcomes at 7 Days",
            maternal_deaths,
            maternal_near_miss,
            still_births,
            neonatal_mortality)
        outcomes_on_7days.css_span = 2

        positive_outcomes = DataTablesColumnGroup("Total Positive Outcomes",
            maternal_deaths,
            maternal_near_miss,
            still_births,
            neonatal_mortality)
        positive_outcomes.css_span = 2

        return DataTablesHeader(
            DataTablesColumn("Region"),
            DataTablesColumn("District"),
            DataTablesColumn("Site"),
            NumericColumn("Birth Events"),
            NumericColumn("Referred In Births"),
            outcomes_on_discharge,
            outcomes_on_7days,
            positive_outcomes,
            NumericColumn("Primary Outcome Yes"),
            NumericColumn("Primary Outcome No"),
            NumericColumn("Lost to Follow Up")
        )
Exemple #29
0
    def headers(self):
        header = DataTablesHeader(
            DataTablesColumn("Invoice #"),
            DataTablesColumn("Account Name (Fogbugz Client Name)"),
            DataTablesColumn("Subscription"),
            DataTablesColumn("Project Space"),
            DataTablesColumn("New This Month?"),
            DataTablesColumn("Company Name"),
            DataTablesColumn("Emails"),
            DataTablesColumn("First Name"),
            DataTablesColumn("Last Name"),
            DataTablesColumn("Phone Number"),
            DataTablesColumn("Address Line 1"),
            DataTablesColumn("Address Line 2"),
            DataTablesColumn("City"),
            DataTablesColumn("State/Province/Region"),
            DataTablesColumn("Postal Code"),
            DataTablesColumn("Country"),
            DataTablesColumn("Salesforce Account ID"),
            DataTablesColumn("Salesforce Contract ID"),
            DataTablesColumnGroup("Statement Period",
                                  DataTablesColumn("Start"),
                                  DataTablesColumn("End")),
            DataTablesColumn("Date Due"),
            DataTablesColumn("Plan Cost"),
            DataTablesColumn("Plan Credits"),
            DataTablesColumn("SMS Cost"),
            DataTablesColumn("SMS Credits"),
            DataTablesColumn("User Cost"),
            DataTablesColumn("User Credits"),
            DataTablesColumn("Total"),
            DataTablesColumn("Total Credits"),
            DataTablesColumn("Amount Due"),
            DataTablesColumn("Payment Status"),
            DataTablesColumn("Do Not Invoice"),
        )

        if not self.is_rendered_as_email:
            header.add_column(DataTablesColumn("Action"))
            header.add_column(DataTablesColumn("View Invoice"))
        return header
Exemple #30
0
    def headers(self):
        region = DataTablesColumn("Region")
        district = DataTablesColumn("District")
        site = DataTablesColumn("Site")
        num_births = DataTablesColumn("No. Birth Events Recorded")
        num_referred_in_births = DataTablesColumn("No. Referred In Births")

        maternal_deaths = DataTablesColumn("Maternal Deaths", sort_type=DTSortType.NUMERIC)
        maternal_near_miss = DataTablesColumn("Maternal Near Miss", sort_type=DTSortType.NUMERIC)
        still_births = DataTablesColumn("Still Births", sort_type=DTSortType.NUMERIC)
        neonatal_mortality = DataTablesColumn("Neonatal Mortality", sort_type=DTSortType.NUMERIC)

        outcomes_on_discharge = DataTablesColumnGroup("Outcomes on Discharge",
            maternal_deaths,
            maternal_near_miss,
            still_births,
            neonatal_mortality)
        outcomes_on_discharge.css_span = 2

        outcomes_on_7days = DataTablesColumnGroup("Outcomes on 7 Days",
            maternal_deaths,
            maternal_near_miss,
            still_births,
            neonatal_mortality)
        outcomes_on_7days.css_span = 2

        positive_outcomes = DataTablesColumnGroup("Total Positive Outcomes",
            maternal_deaths,
            maternal_near_miss,
            still_births,
            neonatal_mortality)
        positive_outcomes.css_span = 2

        primary_outcome = DataTablesColumn("Primary Outcome Yes")
        negative_outcome = DataTablesColumn("Primary Outcome No")
        lost = DataTablesColumn("Lost to Followup")

        return DataTablesHeader(region,
            district,
            site,
            num_births,
            num_referred_in_births,
            outcomes_on_discharge,
            outcomes_on_7days,
            positive_outcomes,
            primary_outcome,
            negative_outcome,
            lost)
Exemple #31
0
 def headers(self):
     return DataTablesHeader(
         DataTablesColumn('Category'), DataTablesColumn('PW'),
         DataTablesColumn('LM'),
         DataTablesColumnGroup('Children 0-5 months', DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumnGroup('Children 6-11 months',
                               DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumnGroup('Children 12-35 months',
                               DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumnGroup('Children 36-59 months',
                               DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumnGroup('Children 60-71 months',
                               DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumnGroup('All Children 0-71 months',
                               DataTablesColumn('B'),
                               DataTablesColumn('G')),
         DataTablesColumn('AG'))
Exemple #32
0
    def columns(self):
        female_range_group = DataTablesColumnGroup(
            "Female Positive Tests (% positive)")
        male_range_group = DataTablesColumnGroup(
            "Male Positive Tests (% positive)")

        def age_range_filter(gender, age_from, age_to):
            return [
                AND([
                    EQ("gender", gender),
                    EQ("diagnosis", "positive"),
                    BETWEEN("age", age_from, age_to)
                ])
            ]

        def generate_columns(gender):
            age_range_group = male_range_group if gender is "male" else female_range_group
            return [
                AggregateColumn(
                    "0-10",
                    self.percent_fn, [
                        CountColumn('doc_id',
                                    alias="zero_ten_" + gender,
                                    filters=self.filters +
                                    age_range_filter(gender, "zero", "ten")),
                        AliasColumn(gender + "_total")
                    ],
                    header_group=age_range_group,
                    sort_type=DTSortType.NUMERIC),
                AggregateColumn(
                    "10-20",
                    self.percent_fn, [
                        CountColumn(
                            'doc_id',
                            alias="ten_twenty_" + gender,
                            filters=self.filters +
                            age_range_filter(gender, "ten_plus", "twenty")),
                        AliasColumn(gender + "_total")
                    ],
                    header_group=age_range_group,
                    sort_type=DTSortType.NUMERIC),
                AggregateColumn(
                    "20-50",
                    self.percent_fn, [
                        CountColumn(
                            'doc_id',
                            alias="twenty_fifty_" + gender,
                            filters=self.filters +
                            age_range_filter(gender, "twenty_plus", "fifty")),
                        AliasColumn(gender + "_total")
                    ],
                    header_group=age_range_group,
                    sort_type=DTSortType.NUMERIC),
                AggregateColumn(
                    "50+",
                    self.percent_fn, [
                        CountColumn('doc_id',
                                    alias="fifty_" + gender,
                                    filters=self.filters + [
                                        AND([
                                            EQ("gender", gender),
                                            EQ("diagnosis", "positive"),
                                            GT("age", "fifty")
                                        ])
                                    ]),
                        AliasColumn(gender + "_total")
                    ],
                    header_group=age_range_group,
                    sort_type=DTSortType.NUMERIC),
                AggregateColumn(
                    "Total",
                    self.percent_fn, [
                        CountColumn('doc_id',
                                    alias="positive_total_" + gender,
                                    filters=self.filters + [
                                        AND([
                                            EQ("gender", gender),
                                            EQ("diagnosis", "positive")
                                        ])
                                    ]),
                        CountColumn(
                            'doc_id',
                            alias=gender + "_total",
                            filters=self.filters + [EQ("gender", gender)]),
                    ],
                    header_group=age_range_group,
                    sort_type=DTSortType.NUMERIC),
            ]

        totals_group = DataTablesColumnGroup("Total tests")
        sum_fn = lambda x, y: int(x or 0) + int(y or 0)

        return self.common_columns + [
            DatabaseColumn("Males ",
                           AliasColumn("male_total"),
                           header_group=totals_group),
            DatabaseColumn("Females ",
                           AliasColumn("female_total"),
                           header_group=totals_group),
            AggregateColumn(
                "Total",
                sum_fn,
                [AliasColumn("male_total"),
                 AliasColumn("female_total")],
                header_group=totals_group),
        ] + generate_columns("male") + generate_columns("female")
Exemple #33
0
    def columns(self):
        sum_fn = lambda x, y: int(x or 0) + int(y or 0)

        total_percent_agg_fn = lambda f_pos, m_pos, f_tot, m_tot: dict(sort_key=sum_fn(f_pos, m_pos), html="%(x)s (%(p)s%%)" % \
            {
                "x": sum_fn(f_pos, m_pos),
                "p": (100 * sum_fn(f_pos, m_pos) / (sum_fn(m_tot, f_tot) or 1))
            })

        patient_number_group = DataTablesColumnGroup("Tests")
        positive_group = DataTablesColumnGroup("Positive Tests")
        age_range_group = DataTablesColumnGroup("Age Range")

        male_filter = EQ("gender", "male")
        female_filter = EQ("gender", "female")

        columns = self.common_columns + [
            DatabaseColumn("Number of Males ",
                           CountColumn('doc_id',
                                       alias="male-total",
                                       filters=self.filters + [male_filter]),
                           header_group=patient_number_group),
            DatabaseColumn("Number of Females ",
                           CountColumn('doc_id',
                                       alias="female-total",
                                       filters=self.filters + [female_filter]),
                           header_group=patient_number_group),
            AggregateColumn(
                "Total",
                sum_fn,
                [AliasColumn("male-total"),
                 AliasColumn("female-total")],
                header_group=patient_number_group),
            AggregateColumn(
                "Male +ve Percent",
                self.percent_agg_fn, [
                    CountColumn(
                        'doc_id',
                        alias="male-positive",
                        filters=self.filters +
                        [AND([male_filter,
                              EQ("diagnosis", "positive")])]),
                    AliasColumn("male-total")
                ],
                header_group=positive_group,
                sort_type=DTSortType.NUMERIC),
            AggregateColumn(
                "Female +ve Percent",
                self.percent_agg_fn, [
                    CountColumn(
                        'doc_id',
                        alias="female-positive",
                        filters=self.filters +
                        [AND([female_filter,
                              EQ("diagnosis", "positive")])]),
                    AliasColumn("female-total")
                ],
                header_group=positive_group,
                sort_type=DTSortType.NUMERIC),
            AggregateColumn("Total +ve Percent",
                            total_percent_agg_fn, [
                                AliasColumn("female-positive"),
                                AliasColumn("male-positive"),
                                AliasColumn("female-total"),
                                AliasColumn("male-total")
                            ],
                            header_group=positive_group,
                            sort_type=DTSortType.NUMERIC),
            AggregateColumn(
                "Male age range",
                functools.partial(self.age_fn, 'male'), [
                    MinColumn("age",
                              alias="male-min",
                              filters=self.filters + [male_filter]),
                    MaxColumn("age",
                              alias="male-max",
                              filters=self.filters + [male_filter])
                ],
                header_group=age_range_group),
            AggregateColumn(
                "Female age range",
                functools.partial(self.age_fn, 'female'), [
                    MinColumn("age",
                              alias="female-min",
                              filters=self.filters + [female_filter]),
                    MaxColumn("age",
                              alias="female-max",
                              filters=self.filters + [female_filter])
                ],
                header_group=age_range_group),
            AggregateColumn("All age range",
                            functools.partial(self.age_fn, 'total'), [
                                MinColumn("age",
                                          alias="age-min",
                                          filters=self.filters +
                                          [OR([female_filter, male_filter])]),
                                MaxColumn("age",
                                          alias="age-max",
                                          filters=self.filters +
                                          [OR([female_filter, male_filter])])
                            ],
                            header_group=age_range_group),
        ]

        if self.is_map:
            columns.append(
                DatabaseColumn("gps",
                               MaxColumn(self.gps_key),
                               format_fn=lambda x: x))
            disease = FixtureDataItem.get(
                self.disease[1]).fields_without_attributes[
                    'disease_name'] if self.disease else 'All diseases'
            columns.append(
                DatabaseColumn('disease', StaticColumn('disease', disease)))

        return columns
Exemple #34
0
class MandE(CareGroupReport):
    name = "M&E"
    slug = "cb_m_and_e"

    couch_view = "care_benin/by_village_case"

    default_column_order = (
        'village',

        'referrals_open_30_days',
        'ref_counter_ref_time',
        'danger_sign_knowledge_pregnancy',
        'danger_sign_knowledge_post_partum',
        'danger_sign_knowledge_newborn',
        'birth_place_mat_isolee',
        'birth_place_centre_de_sante',
        'birth_place_cs_arrondissement',
        'birth_place_cs_commune',
        'birth_place_hopital',
        'birth_place_domicile',
        'birth_place_clinique_privee',
        'birth_place_autre',

        'newlyRegisteredPregnant',
        'postPartumRegistration',
        'pregnant_followed_up',
        #'high_risk_pregnancy', #requires village in form
        #'anemic_pregnancy', #requires village in form
        #'stillborns', #requires village in form
        #'failed_pregnancy', #requires village in form
        #'maternal_death', #requires village in form
        #'child_death_7_days', #requires village in form
        'births_one_month_ago_bcg_polio',
        'births_vat2',
        'births_tpi2',
        'births_one_month_ago_follow_up_x0',
        'births_one_month_ago_follow_up_x1',
        'births_one_month_ago_follow_up_x2',
        'births_one_month_ago_follow_up_x3',
        'births_one_month_ago_follow_up_x4',
        'births_one_month_ago_follow_up_gt4',
        #'danger_sign_count_pregnancy', #requires village in form
        #'danger_sign_count_newborn', #requires village in form
        'births_cpn0',
        'births_cpn1',
        'births_cpn2',
        'births_cpn4',
    )

    village = Column(
        "Village", calculate_fn=groupname)

    ref_counter_ref_time = Column("Mean time between reference and counter reference", key="ref_counter_ref_time",
                                  reduce_fn=MeanTime(),
                                  help_text="Délai entre la référence et la contre référence des agents de santé")

    # birth
    birth_place_help = "Distribution des lieux d’accouchement par village"
    birth_place_group = DataTablesColumnGroup("Birth place")
    birth_place_mat_isolee = Column("Maternite Isolee", key="birth_place_mat_isolee",
                                    group=birth_place_group,
                                    help_text=birth_place_help)
    birth_place_centre_de_sante = Column("centre de santé", key="birth_place_centre_de_sante",
                                    group=birth_place_group,
                                    help_text=birth_place_help)
    birth_place_cs_arrondissement = Column("CS Arrondissement", key="birth_place_CS_arrondissement",
                                           group=birth_place_group,
                                           help_text=birth_place_help)
    birth_place_cs_commune = Column("CS Commune", key="birth_place_CS_commune",
                                    group=birth_place_group,
                                    help_text=birth_place_help)
    birth_place_hopital = Column("Hopital de zone", key="birth_place_hopital",
                                 group=birth_place_group,
                                 help_text=birth_place_help)
    birth_place_domicile = Column("Domicile", key="birth_place_domicile",
                                  group=birth_place_group,
                                  help_text=birth_place_help)
    birth_place_clinique_privee = Column("Clinique Privee", key="birth_place_clinique_privee",
                                         group=birth_place_group,
                                         help_text=birth_place_help)
    birth_place_autre = Column("Autre lieu", key="birth_place_autre",
                               group=birth_place_group,
                               help_text=birth_place_help)

    referrals_open_30_days = Column("Referrals open for more than one month", key="referrals_open_30_days",
                                    startkey_fn=lambda x: [],
                                    help_text="Nombre de cas de référence ouverts pendant plus d’un mois")

    #danger signs
    danger_sign_knowledge_group = DataTablesColumnGroup("Danger sign knowledge")
    danger_sign_knowledge_pregnancy = Column("Pregnancy danger sign knowledge",
                                             key="danger_sign_knowledge_pregnancy",
                                             startkey_fn=lambda x: [], group=danger_sign_knowledge_group,
                                             help_text="""Nombre de femmes qui connaissent au moins 3 signes
                                             de danger de la femme enceinte par village""")
    danger_sign_knowledge_post_partum = Column("Post-partum danger sign knowledge",
                                               key="danger_sign_knowledge_post_partum",
                                               startkey_fn=lambda x: [], group=danger_sign_knowledge_group,
                                               help_text="""Nombre de femmes qui connaissent au moins 3 signes
                                               de danger de la nouvelle accouchée par village""")
    danger_sign_knowledge_newborn = Column("Newborn danger sign knowledge",
                                           key="danger_sign_knowledge_newborn",
                                           startkey_fn=lambda x: [], group=danger_sign_knowledge_group,
                                           help_text="""Nombre de femmes qui connaissent au moins 3
                                           signes de danger du nouveau-né par village""")

    # pregnancy
    newlyRegisteredPregnant = Column("Newly Registered Women who are Pregnant",
                                     key="newly_registered_pregnant",
                                     help_text="""Nombre de cas de femmes enceintes
                                     enregistrées et ouverts par village""")

    pregnant_followed_up = Column("Pregnant women followed up on", key="pregnant_followed_up",
                                  startkey_fn=lambda x: [], endkey_fn=lambda x: [{}],
                                  help_text="Nombre de femmes enceintes suivies par village")

    high_risk_pregnancy = Column("High risk pregnancies", key="high_risk_pregnancy",
                                 couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                                 help_text="Nombre de grossesse à risque détectés par village")

    anemic_pregnancy = Column("Anemic pregnancies", key="anemic_pregnancy",
                              couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                              help_text="Nombre de femmes enceintes souffrant d’anémie par village")

    # birth
    postPartumRegistration = Column(
        "Post-partum mothers/newborn registrations", key="post_partum_registration",
        help_text="Nombre de cas de nouvelles accouchées enregistrées et ouverts par village")

    stillborns = Column("Stillborns", key="stillborn",
                        couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                        help_text="Nombre de mort-nés par village   Seulement pour les accouchements chez le CS")

    failed_pregnancy = Column("Failed pregnancies", key="pregnancy_failed",
                              couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                              help_text="""Nombre de fausses couches par village Est-ce que ça inclue
                        les grossesse échoués? – tout grosseses arreter avant 6m""")

    maternal_death = Column("Maternal deaths", key="maternal_death",
                            couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                            help_text="Nombre de décès maternels par village")

    child_death_7_days = Column("Babies died before 7 days", key="child_death_7_days",
                                couch_view="care_benin/by_village_form", startkey_fn=lambda x: [],
                                help_text="Nombre de décès d’enfants de moins de 7 jours par village ")

    births_total_view = KeyView(key="birth_one_month_ago")

    births_view_x0 = AggregateKeyView(combine_indicator,
                                      KeyView(key="birth_one_month_ago_followup_x0"),
                                      births_total_view)
    births_view_x1 = AggregateKeyView(combine_indicator,
                                      KeyView(key="birth_one_month_ago_followup_x1"),
                                      births_total_view)
    births_view_x2 = AggregateKeyView(combine_indicator,
                                      KeyView(key="birth_one_month_ago_followup_x2"),
                                      births_total_view)
    births_view_x3 = AggregateKeyView(combine_indicator,
                                      KeyView(key="birth_one_month_ago_followup_x3"),
                                      births_total_view)
    births_view_x4 = AggregateKeyView(combine_indicator,
                                      KeyView(key="birth_one_month_ago_followup_x4"),
                                      births_total_view)
    births_view_gt4 = AggregateKeyView(combine_indicator,
                                       KeyView(key="birth_one_month_ago_followup_gt4"),
                                       births_total_view)

    births_one_month_ago_follow_up_help = """Distribution des accouchées/nouveau-nés par nombre de visites
     de suivi pour les accouchements ayant eu lieu le mois précédent par village"""
    births_one_month_ago_follow_up_group = DataTablesColumnGroup("Birth followup percentages")
    births_one_month_ago_follow_up_x0 = Column(
        "Birth followups X0", key=births_view_x0, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)
    births_one_month_ago_follow_up_x1 = Column(
        "Birth followups X1", key=births_view_x1, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)
    births_one_month_ago_follow_up_x2 = Column(
        "Birth followups X2", key=births_view_x2, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)
    births_one_month_ago_follow_up_x3 = Column(
        "Birth followups X3", key=births_view_x3, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)
    births_one_month_ago_follow_up_x4 = Column(
        "Birth followups X4", key=births_view_x4, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)
    births_one_month_ago_follow_up_gt4 = Column(
        "Birth followups >4", key=births_view_gt4, group=births_one_month_ago_follow_up_group,
        help_text=births_one_month_ago_follow_up_help)

    birth_cpn_total = KeyView(key="birth_cpn_total")

    births_cpn0_view = AggregateKeyView(combine_indicator,
                                        KeyView(key='birth_cpn_0'),
                                        birth_cpn_total)
    births_cpn1_view = AggregateKeyView(combine_indicator,
                                        KeyView(key='birth_cpn_1'),
                                        birth_cpn_total)
    births_cpn2_view = AggregateKeyView(combine_indicator,
                                        KeyView(key='birth_cpn_2'),
                                        birth_cpn_total)
    births_cpn4_view = AggregateKeyView(combine_indicator,
                                        KeyView(key='birth_cpn_4'),
                                        birth_cpn_total)

    # TODO: no help text
    birth_cpn_group = DataTablesColumnGroup("Birth with CPN")
    births_cpn0 = Column("Birth with CPN0", key=births_cpn0_view, group=birth_cpn_group)
    births_cpn1 = Column("Birth with CPN1", key=births_cpn1_view, group=birth_cpn_group)
    births_cpn2 = Column("Birth with CPN2", key=births_cpn2_view, group=birth_cpn_group)
    births_cpn4 = Column("Birth with CPN4", key=births_cpn4_view, group=birth_cpn_group)

    births_vat2 = Column("Birth with VAT2", key="birth_vat_2", help_text="""Nombre de femmes enceintes
        ayant reçu 2 VAT avant l’accouchement par village""")
    births_tpi2 = Column("Birth with TPI2", key="birth_tpi_2", help_text="""Nombre de femmes enceintes
        ayant reçu la 2ème dose de TPI/SP avant l’accouchement par village""")

    births_one_month_ago_bcg_polio = Column("Births 2 months ago that got BCG polio",
                                            key='birth_one_month_ago_bcg_polio',
                                            help_text="""Nombre de nouveau-né ayant reçu la vaccination
                                            BCG/Polio pour les nouveau-nés nés le mois précédent par village""")

    #danger signs
    danger_sign_count_group = DataTablesColumnGroup("Danger sign counts")
    danger_sign_count_pregnancy = Column("Pregnancy danger sign count", key="danger_sign_count_pregnancy",
                                         group=danger_sign_count_group,
                                         help_text="""Nombre de cas de femmes enceintes/accouchées/nouveau-nés
                                         ayant eu de(s) signe(s) de danger par village""")
    danger_sign_count_newborn = Column("Newborn danger sign count", key="danger_sign_count_birth",
                                       group=danger_sign_count_group,
                                       help_text="""Nombre de cas de femmes enceintes/accouchées/nouveau-nés
                                       ayant eu de(s) signe(s) de danger par village""")