diff --git a/paramecio2/libraries/datetime.py b/paramecio2/libraries/datetime.py new file mode 100644 index 0000000..a6423a0 --- /dev/null +++ b/paramecio2/libraries/datetime.py @@ -0,0 +1,447 @@ +import time +from datetime import date, datetime, tzinfo +import arrow +# from babel.dates import format_date, format_datetime, format_time, get_timezone, UTC +from settings import config +#from paramecio.citoplasma.sessions import get_session +from os import environ + + +sql_format_time='YYYYMMDDHHmmss' + +format_date_txt="YYYY/MM/DD" + +format_time_txt="HH:mm:ss" + +timezone='Europe/Madrid' + +if hasattr(config, 'format_date'): + format_date_txt=config.format_date + +if hasattr(config, 'format_time'): + format_time_txt=config.format_time + +if hasattr(config, 'timezone'): + timezone=config.timezone + +def set_timezone(): + + environ['TZ']=environ.get('TZ', timezone) + + if environ['TZ']!=timezone: + environ['TZ']=timezone + time.tzset() + +""" +def set_timezone_session(): + + s=get_session() + + timezone_local=timezone + + if s!=None: + if 'timezone' in s: + timezone_local=s['timezone'] + #timezone_local=s.get('timezone', timezone) + + environ['TZ']=environ.get('TZ', timezone_local) + + if environ['TZ']!=timezone_local: + environ['TZ']=timezone_local + time.tzset() + + #request.environ['TIMEZONE'] = request.environ['PATH_INFO'].rstrip('/') +""" + +def format_timedata(time): + + year=0 + month=0 + day=0 + hour=0 + minute=0 + second=0 + ampm='' + + try: + + year=int(time[:4]) + + month=int(time[4:6]) + + day=int(time[6:8]) + + hour=int(time[8:10]) + + minute=int(time[10:12]) + + second=int(time[12:14]) + + ampm=int(time[14:16]) + + except: + pass + + if ampm=='PM' or ampm=='pm': + + if hour>0: + hour+=12 + + return (year, month, day, hour, minute, second) + +def checkdatetime(y, m, d, h, mi, s): + + try: + #test=datetime.strptime(str(y)+'-'+str(m)+'-'+str(d)+' '+str(h)+'-'+str(mi)+'-'+str(s), '%Y-%m-%d %H-%M-%S') + test=arrow.arrow.Arrow(y, m, d, h, mi, s) + return True + except: + return False + +# Get the localtime + +def now(utc=False, tz=''): + """ + actual=datetime.today() + + # Get localtime + + final_date=actual.strftime(sql_format_time) + #Go to gmt + + if utc: + + final_date=local_to_gmt(final_date) + + return final_date + """ + + if not utc: + if tz=='': + actual=arrow.now().format(sql_format_time) + else: + #actual=arrow.to(tz).now().format(sql_format_time) + utc=arrow.utcnow() + actual=utc.to(tz).format(sql_format_time) + else: + actual=arrow.utcnow().format(sql_format_time) + + return actual + +def today(utc=False,tz=''): + + return now(utc, tz)[:8]+'000000' + +# Get actual timestamp + +def obtain_timestamp(timeform, local=False, tz=''): + + y, m, d, h, mi, s=format_timedata(timeform) + + if checkdatetime(y, m, d, h, mi, s): + + #timestamp=int(time.mktime((y, m, d, h, mi, s, 0, 0, -1))) + + if local: + + #offset=time.altzone + + #return timestamp-offset + + if tz=='': + tz=environ.get('TZ', 'utc') + + t=arrow.arrow.Arrow(y, m, d, h, mi, s).to(tz) + + timestamp=t.timestamp + + else: + timestamp=arrow.arrow.Arrow(y, m, d, h, mi, s).timestamp + + return timestamp + + #return mktime($h, $mi, $s, $m, $d, $y); + else: + return False + +# timestamp is gmt time, convert in normal time + +def timestamp_to_datetime(timestamp): + + #time_set=substract_utc(timestamp) + + #return time.strftime(sql_format_time, time_set) + + return arrow.get(timestamp).format(sql_format_time) + +# Get a utc timestamp and convert to local + +def timestamp_to_datetime_local(timestamp, tz=''): + + #time_set=time.localtime(timestamp) + + #return time.strftime(sql_format_time, time_set) + + t=arrow.get(timestamp) + + if tz=='': + tz=environ['TZ'] + + return t.to(tz).format(sql_format_time) + + +def format_datetime(format_time, timeform, func_utc_return): + + timestamp=obtain_timestamp(timeform) + + if timestamp: + + t=func_utc_return(timestamp) + + return t.format(format_time) + + else: + + return False + +# This method parse local time to gmt + +def local_to_gmt(timeform, sql_format_time=sql_format_time): + + return format_datetime(sql_format_time, timeform, substract_utc) + +# time.localtime is useless, you need sum the time offset to the date + +def gmt_to_local(timeform, sql_format_time=sql_format_time): + + return format_datetime(sql_format_time, timeform, sum_utc) + +def format_time(timeform): + + return format_datetime(format_time_txt, timeform, sum_utc) + +def format_date(timeform): + + return format_datetime(format_date_txt, timeform, sum_utc) + +def format_fulldate(timeform): + + return format_datetime(format_date_txt+' '+format_time_txt, timeform, sum_utc) + +def format_local_time(timeform): + + return format_datetime(format_time_txt, timeform, no_utc) + +def format_local_date(timeform): + + return format_datetime(format_date_txt, timeform, no_utc) + +def format_local_fulldate(timeform): + + return format_datetime(format_date_txt+' '+format_time_txt, timeform, no_utc) + +def format_strtime(strtime, timeform): + + return format_datetime(strtime, timeform, sum_utc) + +def format_local_strtime(strtime, timeform): + + return format_datetime(strtime, timeform, no_utc) + +#Input is utc timestamp, return local arrow object + +def sum_utc(timestamp, tz=''): + + #offset=time.altzone + + #return time.localtime(timestamp-offset) + + t=arrow.get(timestamp) + + if tz=='': + tz=environ['TZ'] + + return t.to(tz) + +#Input is local timestamp, return utc arrow object + +def substract_utc(timestamp, tz=''): + + #offset=time.altzone + + #return time.localtime(timestamp+offset) + + #t=arrow.get(timestamp).to('UTC') + + timeform=timestamp_to_datetime(timestamp) + + y, m, d, h, mi, s=format_timedata(timeform) + + if tz=='': + tz=environ['TZ'] + + t=arrow.get(datetime(y, m, d, h, mi, s), tz).to('UTC') + + return t + +def no_utc(timestamp): + + return arrow.get(timestamp) + +# def date_to_sql(date_sql): + + + +class TimeClass: + + def __init__(self, timestamp=None, tz=''): + + self.utc=False + + self.format_time=sql_format_time + self.format_time_txt=format_time_txt + + self.format_date_txt=format_date_txt + + self.format_date_full=format_date_txt+' '+format_time_txt + + self.tz=environ.get('TZ', 'utc') + + if tz: + self.tz=tz + + if type(timestamp).__name__=='int': + """ + if self.utc: + + self.datetime=utcnow() + + else: + """ + self.datetime=timestamp_to_datetime(timestamp) + + else: + + if not timestamp: + + self.datetime=now(self.utc, tz) + + else: + self.datetime=timestamp + + y, m, d, h, mi, s=format_timedata(self.datetime) + + self.t=arrow.get(datetime(y, m, d, h, mi, s), self.tz) + + def add_month(self, num_months): + + m=self.t.shift(months=+num_months) + + return m.format(self.format_time) + + def substract_month(self, num_months): + + m=self.t.shift(months=-num_months) + + return m.format(self.format_time) + + def add_day(self, num_days): + + m=self.t.shift(days=+num_days) + + return m.format(self.format_time) + + def substract_day(self, num_days): + + m=self.t.shift(days=-num_days) + + return m.format(self.format_time) + + def add_year(self, num_years): + + m=self.t.shift(years=+num_years) + + return m.format(self.format_time) + + def substract_year(self, num_years): + + m=self.t.shift(years=-num_years) + + return m.format(self.format_time) + + def add_hour(self, num_hours): + + m=self.t.shift(hours=+num_hours) + + return m.format(self.format_time) + + def substract_hour(self, num_hours): + + m=self.t.shift(hours=-num_hours) + + return m.format(self.format_time) + + def format(self): + + return self.t.format(self.format_date_full) + + def local_to_utc(self): + + self.t=self.t.to('utc') + + # Only use + + def utc_to_local(self): + + self.t=self.t.to(self.tz) + + def local_to_tz(self, tz): + + self.t=self.t.to(tz) + + def now(self, utc=False): + + if not utc: + + actual=arrow.now(self.tz).format(sql_format_time) + else: + actual=arrow.utcnow().format(sql_format_time) + + return actual + + def today(self, utc=False): + + if utc: + + return arrow.utcnow()[:8]+'000000' + else: + return arrow.now(self.tz)[:8]+'000000' + + def timestamp_to_datetime(self, timestamp): + + return arrow.get(timestamp).format(sql_format_time) + + def obtain_timestamp(self, timeform): + + y, m, d, h, mi, s=format_timedata(timeform) + + if checkdatetime(y, m, d, h, mi, s): + + timestamp=arrow.arrow.Arrow(y, m, d, h, mi, s).timestamp + + return timestamp + + else: + return False + + def format_strtime(self, strtime, timeform): + + #timestamp=self.obtain_timestamp(timeform) + try: + y, m, d, h, mi, s=format_timedata(timeform) + + return arrow.get(datetime(y, m, d, h, mi, s), self.tz).format(strtime) + + except: + + return False diff --git a/paramecio2/libraries/db/extrafields/datefield.py b/paramecio2/libraries/db/extrafields/datefield.py index 40803ad..6e1f62c 100644 --- a/paramecio2/libraries/db/extrafields/datefield.py +++ b/paramecio2/libraries/db/extrafields/datefield.py @@ -1,5 +1,5 @@ from paramecio2.libraries.db.corefields import PhangoField -from paramecio.citoplasma import datetime +from paramecio2.libraries import datetime from paramecio2.libraries.db.extraforms.dateform import DateForm class DateField(PhangoField): diff --git a/paramecio2/libraries/db/extrafields/datetimefield.py b/paramecio2/libraries/db/extrafields/datetimefield.py index 9e5050d..38f15f4 100644 --- a/paramecio2/libraries/db/extrafields/datetimefield.py +++ b/paramecio2/libraries/db/extrafields/datetimefield.py @@ -1,5 +1,5 @@ from paramecio2.libraries.db.corefields import PhangoField -from paramecio.citoplasma import datetime +from paramecio2.libraries import datetime from paramecio2.libraries.db.extraforms.dateform import DateForm class DateTimeField(PhangoField):