From c9c53aa592245067ce4488f1d570ffbf2e053c0d Mon Sep 17 00:00:00 2001 From: Krateng Date: Thu, 11 Apr 2019 10:49:56 +0200 Subject: [PATCH] Complete rework of time descriptors, A New Hope --- htmlmodules.py | 7 +++++++ malojatime.py | 28 ++++++++++++++++------------ urihandler.py | 9 ++++++--- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/htmlmodules.py b/htmlmodules.py index 51af4bc..987cb7b 100644 --- a/htmlmodules.py +++ b/htmlmodules.py @@ -5,6 +5,7 @@ from malojatime import * from urihandler import compose_querystring, internal_to_uri, uri_to_internal import urllib import datetime +import math #def getpictures(ls,result,tracks=False): @@ -602,6 +603,12 @@ def module_filterselection(keys,time=True,delimit=False): html += "Long Trailing" else: html += "Long Trailing" + html += " | " + + if delimitkeys.get("trail") == math.inf: + html += "Cumulative" + else: + html += "Cumulative" html += "" diff --git a/malojatime.py b/malojatime.py index b9300a6..247d2ba 100644 --- a/malojatime.py +++ b/malojatime.py @@ -1,6 +1,7 @@ import datetime from calendar import monthrange from os.path import commonprefix +import math FIRST_SCROBBLE = int(datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).timestamp()) @@ -173,6 +174,7 @@ class MTime(MRangeDescriptor): # next range of equal length (not exactly same amount of days, but same precision level) def next(self,step=1): + if abs(step) == math.inf: return None if self.precision == 1: return MTime(self.year + step) elif self.precision == 2: @@ -252,6 +254,7 @@ class MTimeWeek(MRangeDescriptor): return int(datetime.datetime.combine(day,datetime.time(tzinfo=datetime.timezone.utc)).timestamp() - 1) def next(self,step=1): + if abs(step) == math.inf: return None try: return MTimeWeek(self.year,self.week + step) except: @@ -265,7 +268,8 @@ class MRange(MRangeDescriptor): since,to = time_pad(since,to) self.since = since self.to = to - + if isinstance(self.since,MRange): self.since = self.since.start() + if isinstance(self.to,MRange): self.to = self.to.end() def __str__(self): return str(self.since) + " - " + str(self.to) @@ -319,6 +323,7 @@ class MRange(MRangeDescriptor): else: return self.to.last_stamp() def next(self,step=1): + if abs(step) == math.inf: return None # hop from the start element by one until we reach the end element diff = 1 nxt = self.since @@ -512,7 +517,8 @@ def delimit_desc(step="month",stepn=1,trail=1): if stepn is not 1: txt += _num(stepn) + "-" txt += {"year":"Yearly","month":"Monthly","week":"Weekly","day":"Daily"}[step.lower()] #if trail is not 1: txt += " " + _num(trail) + "-Trailing" - if trail is not 1: txt += " Trailing" #we don't need all the info in the title + if trail is math.inf: txt += " Cumulative" + elif trail is not 1: txt += " Trailing" #we don't need all the info in the title return txt @@ -547,19 +553,17 @@ def ranges(since=None,to=None,within=None,timerange=None,step="month",stepn=1,tr (firstincluded,lastincluded) = time_stamps(since=since,to=to,within=within,range=timerange) d_start = from_timestamp(firstincluded,step) - d_start = d_start.next(stepn) - d_start = d_start.next(stepn*trail*-1) - first_range = MRange(d_start,d_start.next(stepn*trail-1)) + d_start = d_start.next(stepn-1) #last part of first included range i = 0 - current = d_start - while current.first_stamp() <= lastincluded and (max_ is None or i < max_): - current_end = current.next(stepn*trail-1) - if current == current_end: - yield current + current_end = d_start + while current_end.first_stamp() <= lastincluded and (max_ is None or i < max_): + current_start = current_end.next((stepn*trail-1)*-1) + if current_start == current_end: + yield current_start else: - yield MRange(current,current_end) - current = current.next(stepn) + yield MRange(current_start,current_end) + current_end = current_end.next(stepn) i += 1 diff --git a/urihandler.py b/urihandler.py index 7fe4528..db0d49d 100644 --- a/urihandler.py +++ b/urihandler.py @@ -1,7 +1,7 @@ import urllib from bottle import FormsDict from malojatime import time_fix, time_str, get_range_object - +import math # necessary because urllib.parse.urlencode doesnt handle multidicts def compose_querystring(*dicts,exclude=[]): @@ -91,7 +91,6 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False): elif "within" in keys: within = keys.get("within") elif "during" in keys: within = keys.get("during") resultkeys2["timerange"] = get_range_object(since=since,to=to,within=within) - print(resultkeys2["timerange"].desc()) #3 resultkeys3 = {"step":"month","stepn":1,"trail":1} @@ -99,6 +98,7 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False): if "stepn" in keys: resultkeys3["stepn"] = keys["stepn"] #overwrite if explicitly given if "stepn" in resultkeys3: resultkeys3["stepn"] = int(resultkeys3["stepn"]) #in both cases, convert it here if "trail" in keys: resultkeys3["trail"] = int(keys["trail"]) + if "cumulative" in keys: resultkeys3["trail"] = math.inf @@ -140,7 +140,10 @@ def internal_to_uri(keys): if "stepn" in keys: urikeys.append("stepn",str(keys["stepn"])) if "trail" in keys: - urikeys.append("trail",str(keys["trail"])) + if keys["trail"] == math.inf: + urikeys.append("cumulative","yes") + else: + urikeys.append("trail",str(keys["trail"])) # stuff if "max_" in keys: