Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Celery task to clear schedule was added #3801

Merged
merged 12 commits into from
Jun 12, 2019
16 changes: 16 additions & 0 deletions redash/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,22 @@ def by_user(cls, user):
def by_api_key(cls, api_key):
return cls.query.filter(cls.api_key == api_key).one()

@classmethod
def past_scheduled_queries(cls):
now = utils.utcnow()
queries = (
Query.query
.filter(Query.schedule.isnot(None))
.order_by(Query.id)
)
return filter(
lambda x:
x.schedule["until"] is not None and pytz.utc.localize(
datetime.datetime.strptime(x.schedule['until'], '%Y-%m-%d')
) <= now,
queries
)

@classmethod
def outdated_queries(cls):
queries = (
Expand Down
2 changes: 1 addition & 1 deletion redash/tasks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from .general import record_event, version_check, send_mail, sync_user_details
from .queries import QueryTask, refresh_queries, refresh_schemas, cleanup_query_results, execute_query
from .queries import QueryTask, refresh_queries, refresh_schemas, cleanup_query_results, execute_query, empty_schedules
from .alerts import check_alerts_for_query
12 changes: 12 additions & 0 deletions redash/tasks/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,18 @@ def enqueue_query(query, data_source, user_id, is_api_key=False, scheduled_query
return job


@celery.task(name="redash.tasks.empty_schedules")
def empty_schedules():
logger.info("Deleting schedules of past scheduled queries...")

queries = models.Query.past_scheduled_queries()
for query in queries:
query.schedule = None
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add a log message here, just so admins will be able to traceback changes.

models.db.session.commit()

logger.info("Deleted %d schedules.", len(queries))


@celery.task(name="redash.tasks.refresh_queries")
def refresh_queries():
logger.info("Refreshing queries...")
Expand Down
4 changes: 4 additions & 0 deletions redash/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
'task': 'redash.tasks.refresh_queries',
'schedule': timedelta(seconds=30)
},
'empty_schedules': {
'task': 'redash.tasks.empty_schedules',
'schedule': timedelta(minutes=60)
},
'refresh_schemas': {
'task': 'redash.tasks.refresh_schemas',
'schedule': timedelta(minutes=settings.SCHEMAS_REFRESH_SCHEDULE)
Expand Down
13 changes: 13 additions & 0 deletions tests/models/test_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import datetime
from redash.models import Query, Group, Event, db
from redash.utils import utcnow
import mock


class QueryTest(BaseTestCase):
Expand Down Expand Up @@ -170,6 +171,18 @@ def test_search_query_parser_emails(self):
self.assertNotIn(q1, queries)
self.assertIn(q2, queries)

def test_past_scheduled_queries(self):
query = self.factory.create_query()
one_day_ago = (utcnow() - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
one_day_later = (utcnow() + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
query1 = self.factory.create_query(schedule={'interval':'3600','until':one_day_ago})
query2 = self.factory.create_query(schedule={'interval':'3600','until':one_day_later})
oq = staticmethod(lambda: [query1, query2])
with mock.patch.object(query.query.filter(), 'order_by', oq):
res = query.past_scheduled_queries()
self.assertTrue(query1 in res)
self.assertFalse(query2 in res)


class QueryRecentTest(BaseTestCase):
def test_global_recent(self):
Expand Down
16 changes: 16 additions & 0 deletions tests/tasks/test_empty_schedule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import datetime
from mock import patch
from tests import BaseTestCase
from redash.tasks import empty_schedules
from redash.models import Query
from redash.utils import utcnow


class TestEmptyScheduleQuery(BaseTestCase):
def test_empty_schedules(self):
one_day_ago = (utcnow() - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
query = self.factory.create_query(schedule={'interval':'3600','until':one_day_ago})
oq = staticmethod(lambda: [query])
with patch.object(Query, 'past_scheduled_queries', oq):
empty_schedules()
self.assertEqual(query.schedule, None)