示例#1
0
 def __init__(self, config, override_table_name=None, engine_id=None):
     super(IndicatorSqlAdapter, self).__init__(config)
     self.engine_id = engine_id or get_engine_id(config)
     self.session_helper = connection_manager.get_session_helper(self.engine_id)
     self.session_context = self.session_helper.session_context
     self.engine = self.session_helper.engine
     self.override_table_name = override_table_name
示例#2
0
    def setUpClass(cls):
        cls.session_helper = connection_manager.get_session_helper(settings.SQL_REPORTING_DATABASE_URL)
        cls.engine = cls.session_helper.engine

        cls.domain = create_domain(TEST_DOMAIN)
        cls.region_type = LocationType.objects.create(domain=TEST_DOMAIN, name=u'Région')
        cls.district_type = LocationType.objects.create(domain=TEST_DOMAIN, name=u'District')
        cls.pps_type = LocationType.objects.create(domain=TEST_DOMAIN, name=u'PPS')

        cls.region = Location(domain=TEST_DOMAIN, name='Test region', location_type=u'Région')
        cls.region.save()
        cls.district = Location(
            domain=TEST_DOMAIN, name='Test district', location_type=u'District', parent=cls.region
        )
        cls.district.save()
        cls.pps = Location(domain=TEST_DOMAIN, name='Test PPS', location_type=u'PPS', parent=cls.district)
        cls.pps.save()

        cls.mobile_worker = create_mobile_worker(
            domain=TEST_DOMAIN, username='******', password='******', phone_number='777777'
        )
        cls.mobile_worker.location_id = cls.pps.get_id
        cls.mobile_worker.save()

        cls.product = Product(_id=u'81457658bdedd663f8b0bdadb19d8f22', name=u'ASAQ Nourisson', domain=TEST_DOMAIN)
        cls.product2 = Product(
            _id=u'81457658bdedd663f8b0bdadb19d83d8', name=u'ASAQ Petit Enfant', domain=TEST_DOMAIN
        )

        cls.product.save()
        cls.product2.save()
 def _load_data_from_db(self, table_name, sort_key):
     engine = connection_manager.get_session_helper('default').engine
     metadata = sqlalchemy.MetaData(bind=engine)
     metadata.reflect(bind=engine)
     table = metadata.tables[table_name]
     columns = [
         column.name
         for column in table.columns
     ]
     with engine.begin() as connection:
         rows = connection.execute(table.select().order_by(*sort_key)).fetchall()
         for row in rows:
             row = list(row)
             for idx, value in enumerate(row):
                 if isinstance(value, date):
                     row[idx] = value.strftime('%Y-%m-%d')
                 elif isinstance(value, time):
                     row[idx] = value.strftime("%H:%M:%S.%f").rstrip('0').rstrip('.')
                 elif isinstance(value, six.integer_types):
                     row[idx] = str(value)
                 elif isinstance(value, (float, Decimal)):
                     row[idx] = self._convert_decimal_to_string(row[idx])
                 elif isinstance(value, six.string_types):
                     row[idx] = value.encode('utf-8')
                 elif value is None:
                     row[idx] = ''
             yield dict(zip(columns, row))
示例#4
0
    def handle(self, file_path, *args, **options):
        domain = 'icds-cas'

        data_source_id = StaticDataSourceConfiguration.get_doc_id(domain, PERSON_TABLE_ID)
        config = StaticDataSourceConfiguration.by_id(data_source_id)
        adapter = get_indicator_adapter(config)
        session_helper = connection_manager.get_session_helper(adapter.engine_id)
        person_table_name = get_table_name(domain, PERSON_TABLE_ID)
        awc_location_table_name = get_table_name(domain, AWC_LOCATION_TABLE_ID)
        session = session_helper.Session

        with open(
            os.path.join(os.path.dirname(__file__), 'sql_scripts', 'nos_of_deaths.sql'),
            encoding='utf-8'
        ) as f:
            sql_script = f.read()
            rows = session.execute(
                sql_script % {
                    'person_table_name': person_table_name,
                    'awc_location_table_name': awc_location_table_name
                }
            )

            with open(file_path, 'w', encoding='utf-8') as file_object:
                writer = csv.writer(file_object)
                writer.writerow([
                    'State',
                    'District',
                    'AWC',
                    'Month',
                    'Deaths',
                ])
                writer.writerows(rows)
