Вопросы, связанные с временем в Django - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть ограничение по времени для создания слотов в Django. Код, который я написал, выглядит следующим образом:

    start_time = request.POST.get('start_time')
    end_time = request.POST.get('end_time')
    dateTimeA = datetime.datetime.strptime(start_time, '%H:%M')
    dateTimeB = datetime.datetime.strptime(end_time, '%H:%M')
    dateTimeDifference = dateTimeB - dateTimeA
    dateTimeDifferenceInHours = dateTimeDifference.total_seconds() / 3600

    if dateTimeDifferenceInHours <= 0:
        dateTimeB += datetime.timedelta(days=1)
        dateTimeDifference = dateTimeB - dateTimeA
        dateTimeDifferenceInHours = dateTimeDifference.total_seconds() / 3600

У меня также есть некоторые ограничения:

Ограничение 1 : Время: пользователь задает время, изменяющееся от 5:00 AM to 4:59 AM.

Ограничение 2 : Конец - Время не может быть после 4:59 am следующего дня.

Случаи:

Случай 1: создание слотов с 2:00 до 4:00 должно работать нормально.

Дело 2: В настоящее время код, для которого я написал, работает некорректно case:

Start_time = 8:00
End_time = 6:00

Здесь, в переднем конце, start_time = 8:00 означает утро, а end_time = 6:00 означает утро следующего дня и нарушает наше ограничение №: 2.

Случай 3 : Когда кто-то дает start_time = 5:00 и end_time = 2:00, нам нужно добавить следующий день в end_time.

Внешний интерфейс выглядит, как показано ниже (код записан в HTML) :

enter image description here

Так что, если кто-то может помочь с улучшениями в коде, который я написал так, чтобы все мои вышеупомянутые случаи работали должным образом.

1 Ответ

0 голосов
/ 28 апреля 2020

Если я правильно понимаю:

1 / время начала должно быть не менее 5:00 (AM)

2 / время окончания до 5:00 (AM) означает «следующий» "день

Так что

1 / время начала до 5 неверно (просто)

2 / если у вас время окончания до 5:00, это" следующий " день "(простой)

3 / если это после 5:00 (включительно), но до времени начала, это неправильно (просто)

4 / если это после времени запуска, предполагается, что быть в тот же день.

IOW, это должно дать ожидаемые результаты:

# mock Django's ValidationError
class ValidationError(Exception):
    pass

def check(start, end):
    # start: datetime
    # end: datetime

    if start.hour < 5:
        raise ValidationError("start time must be >= 5:00 AM")

    if end.hour < 5:
        # end hour < 5 means 'next day'
        end = end + timedelta(days=1)

    elif end.hour < start.hour:
        # unless it's between 0 and 4, end hour must be greater
        # than start hour
        raise ValidationError("end time must be either <= 4:59 or greater than start time")

    return start, end



# and the tests:

def test_ok():
    start = datetime(2020, 4, 29, 5, 0)
    end = datetime(2020, 4, 29, 7, 0)

    try:
        new_start, new_end = check(start, end)
    except ValidationError as e:
        assert False, "should not have raised {}".format(e)

    assert new_start == start, "s should equal start"
    assert new_end == end, "e should equal end"


def test_start_before_5():
    start = datetime(2020, 4, 29, 4, 50)
    end = datetime(2020, 4, 29, 7, 0)

    try:
        check(start, end)
    except ValidationError as e:
        assert e.args[0] == "start time must be >= 5:00 AM"
    else:
        assert False, "should have raised a validation error for start < 5"

def test_end_before_5():
    start = datetime(2020, 4, 29, 8)
    end = datetime(2020, 4, 29, 4, 59)

    try:
        start, end = check(start, end)
    except ValidationError as e:
        assert False, "should not have raised {}".format(e)
    else:
        endt = (end.year, end.month, end.day, end.hour, end.minute)
        expected = (2020, 4, 30, 4, 59)
        assert  endt == expected, "should have set end date on next day"

def test_end_after_5_but_before_start():
    start = datetime(2020, 4, 29, 8)
    end = datetime(2020, 4, 29, 6)

    try:
        check(start, end)
    except ValidationError as e:
        assert e.args[0] == "end time must be either <= 4:59 or greater than start time"
    else:
        assert False, "should have raised a ValidationError"


if __name__ == "__main__":
    test_ok()
    test_start_before_5()
    test_end_before_5()
    test_end_after_5_but_before_start()

В качестве примечания я настоятельно рекомендую вам использовать Django Form (или ModelForm если необходимо) для проверки ваших пользовательских данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...