2016-05-23 2 views
1

У меня есть тест в Django 1.8.5, который проходит. Вот этоПроблема с часовым поясом после обновления до Django 1.9

def test_user_returns_from_vacation_correctly_increments_review_timestamps(self): 
     self.user.profile.on_vacation = True 

     now = timezone.now() 
     an_hour_ago = now - timedelta(hours=1) 
     two_hours_ago = now - timedelta(hours=2) 

     self.user.profile.vacation_date = an_hour_ago 
     self.user.profile.save() 
     self.review.last_studied = two_hours_ago 
     self.review.save() 
     previously_studied = self.review.last_studied 

     user_returns_from_vacation(self.user) 
     rev = UserSpecific.objects.get(id=self.review.id) #<---This is the line causing the error! 
     print(rev) 
     self.assertNotEqual(rev.last_studied, previously_studied) 
     self.assertAlmostEqual(rev.last_studied, an_hour_ago, delta=timedelta(seconds=1)) 

Однако при обновлении до Django 1.9 это тест вызывает эту ошибку:

Error 
Traceback (most recent call last): 
/pytz/tzinfo.py", line 304, in localize 
etc etc 
    raise ValueError('Not naive datetime (tzinfo is already set)') 
ValueError: Not naive datetime (tzinfo is already set) 

Вот связанные user_returns_from_vacation код:

def user_returns_from_vacation(user): 
    """ 
    Called when a user disables vacation mode. A one-time pass through their reviews in order to correct their last_studied_date, and quickly run an SRS run to determine which reviews currently need to be looked at. 
    """ 
    logger.info("{} has returned from vacation!".format(user.username)) 
    vacation_date = user.profile.vacation_date 
    if vacation_date: 
     users_reviews = UserSpecific.objects.filter(user=user) 
     elapsed_vacation_time = timezone.now() - vacation_date 
     logger.info("User {} has been gone for timedelta: {}".format(user.username, str(elapsed_vacation_time))) 
     updated_count = users_reviews.update(last_studied=F('last_studied') + elapsed_vacation_time) 
     users_reviews.update(next_review_date=F('next_review_date') + elapsed_vacation_time) 
     logger.info("brought {} reviews out of hibernation for {}".format(updated_count, user.username)) 

    user.profile.vacation_date = None 
    user.profile.on_vacation = False 
    user.profile.save() 

UPDATE: Если я удалить F() и заменить их на цикл for, эта ошибка исчезает. Как так:

for rev in users_reviews: 
     lst = rev.last_studied 
     nsd = rev.next_review_date 
     rev.last_studied = lst + elapsed_vacation_time 
     rev.next_review_date = nsd + elapsed_vacation_time 
     rev.save() 

я заметил в примечаниях к выпуску на 1.9, что они добавили атрибут TIME_ZONE для часовых поясов наивного база данных (например, SQLite, которая является то, что я бег моих тестов с). Я попытался добавить свой часовой пояс в конфигурацию базы данных, но проблема не устранена. Есть идеи? Вот мои часовой пояс связанных параметров в settings.py

MY_TIME_ZONE = 'America/New_York' 
TIME_ZONE = MY_TIME_ZONE 
DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
      'TIME_ZONE': MY_TIME_ZONE 
     } 
+0

может посмотреть на это - https://docs.djangoproject.com/en/1.9/topics/i18n/timezones/ –

+0

Я прочитал это, и я также прочитал версию 1.8. Поскольку нет никакой разницы, это не объясняет, почему мой тест терпит неудачу в одной версии, а не другой. – Tadgh

ответ

0

В конце концов, после того, как изводить основные разработчик, я обнаружил, что это действительно ошибка, особенно при использовании SQLite. Документально здесь, но до сих пор нефиксированный:

https://code.djangoproject.com/ticket/27544

Смежные вопросы