Revert "Merge pull request #14078 from edx/yro_remove-datetimetext-functions"
This reverts commit8c0098812d, reversing changes made to5b6e2dd5ee.
This commit is contained in:
@@ -9,6 +9,7 @@ from django.db import models, transaction
|
||||
from django.db.models.fields import BooleanField, DateTimeField, DecimalField, TextField, FloatField, IntegerField
|
||||
from django.db.utils import IntegrityError
|
||||
from django.template import defaultfilters
|
||||
from django.utils.translation import ugettext
|
||||
|
||||
from ccx_keys.locator import CCXLocator
|
||||
from model_utils.models import TimeStampedModel
|
||||
@@ -17,7 +18,9 @@ from opaque_keys.edx.keys import CourseKey
|
||||
from config_models.models import ConfigurationModel
|
||||
from lms.djangoapps import django_comment_client
|
||||
from openedx.core.djangoapps.models.course_details import CourseDetails
|
||||
from pytz import utc
|
||||
from static_replace.models import AssetBaseUrlConfig
|
||||
from util.date_utils import strftime_localized
|
||||
from xmodule import course_metadata_utils, block_metadata_utils
|
||||
from xmodule.course_module import CourseDescriptor, DEFAULT_START_DATE
|
||||
from xmodule.error_module import ErrorDescriptor
|
||||
@@ -356,6 +359,21 @@ class CourseOverview(TimeStampedModel):
|
||||
"""
|
||||
return course_metadata_utils.course_starts_within(self.start, days)
|
||||
|
||||
def start_datetime_text(self, format_string="SHORT_DATE", time_zone=utc):
|
||||
"""
|
||||
Returns the desired text corresponding to the course's start date and
|
||||
time in the specified time zone, or utc if no time zone given.
|
||||
Prefers .advertised_start, then falls back to .start.
|
||||
"""
|
||||
return course_metadata_utils.course_start_datetime_text(
|
||||
self.start,
|
||||
self.advertised_start,
|
||||
format_string,
|
||||
time_zone,
|
||||
ugettext,
|
||||
strftime_localized
|
||||
)
|
||||
|
||||
@property
|
||||
def start_date_is_still_default(self):
|
||||
"""
|
||||
@@ -367,6 +385,18 @@ class CourseOverview(TimeStampedModel):
|
||||
self.advertised_start,
|
||||
)
|
||||
|
||||
def end_datetime_text(self, format_string="SHORT_DATE", time_zone=utc):
|
||||
"""
|
||||
Returns the end date or datetime for the course formatted as a string.
|
||||
|
||||
"""
|
||||
return course_metadata_utils.course_end_datetime_text(
|
||||
self.end,
|
||||
format_string,
|
||||
time_zone,
|
||||
strftime_localized
|
||||
)
|
||||
|
||||
@property
|
||||
def sorting_score(self):
|
||||
"""
|
||||
|
||||
@@ -127,6 +127,10 @@ class CourseOverviewTestCase(ModuleStoreTestCase):
|
||||
('clean_id', ('#',)),
|
||||
('has_ended', ()),
|
||||
('has_started', ()),
|
||||
('start_datetime_text', ('SHORT_DATE',)),
|
||||
('start_datetime_text', ('DATE_TIME',)),
|
||||
('end_datetime_text', ('SHORT_DATE',)),
|
||||
('end_datetime_text', ('DATE_TIME',)),
|
||||
('may_certify', ()),
|
||||
]
|
||||
for method_name, method_args in methods_to_test:
|
||||
|
||||
@@ -11,6 +11,7 @@ from django.core.cache import cache
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.test import TestCase
|
||||
from django.test.utils import override_settings
|
||||
from django.utils import timezone
|
||||
from django.utils.text import slugify
|
||||
import httpretty
|
||||
import mock
|
||||
@@ -18,7 +19,6 @@ from nose.plugins.attrib import attr
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from edx_oauth2_provider.tests.factories import ClientFactory
|
||||
from provider.constants import CONFIDENTIAL
|
||||
from pytz import utc
|
||||
|
||||
from lms.djangoapps.certificates.api import MODES
|
||||
from lms.djangoapps.commerce.tests.test_utils import update_commerce_config
|
||||
@@ -718,8 +718,8 @@ class TestProgramDataExtender(ProgramsApiConfigMixin, ModuleStoreTestCase):
|
||||
ClientFactory(name=ProgramsApiConfig.OAUTH2_CLIENT_NAME, client_type=CONFIDENTIAL)
|
||||
|
||||
self.course = CourseFactory()
|
||||
self.course.start = datetime.datetime.now(utc) - datetime.timedelta(days=1)
|
||||
self.course.end = datetime.datetime.now(utc) + datetime.timedelta(days=1)
|
||||
self.course.start = timezone.now() - datetime.timedelta(days=1)
|
||||
self.course.end = timezone.now() + datetime.timedelta(days=1)
|
||||
self.course = self.update_course(self.course, self.user.id) # pylint: disable=no-member
|
||||
|
||||
self.organization = factories.Organization()
|
||||
@@ -739,15 +739,14 @@ class TestProgramDataExtender(ProgramsApiConfigMixin, ModuleStoreTestCase):
|
||||
course_image_url=course_overview.course_image_url,
|
||||
course_key=unicode(self.course.id), # pylint: disable=no-member
|
||||
course_url=reverse('course_root', args=[self.course.id]), # pylint: disable=no-member
|
||||
end_date=self.course.end.replace(tzinfo=utc),
|
||||
end_date=strftime_localized(self.course.end, 'SHORT_DATE'),
|
||||
enrollment_open_date=strftime_localized(utils.DEFAULT_ENROLLMENT_START_DATE, 'SHORT_DATE'),
|
||||
is_course_ended=self.course.end < datetime.datetime.now(utc),
|
||||
is_course_ended=self.course.end < timezone.now(),
|
||||
is_enrolled=False,
|
||||
is_enrollment_open=True,
|
||||
marketing_url=MARKETING_URL,
|
||||
start_date=self.course.start.replace(tzinfo=utc),
|
||||
start_date=strftime_localized(self.course.start, 'SHORT_DATE'),
|
||||
upgrade_url=None,
|
||||
advertised_start=None
|
||||
),
|
||||
**kwargs
|
||||
)
|
||||
@@ -829,9 +828,8 @@ class TestProgramDataExtender(ProgramsApiConfigMixin, ModuleStoreTestCase):
|
||||
"""
|
||||
Verify that course enrollment status is reflected correctly.
|
||||
"""
|
||||
self.course.enrollment_start = datetime.datetime.now(utc) - datetime.timedelta(days=start_offset)
|
||||
self.course.enrollment_end = datetime.datetime.now(utc) - datetime.timedelta(days=end_offset)
|
||||
|
||||
self.course.enrollment_start = timezone.now() - datetime.timedelta(days=start_offset)
|
||||
self.course.enrollment_end = timezone.now() - datetime.timedelta(days=end_offset)
|
||||
self.course = self.update_course(self.course, self.user.id) # pylint: disable=no-member
|
||||
|
||||
data = utils.ProgramDataExtender(self.program, self.user).extend()
|
||||
@@ -847,7 +845,7 @@ class TestProgramDataExtender(ProgramsApiConfigMixin, ModuleStoreTestCase):
|
||||
|
||||
Regression test for ECOM-4973.
|
||||
"""
|
||||
self.course.enrollment_end = datetime.datetime.now(utc) - datetime.timedelta(days=1)
|
||||
self.course.enrollment_end = timezone.now() - datetime.timedelta(days=1)
|
||||
self.course = self.update_course(self.course, self.user.id) # pylint: disable=no-member
|
||||
|
||||
data = utils.ProgramDataExtender(self.program, self.user).extend()
|
||||
@@ -877,7 +875,7 @@ class TestProgramDataExtender(ProgramsApiConfigMixin, ModuleStoreTestCase):
|
||||
|
||||
@ddt.data(-1, 0, 1)
|
||||
def test_course_course_ended(self, days_offset):
|
||||
self.course.end = datetime.datetime.now(utc) + datetime.timedelta(days=days_offset)
|
||||
self.course.end = timezone.now() + datetime.timedelta(days=days_offset)
|
||||
self.course = self.update_course(self.course, self.user.id) # pylint: disable=no-member
|
||||
|
||||
data = utils.ProgramDataExtender(self.program, self.user).extend()
|
||||
|
||||
@@ -6,9 +6,10 @@ from urlparse import urljoin
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.text import slugify
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from pytz import utc
|
||||
import pytz
|
||||
|
||||
from course_modes.models import CourseMode
|
||||
from lms.djangoapps.certificates import api as certificate_api
|
||||
@@ -29,7 +30,7 @@ from util.organizations_helpers import get_organization_by_short_name
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
# The datetime module's strftime() methods require a year >= 1900.
|
||||
DEFAULT_ENROLLMENT_START_DATE = datetime.datetime(1900, 1, 1, tzinfo=utc)
|
||||
DEFAULT_ENROLLMENT_START_DATE = datetime.datetime(1900, 1, 1, tzinfo=pytz.UTC)
|
||||
|
||||
|
||||
def get_programs(user, program_id=None):
|
||||
@@ -382,30 +383,27 @@ class ProgramDataExtender(object):
|
||||
run_mode['course_url'] = reverse('course_root', args=[self.course_key])
|
||||
|
||||
def _attach_run_mode_end_date(self, run_mode):
|
||||
run_mode['end_date'] = self.course_overview.end
|
||||
run_mode['end_date'] = self.course_overview.end_datetime_text()
|
||||
|
||||
def _attach_run_mode_enrollment_open_date(self, run_mode):
|
||||
run_mode['enrollment_open_date'] = strftime_localized(self.enrollment_start, 'SHORT_DATE')
|
||||
|
||||
def _attach_run_mode_is_course_ended(self, run_mode):
|
||||
end_date = self.course_overview.end or datetime.datetime.max.replace(tzinfo=utc)
|
||||
run_mode['is_course_ended'] = end_date < datetime.datetime.now(utc)
|
||||
end_date = self.course_overview.end or datetime.datetime.max.replace(tzinfo=pytz.UTC)
|
||||
run_mode['is_course_ended'] = end_date < timezone.now()
|
||||
|
||||
def _attach_run_mode_is_enrolled(self, run_mode):
|
||||
run_mode['is_enrolled'] = CourseEnrollment.is_enrolled(self.user, self.course_key)
|
||||
|
||||
def _attach_run_mode_is_enrollment_open(self, run_mode):
|
||||
enrollment_end = self.course_overview.enrollment_end or datetime.datetime.max.replace(tzinfo=utc)
|
||||
run_mode['is_enrollment_open'] = self.enrollment_start <= datetime.datetime.now(utc) < enrollment_end
|
||||
enrollment_end = self.course_overview.enrollment_end or datetime.datetime.max.replace(tzinfo=pytz.UTC)
|
||||
run_mode['is_enrollment_open'] = self.enrollment_start <= timezone.now() < enrollment_end
|
||||
|
||||
def _attach_run_mode_marketing_url(self, run_mode):
|
||||
run_mode['marketing_url'] = get_run_marketing_url(self.course_key, self.user)
|
||||
|
||||
def _attach_run_mode_start_date(self, run_mode):
|
||||
run_mode['start_date'] = self.course_overview.start
|
||||
|
||||
def _attach_run_mode_advertised_start(self, run_mode):
|
||||
run_mode['advertised_start'] = self.course_overview.advertised_start
|
||||
run_mode['start_date'] = self.course_overview.start_datetime_text()
|
||||
|
||||
def _attach_run_mode_upgrade_url(self, run_mode):
|
||||
required_mode_slug = run_mode['mode_slug']
|
||||
|
||||
Reference in New Issue
Block a user