Skip to content
This repository has been archived by the owner on Sep 23, 2021. It is now read-only.

Commit

Permalink
Merge pull request #10 from tumb1er/fix_datetime_tz
Browse files Browse the repository at this point in the history
Fix SphinxDateTimeField timezone support
  • Loading branch information
tumb1er committed Feb 18, 2019
2 parents 8d7ffeb + 3f1ee95 commit fed2198
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 5 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,6 @@ def get_version():
setup_requires=[
'Django>=2.0,<2.2',
'mysqlclient>=1.4.2,<1.5.0'
'pytz'
],
)
6 changes: 5 additions & 1 deletion sphinxsearch/fields.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import datetime
import time

import pytz

from sphinxsearch.lookups import sphinx_lookups
from django.core import exceptions
from django.db import models
Expand All @@ -23,6 +25,8 @@ class SphinxDateTimeField(models.FloatField):

def get_prep_value(self, value):
if isinstance(value, (datetime.datetime, datetime.date)):
if value.tzinfo is not None:
value = pytz.UTC.normalize(value)
return int(time.mktime(value.timetuple()))
elif isinstance(value, (int, float)):
return value
Expand All @@ -31,7 +35,7 @@ def get_prep_value(self, value):

# noinspection PyMethodMayBeStatic,PyUnusedLocal
def from_db_value(self, value, expression, connection, context):
return datetime.datetime.fromtimestamp(value)
return datetime.datetime.fromtimestamp(value).replace(tzinfo=pytz.UTC)


class SphinxIntegerField(models.IntegerField):
Expand Down
2 changes: 1 addition & 1 deletion test-requires.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
mysqlclient==1.4.2
jsonfield==2.0.2
tblib==1.3.2

pytz
2 changes: 1 addition & 1 deletion testproject/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
TIME_ZONE = 'Europe/Moscow'

USE_I18N = True

Expand Down
33 changes: 31 additions & 2 deletions testproject/testapp/tests.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import re
import sys
from datetime import datetime, timedelta
from datetime import timedelta

import pytz
from django.conf import settings
from django.db import connections
from django.db.models import Sum, Q
from django.db.utils import ProgrammingError
from django.test import TransactionTestCase, utils
from django.utils import timezone

from sphinxsearch.routers import SphinxRouter
from sphinxsearch.utils import sphinx_escape
Expand Down Expand Up @@ -40,7 +42,7 @@ def setUp(self):
self.multi64_is_broken = c.mysql_version >= (3, 0, 0)
self.cloned_index = c.settings_dict['NAME'] != 'sphinx'
self.truncate_model()
self.now = datetime.now().replace(microsecond=0)
self.now = pytz.UTC.normalize(timezone.now().replace(microsecond=0))
self.defaults = self.get_model_defaults()
self.spx_queries = utils.CaptureQueriesContext(
connections[settings.SPHINX_DATABASE_NAME])
Expand Down Expand Up @@ -573,6 +575,33 @@ def testSphinxModelDetection(self):
models.DefaultDjangoModel()))


class SphinxFieldsTestCase(SphinxModelTestCaseBase):
""" Checks custom sphinx fields behavior."""

def testTimestampFieldTimeZone(self):
"""
SphinxDateTimeField converts and stores datetime in UTC timestamp.
"""
tz = pytz.timezone("Europe/Moscow")
now = timezone.now().replace(microsecond=0, tzinfo=tz)
self.obj.attr_timestamp = now

self.obj.save()
self.obj.refresh_from_db(fields=('attr_timestamp',))

self.assertEqual(self.obj.attr_timestamp, now)
self.assertEqual(self.obj.attr_timestamp.tzinfo, pytz.UTC)
dt = tz.normalize(self.obj.attr_timestamp)
self.assertEqual(dt, now)

self.obj.attr_timestamp = now.replace(tzinfo=pytz.UTC)

self.obj.save()
self.obj.refresh_from_db(fields=('attr_timestamp',))

self.assertEqual(self.obj.attr_timestamp, now.replace(tzinfo=pytz.UTC))


class EscapingTestCase(SphinxModelTestCaseBase):
""" Checks escaping symbols"""

Expand Down

0 comments on commit fed2198

Please sign in to comment.