示例#5
0
def load_data_from_db(table_name):
    def _convert_decimal_to_string(value):
        value_str = str(value)
        p = re.compile('0E-(?P<zeros>[0-9]+)')
        match = p.match(value_str)
        if match:
            return '0.{}'.format(int(match.group('zeros')) * '0')
        else:
            return value_str

    engine = connection_manager.get_session_helper('default').engine
    metadata = sqlalchemy.MetaData(bind=engine)
    metadata.reflect(bind=engine)
    table = metadata.tables[table_name]
    columns = [
        column.name
        for column in table.columns
    ]
    with engine.begin() as connection:
        for row in list(connection.execute(table.select())):
            row = list(row)
            for idx, value in enumerate(row):
                if isinstance(value, date):
                    row[idx] = value.strftime('%Y-%m-%d')
                elif isinstance(value, time):
                    row[idx] = value.strftime("%H:%M:%S.%f").rstrip('0').rstrip('.')
                elif isinstance(value, six.integer_types):
                    row[idx] = str(value)
                elif isinstance(value, (float, Decimal)):
                    row[idx] = _convert_decimal_to_string(row[idx])
                elif six.PY2 and isinstance(value, six.text_type):
                    row[idx] = value.encode('utf-8')
                elif value is None:
                    row[idx] = ''
            yield dict(zip(columns, row))
示例#6
0
    def get_sql_queries(self):
        qc = self.query_context()
        for c in self.columns:
            qc.append_column(c.view)

        session_helper = connection_manager.get_session_helper(self.engine_id)
        with session_helper.session_context() as session:
            return qc.get_query_strings(session.connection())
示例#7
0
    def _get_data(self, start=None, limit=None):
        if self.keys is not None and not self.group_by:
            raise SqlReportException('Keys supplied without group_by.')

        qc = self.query_context(start=start, limit=limit)
        for c in self.columns:
            qc.append_column(c.view)

        session_helper = connection_manager.get_session_helper(self.engine_id)
        with session_helper.session_context() as session:
            return qc.resolve(session.connection(), self.filter_values)
示例#8
0
    def get_total_row(self):
        def _clean_total_row(val, col):
            if isinstance(val, numbers.Number):
                return val
            elif col.calculate_total:
                return 0
            return ''

        def _get_relevant_column_ids(col, column_id_to_expanded_column_ids):
            return column_id_to_expanded_column_ids.get(col.column_id, [col.column_id])

        expanded_columns = get_expanded_columns(self.top_level_columns, self.config)

        qc = self.query_context()
        session_helper = connection_manager.get_session_helper(self.engine_id)
        with session_helper.session_context() as session:
            totals = qc.totals(
                session.connection(),
                [
                    column_id
                    for col in self.top_level_columns
                    for column_id in _get_relevant_column_ids(col, expanded_columns)
                    if col.calculate_total
                ],
                self.filter_values
            )

        total_row = [
            _clean_total_row(totals.get(column_id), col)
            for col in self.top_level_columns for column_id in _get_relevant_column_ids(
                col, expanded_columns
            )
        ]
        if total_row and total_row[0] is '':
            total_row[0] = ugettext('Total')
        return total_row
示例#9
0
 def get_total_records(self):
     qc = self.query_context()
     session_helper = connection_manager.get_session_helper(self.engine_id)
     with session_helper.session_context() as session:
         return qc.count(session.connection(), self.filter_values)
示例#10
0
 def session_helper(self):
     return connection_manager.get_session_helper(self.adapter.engine_id,
                                                  readonly=True)
示例#11
0
 def __init__(self, config):
     self.config = config
     self.engine_id = get_engine_id(config)
     self.session_helper = connection_manager.get_session_helper(self.engine_id)
     self.engine = self.session_helper.engine
示例#12
0
 def __init__(self, config):
     self.config = config
     self.engine_id = get_engine_id(config)
     self.session_helper = connection_manager.get_session_helper(
         self.engine_id)
     self.engine = self.session_helper.engine
示例#13
0
 def __init__(self, config):
     super(IndicatorSqlAdapter, self).__init__(config)
     self.engine_id = get_engine_id(config)
     self.session_helper = connection_manager.get_session_helper(self.engine_id)
     self.engine = self.session_helper.engine
示例#14
0
 def get_total_records(self):
     qc = self.query_context()
     session_helper = connection_manager.get_session_helper(self.engine_id,
                                                            readonly=True)
     with session_helper.session_context() as session:
         return qc.count(session.connection(), self.filter_values)
示例#15
0
 def get_query_strings(self):
     qc = self.query_context()
     session_helper = connection_manager.get_session_helper(self.engine_id,
                                                            readonly=True)
     with session_helper.session_context() as session:
         return qc.get_query_strings(session.connection())
