Gustavosdo/summum

View on GitHub
estagio/utilitarios/funcoes_data.py

Summary

Maintainability
A
55 mins
Test Coverage
#-*- coding: UTF-8 -*-
from pytz import timezone
from datetime import timedelta
import datetime

from estagio import settings

def dia_util(data):
    """ Valida dia útil. 
        Caso dia da semana retornado na data enviada no parâmetro seja sábado ou domingo, é retornado a data para o próximo dia útil da semana
    """
    dia_semana = data.isoweekday()
    if dia_semana == 6:
        return data + timedelta(days=2)
    if dia_semana == 7:
        return data + timedelta(days=1)
    else:
        return data


def datetime_settings_timezone(d):
    """
    """
    settings_timezone = timezone(settings.TIME_ZONE)
    data = settings_timezone.normalize(d.astimezone(settings_timezone))
    return data


def date_settings_timezone(d):
    """
    """
    settings_timezone = timezone(settings.TIME_ZONE)
    data = settings_timezone.normalize(d.astimezone(settings_timezone)).date()
    return data


def date_add_months(t, p):
    """
    import os
    os.system('cls') #limpar prompt do windows

    Retorna a data somada a quantidade de meses desejados.

    Parâmetros passados (data, quantidade_de_meses)
    
    >>> date_add_months(datetime.date(2010, 1, 1), 1)
    datetime.date(2010, 2, 1)
    >>> date_add_months(datetime.date(2010, 1, 1), 3)
    datetime.date(2010, 4, 1)
    """
    one_month_later = None
    for i in range(p):
        one_day = datetime.timedelta(days=1)
        one_month_later = t + one_day
        while one_month_later.month == t.month:  # advance to start of next month
            one_month_later += one_day
        target_month = one_month_later.month
        while one_month_later.day < t.day:  # advance to appropriate day
            one_month_later += one_day
            if one_month_later.month != target_month:  # gone too far
                one_month_later -= one_day
                break
        t = one_month_later
    if one_month_later is None:
        return t
    return one_month_later


def date_add_week(t, p):
    """
    Retorna a data somada a quantidade de semanas desejadas.

    Parâmetros passados (data, quantidade_de_semanas)
    
    >>> date_add_week(datetime.date(2010, 1, 1), 2)
    datetime.date(2010, 1, 15)
    >>> date_add_week(datetime.date(2014, 1, 10), 2)
    datetime.date(2014, 1, 24)
    """
    data = str(t)
    aDate = datetime.datetime.strptime(data, "%Y-%m-%d")
    threeWeeks = datetime.timedelta(weeks=p)
    data = aDate + threeWeeks
    data = data.date()
    return data


def date_add_days(t, p):
    """
    Retorna a data somada a quantidade de dias desejadas.

    Parâmetros passados (data, quantidade_de_dias)
    
    >>> date_add_days(datetime.date(2010, 1, 1), 2)
    datetime.date(2010, 1, 15)
    >>> date_add_days(datetime.date(2014, 1, 10), 2)
    datetime.date(2014, 1, 24)
    """
    data = t
    data = data + datetime.timedelta(days=p)
    return data


if __name__ == '__main__':
    import doctest
    doctest.testmod()