From a36f0c4ab9e6ba266debd68e9fe215a8c0c90da3 Mon Sep 17 00:00:00 2001 From: Krateng Date: Wed, 10 Apr 2019 17:56:40 +0200 Subject: [PATCH] Complete rework of time descriptors, Electric Boogaloo --- database.py | 2 +- htmlmodules.py | 45 ++++++++++++++++++++++------------------- malojatime.py | 52 ++++++++++++++++++++++++++++++++++++------------ urihandler.py | 9 +++++---- website/pulse.py | 2 +- 5 files changed, 70 insertions(+), 40 deletions(-) diff --git a/database.py b/database.py index aaf749a..7184748 100644 --- a/database.py +++ b/database.py @@ -382,7 +382,7 @@ def get_pulse_external(): def get_pulse(**keys): - rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","step","stepn","trail"]}) + rngs = ranges(**{k:keys[k] for k in keys if k in ["timerange","step","stepn","trail"]}) results = [] for rng in rngs: diff --git a/htmlmodules.py b/htmlmodules.py index bc82739..0dfe999 100644 --- a/htmlmodules.py +++ b/htmlmodules.py @@ -64,7 +64,7 @@ def module_scrobblelist(max_=None,pictures=False,shortTimeDesc=False,earlystop=F def module_pulse(max_=None,**kwargs): kwargs_filter = pickKeys(kwargs,"artist","track","associated") - kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail") + kwargs_time = pickKeys(kwargs,"timerange","step","stepn","trail") ranges = database.get_pulse(**kwargs_time,**kwargs_filter) @@ -499,47 +499,44 @@ def module_filterselection(keys,time=True,delimit=False): # html += "to " # html += "" - - now = datetime.datetime.utcnow() - today = [now.year,now.month,now.day] - thismonth = today[:2] - thisyear = thismonth[:1] + from malojatime import today, thisweek, thismonth, thisyear ### temp!!! this will not allow weekly rank changes - weekday = ((now.isoweekday()) % 7) - weekbegin = now - datetime.timedelta(days=weekday) - weekend = weekbegin + datetime.timedelta(days=6) - weekbegin = [weekbegin.year,weekbegin.month,weekbegin.day] - weekend = [weekend.year,weekend.month,weekend.day] - weekbeginstr = "/".join((str(num) for num in weekbegin)) - weekendstr = "/".join((str(num) for num in weekend)) + # weekday = ((now.isoweekday()) % 7) + # weekbegin = now - datetime.timedelta(days=weekday) + # weekend = weekbegin + datetime.timedelta(days=6) + # weekbegin = [weekbegin.year,weekbegin.month,weekbegin.day] + # weekend = [weekend.year,weekend.month,weekend.day] + # weekbeginstr = "/".join((str(num) for num in weekbegin)) + # weekendstr = "/".join((str(num) for num in weekend)) + html += "
" - if timekeys.get("since") == today or timekeys.get("within") == today: + if timekeys.get("timerange") == today(): html += "Today" else: html += "Today" html += " | " - if timekeys.get("since") == weekbegin and timekeys.get("to") == weekend: + if timekeys.get("timerange") == thisweek(): html += "This Week" else: - html += "This Week" + html += "This Week" html += " | " - if timekeys.get("since") == thismonth or timekeys.get("within") == thismonth: + if timekeys.get("timerange") == thismonth(): html += "This Month" else: html += "This Month" html += " | " - if timekeys.get("since") == thisyear or timekeys.get("within") == thisyear: + if timekeys.get("timerange") == thisyear(): html += "This Year" else: html += "This Year" html += " | " - if timekeys.get("since") is None and timekeys.get("within") is None: + if timekeys == {}: html += "All Time" else: html += "All Time" @@ -561,7 +558,13 @@ def module_filterselection(keys,time=True,delimit=False): html += "Daily" html += " | " - if (delimitkeys.get("step") == "month" or delimitkeys.get("step") is None) and delimitkeys.get("stepn") == 1: + if delimitkeys.get("step") == "week" and delimitkeys.get("stepn") == 1: + html += "Weekly" + else: + html += "Weekly" + html += " | " + + if delimitkeys.get("step") == "month" and delimitkeys.get("stepn") == 1: html += "Monthly" else: html += "Monthly" @@ -579,7 +582,7 @@ def module_filterselection(keys,time=True,delimit=False): unchangedkeys_sub = internal_to_uri({k:delimitkeys[k] for k in delimitkeys if k != "trail"}) html += "
" - if delimitkeys.get("trail") == 1 or delimitkeys.get("trail") is None: + if delimitkeys.get("trail") == 1: html += "Standard" else: html += "Standard" diff --git a/malojatime.py b/malojatime.py index 78e021e..22dc3d3 100644 --- a/malojatime.py +++ b/malojatime.py @@ -58,7 +58,8 @@ date = expandeddate class MRangeDescriptor: def __eq__(self,other): - return self.first_stamp() == other.first_stamp() and self.last_stamp() == other.last_stamp()# + if not isinstance(other,MRangeDescriptor): return False + return (self.first_stamp() == other.first_stamp() and self.last_stamp() == other.last_stamp()) def __hash__(self): return hash((self.first_stamp(),self.last_stamp())) @@ -286,6 +287,8 @@ class MRange(MRangeDescriptor): return "since " + self.since.desc() if self.since is None and self.to is not None: return "until " + self.to.desc() + if self.since is None and self.to is None: + return "" def informal_desc(self): # dis gonna be hard @@ -332,9 +335,13 @@ y = MTime(2020) +def range_desc(r,**kwargs): + if r is None: return "" + return r.desc(**kwargs) def time_str(t): - return str(t) + obj = time_fix(t) + return obj.desc() # converts strings and stuff to objects def time_fix(t): @@ -347,11 +354,13 @@ def time_fix(t): weekdays = ["sunday","monday","tuesday","wednesday","thursday","friday","saturday"] if t.lower() in ["today","day"]: - t = [tod.year,tod.month,tod.day] - elif t.lower() == "month": - t = [tod.year,tod.month] - elif t.lower() == "year": - t = [tod.year] + return today() + elif t.lower() in ["month","thismonth"]: + return thismonth() + elif t.lower() in ["year","thisyear"]: + return thisyear() + elif t.lower() in ["week","thisweek"]: + return thisweek() elif t.lower() in months: @@ -421,8 +430,7 @@ def time_pad(f,t,full=False): return f,t -def range_desc(f,t,short=False): - return MRange(time_fix(f),time_fix(t)).desc() + @@ -496,7 +504,7 @@ def time_stamps(since=None,to=None,within=None,range=None): def delimit_desc(step="month",stepn=1,trail=1): txt = "" if stepn is not 1: txt += _num(stepn) + "-" - txt += {"year":"Yearly","month":"Monthly","day":"Daily"}[step.lower()] + 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 @@ -527,9 +535,9 @@ def from_timestamp(stamp,unit): if unit == "year": return year_from_timestamp(stamp) -def ranges(since=None,to=None,within=None,superrange=None,step="month",stepn=1,trail=1,max_=None): +def ranges(since=None,to=None,within=None,timerange=None,step="month",stepn=1,trail=1,max_=None): - (firstincluded,lastincluded) = time_stamps(since=since,to=to,within=within,range=superrange) + (firstincluded,lastincluded) = time_stamps(since=since,to=to,within=within,range=timerange) d_start = from_timestamp(firstincluded,step) d_start = d_start.next(stepn) @@ -540,12 +548,30 @@ def ranges(since=None,to=None,within=None,superrange=None,step="month",stepn=1,t current = d_start while current.first_stamp() <= lastincluded and (max_ is None or i < max_): current_end = current.next(stepn*trail-1) - yield MRange(current,current_end) + if current == current_end: + yield current + else: + yield MRange(current,current_end) current = current.next(stepn) i += 1 + +def today(): + tod = date.today() + return MTime(tod.year,tod.month,tod.day) +def thisweek(): + tod = date.today() + y,w,_ = tod.chrcalendar() + return MTimeWeek(y,w) +def thismonth(): + tod = date.today() + return MTime(tod.year,tod.month) +def thisyear(): + tod = date.today() + return MTime(tod.year) + #def _get_start_of(timestamp,unit): # date = datetime.datetime.utcfromtimestamp(timestamp) # if unit == "year": diff --git a/urihandler.py b/urihandler.py index 96a594e..7fe4528 100644 --- a/urihandler.py +++ b/urihandler.py @@ -39,7 +39,7 @@ def remove_identical(*dicts): return new - +# this also sets defaults! def uri_to_internal(keys,forceTrack=False,forceArtist=False): # output: @@ -94,13 +94,14 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False): print(resultkeys2["timerange"].desc()) #3 - resultkeys3 = {} + resultkeys3 = {"step":"month","stepn":1,"trail":1} if "step" in keys: [resultkeys3["step"],resultkeys3["stepn"]] = (keys["step"].split("-") + [1])[:2] 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"]) + #4 resultkeys4 = {} if "max" in keys: resultkeys4["max_"] = int(keys["max"]) @@ -121,8 +122,8 @@ def internal_to_uri(keys): urikeys.append("title",keys["track"]["title"]) #time - if "range" in keys: - keydict = keys["range"].urikeys() + if "timerange" in keys: + keydict = keys["timerange"].urikeys() for k in keydict: urikeys.append(k,keydict[k]) elif "within" in keys: diff --git a/website/pulse.py b/website/pulse.py index 61b9818..beb701e 100644 --- a/website/pulse.py +++ b/website/pulse.py @@ -29,7 +29,7 @@ def instructions(keys): if moreartists != []: limitstring += " including " + artistLinks(moreartists) + "" - limitstring += " " + timekeys["timerange"].desc(prefix=True) + limitstring += " " + range_desc(timekeys["timerange"],prefix=True) delimitstring = delimit_desc(**delimitkeys)