def test_any_lagged_single_wiki_without_lag_but_older_revisions(self):
        self._add_edit(hour_offset=4, name='foo')
        self._add_edit(hour_offset=2, name='bar')

        service = ReplicationLagService(mw_projects=[mediawiki_project])

        self.assertFalse(service.is_any_lagged())
    def test_any_lagged_single_wiki_without_lag_but_older_revisions(self):
        self._add_edit(hour_offset=4, name='foo')
        self._add_edit(hour_offset=2, name='bar')

        service = ReplicationLagService(mw_projects=[mediawiki_project])

        self.assertFalse(service.is_any_lagged())
    def test_any_lagged_single_wiki_large_threshold_with_lag(self):
        self._add_edit(hour_offset=31)

        service = ReplicationLagService(
            mw_projects=[mediawiki_project],
            lag_threshold=timedelta(hours=30),
        )

        self.assertTrue(service.is_any_lagged())
    def test_any_lagged_single_wiki_large_threshold_with_lag(self):
        self._add_edit(hour_offset=31)

        service = ReplicationLagService(
            mw_projects=[mediawiki_project],
            lag_threshold=timedelta(hours=30),
        )

        self.assertTrue(service.is_any_lagged())
    def test_any_lagged_two_wikis_both_with_lag(self):
        # Setup of wiki
        self._add_edit(hour_offset=4, name='foo', mw_session=self.mwSession)

        # Setup of wiki2
        self._add_edit(hour_offset=4, name='bar', mw_session=self.mwSession2)

        service = ReplicationLagService(mw_projects=[
            mediawiki_project,
            second_mediawiki_project,
        ])

        self.assertTrue(service.is_any_lagged())
    def test_any_lagged_two_wikis_first_with_lag(self):
        # Setup of wiki
        self._add_edit(hour_offset=4, name='foo', mw_session=self.mwSession)

        # Setup of wiki2
        self._add_edit(hour_offset=1, name='bar', mw_session=self.mwSession2)

        service = ReplicationLagService(mw_projects=[
            mediawiki_project,
            second_mediawiki_project,
        ])

        self.assertTrue(service.is_any_lagged())
def recurring_reports(report_id=None):
    from wikimetrics.configurables import db
    from wikimetrics.models import ReportStore, RunReport
    
    replication_lag_service = ReplicationLagService()
    if replication_lag_service.is_any_lagged():
        task_logger.warning(
            'Replication lag detected. '
            'Hence, skipping creating new recurring reports.'
        )
        return

    try:
        session = db.get_session()
        query = session.query(ReportStore) \
            .filter(ReportStore.recurrent) \
        
        if report_id is not None:
            query = query.filter(ReportStore.id == report_id)
        
        for report in query.all():
            try:
                task_logger.info('Running recurring report "{0}"'.format(report))
                no_more_than = queue.conf.get('MAX_INSTANCES_PER_RECURRENT_REPORT')
                kwargs = dict()
                if no_more_than:
                    kwargs['no_more_than'] = no_more_than
                
                days_to_run = RunReport.create_reports_for_missed_days(
                    report,
                    session,
                    **kwargs
                )
                for day_to_run in days_to_run:
                    day_to_run.task.delay(day_to_run)
            
            except Exception:
                task_logger.error('Problem running recurring report "{}": {}'.format(
                    report, traceback.format_exc()
                ))
    
    except Exception:
        task_logger.error('Problem running recurring reports: {}'.format(
            traceback.format_exc()
        ))
    def test_any_lagged_single_wiki_with_lag(self):
        self._add_edit(hour_offset=4)

        service = ReplicationLagService(mw_projects=[mediawiki_project])

        self.assertTrue(service.is_any_lagged())
    def test_any_lagged_without_wiki(self):
        service = ReplicationLagService(mw_projects=[])

        self.assertFalse(service.is_any_lagged())
    def test_any_lagged_single_wiki_with_lag(self):
        self._add_edit(hour_offset=4)

        service = ReplicationLagService(mw_projects=[mediawiki_project])

        self.assertTrue(service.is_any_lagged())
    def test_any_lagged_without_wiki(self):
        service = ReplicationLagService(mw_projects=[])

        self.assertFalse(service.is_any_lagged())