示例#16
0
def setUpModule():
    if settings.USE_PARTITIONED_DATABASE:
        print(
            '============= WARNING: not running test setup because settings.USE_PARTITIONED_DATABASE is True.'
        )
        return

    _call_center_domain_mock = mock.patch(
        'corehq.apps.callcenter.data_source.call_center_data_source_configuration_provider'
    )
    _call_center_domain_mock.start()

    domain = create_domain('icds-cas')
    location_type = LocationType.objects.create(
        domain=domain.name,
        name='block',
    )
    SQLLocation.objects.create(domain=domain.name,
                               name='b1',
                               location_id='b1',
                               location_type=location_type)

    awc_location_type = LocationType.objects.create(
        domain=domain.name,
        name='awc',
    )
    SQLLocation.objects.create(domain=domain.name,
                               name='a7',
                               location_id='a7',
                               location_type=awc_location_type)

    with override_settings(SERVER_ENVIRONMENT='icds'):
        configs = StaticDataSourceConfiguration.by_domain('icds-cas')
        adapters = [get_indicator_adapter(config) for config in configs]

        for adapter in adapters:
            if adapter.config.table_id == 'static-child_health_cases':
                # hack because this is in a migration
                continue
            adapter.build_table()

        engine = connection_manager.get_session_helper(
            settings.ICDS_UCR_TEST_DATABASE_ALIAS).engine
        metadata = sqlalchemy.MetaData(bind=engine)
        metadata.reflect(bind=engine, extend_existing=True)
        path = os.path.join(os.path.dirname(__file__), 'fixtures')
        for file_name in os.listdir(path):
            with open(os.path.join(path, file_name)) as f:
                table_name = FILE_NAME_TO_TABLE_MAPPING[file_name[:-4]]
                table = metadata.tables[table_name]
                postgres_copy.copy_from(f,
                                        table,
                                        engine,
                                        format='csv',
                                        null='',
                                        header=True)

        try:
            move_ucr_data_into_aggregation_tables(datetime(2017, 5, 28),
                                                  intervals=2)
        except AssertionError:
            pass
    _call_center_domain_mock.stop()
示例#17
0
 def __init__(self, config):
     super(IndicatorSqlAdapter, self).__init__(config)
     self.engine_id = get_engine_id(config)
     self.session_helper = connection_manager.get_session_helper(
         self.engine_id)
     self.engine = self.session_helper.engine
示例#18
0
文件: ucr.py 项目: ye-man/commcare-hq
from __future__ import absolute_import
from __future__ import unicode_literals

from collections import OrderedDict

import six
import sqlagg
import sqlalchemy
from sqlalchemy import select
from sqlalchemy.sql import func

from corehq.sql_db.connections import connection_manager
from corehq.apps.userreports.custom.data_source import ConfigurableReportCustomQueryProvider

session_helper = connection_manager.get_session_helper('icds-ucr')
metadata = sqlalchemy.MetaData(bind=session_helper.engine)

ChildHealthMonthlyViewAlchemy = sqlalchemy.Table('child_health_monthly_view',
                                                 metadata,
                                                 autoload=True)


class ChildHealthMonthlyUCR(ConfigurableReportCustomQueryProvider):
    """
    Reasons these are needed:
      - UCR needs to combine form data with case data
    """
    def __init__(self, report_data_source):
        self.report_data_source = report_data_source
        self.helper = self.report_data_source.helper
        self.helper.set_table(ChildHealthMonthlyViewAlchemy)
示例#19
0
from __future__ import absolute_import
from __future__ import unicode_literals

from collections import OrderedDict

import sqlalchemy
from sqlalchemy.sql import func

from corehq.sql_db.connections import connection_manager
from corehq.apps.userreports.custom.data_source import ConfigurableReportCustomQueryProvider


session_helper = connection_manager.get_session_helper('icds-ucr')
metadata = sqlalchemy.MetaData(bind=session_helper.engine)

ChildHealthMonthlyViewAlchemy = sqlalchemy.Table(
    'child_health_monthly_view', metadata, autoload=True
)


class ChildHealthMonthlyUCR(ConfigurableReportCustomQueryProvider):
    """
    Reasons these are needed:
      - UCR needs to combine form data with case data
    """

    def __init__(self, report_data_source):
        self.report_data_source = report_data_source
        self.helper = self.report_data_source.helper
        self.helper.set_table(ChildHealthMonthlyViewAlchemy)