Skip to content

Commit 31fe547

Browse files
committed
Merge pull request #378 from EverythingMe/feature/variables
Fix #263: timestamp fields should be with time zone
2 parents b1f97e8 + aff3240 commit 31fe547

3 files changed

Lines changed: 34 additions & 11 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from redash.models import db
2+
3+
if __name__ == '__main__':
4+
db.connect_db()
5+
columns = (
6+
('activity_log', 'created_at'),
7+
('dashboards', 'created_at'),
8+
('data_sources', 'created_at'),
9+
('events', 'created_at'),
10+
('groups', 'created_at'),
11+
('queries', 'created_at'),
12+
('widgets', 'created_at'),
13+
('query_results', 'retrieved_at')
14+
)
15+
16+
with db.database.transaction():
17+
for column in columns:
18+
db.database.execute_sql("ALTER TABLE {} ALTER COLUMN {} TYPE timestamp with time zone;".format(*column))
19+
20+
db.close_db(None)
21+

redash/models.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import peewee
1111
from passlib.apps import custom_app_context as pwd_context
12-
from playhouse.postgres_ext import ArrayField
12+
from playhouse.postgres_ext import ArrayField, DateTimeTZField, PostgresqlExtDatabase
1313
from flask.ext.login import UserMixin, AnonymousUserMixin
1414

1515
from redash import utils, settings
@@ -18,8 +18,9 @@
1818
class Database(object):
1919
def __init__(self):
2020
self.database_config = dict(settings.DATABASE_CONFIG)
21+
self.database_config['register_hstore'] = False
2122
self.database_name = self.database_config.pop('name')
22-
self.database = peewee.PostgresqlDatabase(self.database_name, **self.database_config)
23+
self.database = PostgresqlExtDatabase(self.database_name, **self.database_config)
2324
self.app = None
2425
self.pid = os.getpid()
2526

@@ -96,7 +97,7 @@ class Group(BaseModel):
9697
name = peewee.CharField(max_length=100)
9798
permissions = ArrayField(peewee.CharField, default=DEFAULT_PERMISSIONS)
9899
tables = ArrayField(peewee.CharField)
99-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
100+
created_at = DateTimeTZField(default=datetime.datetime.now)
100101

101102
class Meta:
102103
db_table = 'groups'
@@ -173,7 +174,7 @@ class ActivityLog(BaseModel):
173174
user = peewee.ForeignKeyField(User)
174175
type = peewee.IntegerField()
175176
activity = peewee.TextField()
176-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
177+
created_at = DateTimeTZField(default=datetime.datetime.now)
177178

178179
class Meta:
179180
db_table = 'activity_log'
@@ -198,7 +199,7 @@ class DataSource(BaseModel):
198199
options = peewee.TextField()
199200
queue_name = peewee.CharField(default="queries")
200201
scheduled_queue_name = peewee.CharField(default="queries")
201-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
202+
created_at = DateTimeTZField(default=datetime.datetime.now)
202203

203204
class Meta:
204205
db_table = 'data_sources'
@@ -222,7 +223,7 @@ class QueryResult(BaseModel):
222223
query = peewee.TextField()
223224
data = peewee.TextField()
224225
runtime = peewee.FloatField()
225-
retrieved_at = peewee.DateTimeField()
226+
retrieved_at = DateTimeTZField()
226227

227228
class Meta:
228229
db_table = 'query_results'
@@ -297,7 +298,7 @@ class Query(BaseModel):
297298
user_email = peewee.CharField(max_length=360, null=True)
298299
user = peewee.ForeignKeyField(User)
299300
is_archived = peewee.BooleanField(default=False, index=True)
300-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
301+
created_at = DateTimeTZField(default=datetime.datetime.now)
301302

302303
class Meta:
303304
db_table = 'queries'
@@ -441,7 +442,7 @@ class Dashboard(BaseModel):
441442
layout = peewee.TextField()
442443
dashboard_filters_enabled = peewee.BooleanField(default=False)
443444
is_archived = peewee.BooleanField(default=False, index=True)
444-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
445+
created_at = DateTimeTZField(default=datetime.datetime.now)
445446

446447
class Meta:
447448
db_table = 'dashboards'
@@ -552,7 +553,7 @@ class Widget(BaseModel):
552553
width = peewee.IntegerField()
553554
options = peewee.TextField()
554555
dashboard = peewee.ForeignKeyField(Dashboard, related_name='widgets', index=True)
555-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
556+
created_at = DateTimeTZField(default=datetime.datetime.now)
556557

557558
# unused; kept for backward compatability:
558559
type = peewee.CharField(max_length=100, null=True)
@@ -586,13 +587,14 @@ def delete_instance(self, *args, **kwargs):
586587
self.dashboard.save()
587588
super(Widget, self).delete_instance(*args, **kwargs)
588589

590+
589591
class Event(BaseModel):
590592
user = peewee.ForeignKeyField(User, related_name="events")
591593
action = peewee.CharField()
592594
object_type = peewee.CharField()
593595
object_id = peewee.CharField(null=True)
594596
additional_properties = peewee.TextField(null=True)
595-
created_at = peewee.DateTimeField(default=datetime.datetime.now)
597+
created_at = DateTimeTZField(default=datetime.datetime.now)
596598

597599
class Meta:
598600
db_table = 'events'

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Werkzeug==0.9.4
99
aniso8601==0.82
1010
blinker==1.3
1111
itsdangerous==0.23
12-
peewee==2.2.2
12+
peewee==2.4.7
1313
psycopg2==2.5.2
1414
python-dateutil==2.1
1515
pytz==2013.9

0 commit comments

Comments
 (0)