2016-05-23 13 views
1

Ich habe einen Test in Django 1.8.5, die passiert. Hier istZeitzone Problem nach dem Upgrade auf 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)) 

jedoch auf ein Upgrade auf Django 1.9 dieser Test verursacht dieser Fehler:

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) 

Hier ist der Zusammenhang user_returns_from_vacation Code:

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: Wenn ich das entfernen F() Ausdrücke, und ersetzen Sie sie durch eine for-Schleife, verschwindet dieser Fehler. Wie so:

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() 

bemerkte ich in den Release Notes für 1.9, dass sie ein TIME_ZONE Attribut für Zeitzone-naive Datenbanken hinzugefügt hatte (wie SQLite, das ist, was ich meine Tests laufen mit). Ich habe versucht, meine Zeitzone zu der DB-Konfiguration hinzuzufügen, aber das Problem bleibt bestehen. Irgendwelche Ideen? Hier sind meine Zeitzone-Einstellungen in 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

könnte, dies betrachten will - https://docs.djangoproject.com/en/1.9/topics/i18n/timezones/ –

+0

ich gelesen habe das und ich habe auch die Version 1.8 gelesen. Da es keinen Unterschied gibt, erklärt das nicht, warum mein Test in einer Version fehlschlägt und nicht in der anderen. – Tadgh

Antwort