[scrobbles] Add overlap map
This commit is contained in:
@ -331,10 +331,67 @@ class ScrobbleListView(LoginRequiredMixin, ListView):
|
|||||||
self.tag_list = tag_list
|
self.tag_list = tag_list
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
def _compute_overlap_groups(self, scrobbles):
|
||||||
|
parent = {}
|
||||||
|
|
||||||
|
def find(x):
|
||||||
|
while parent[x] != x:
|
||||||
|
parent[x] = parent[parent[x]]
|
||||||
|
x = parent[x]
|
||||||
|
return x
|
||||||
|
|
||||||
|
def union(x, y):
|
||||||
|
rx, ry = find(x), find(y)
|
||||||
|
if rx != ry:
|
||||||
|
parent[rx] = ry
|
||||||
|
|
||||||
|
for s in scrobbles:
|
||||||
|
parent[s.pk] = s.pk
|
||||||
|
|
||||||
|
def range_for(s):
|
||||||
|
start = s.timestamp
|
||||||
|
end = s.stop_timestamp
|
||||||
|
if end is None:
|
||||||
|
end = start + datetime.timedelta(hours=12)
|
||||||
|
return start, end
|
||||||
|
|
||||||
|
for i, a in enumerate(scrobbles):
|
||||||
|
a_start, a_end = range_for(a)
|
||||||
|
for b in scrobbles[i + 1 :]:
|
||||||
|
b_start, b_end = range_for(b)
|
||||||
|
if a_start <= b_end and b_start <= a_end:
|
||||||
|
union(a.pk, b.pk)
|
||||||
|
|
||||||
|
groups = {}
|
||||||
|
for s in scrobbles:
|
||||||
|
root = find(s.pk)
|
||||||
|
groups.setdefault(root, []).append(s.pk)
|
||||||
|
|
||||||
|
overlap_map = {}
|
||||||
|
color_idx = 0
|
||||||
|
COLORS = [
|
||||||
|
"border-start border-3 border-info",
|
||||||
|
"border-start border-3 border-success",
|
||||||
|
"border-start border-3 border-warning",
|
||||||
|
"border-start border-3 border-primary",
|
||||||
|
"border-start border-3 border-danger",
|
||||||
|
"border-start border-3 border-secondary",
|
||||||
|
]
|
||||||
|
for root, members in groups.items():
|
||||||
|
if len(members) >= 2:
|
||||||
|
color = COLORS[color_idx % len(COLORS)]
|
||||||
|
for pk in members:
|
||||||
|
overlap_map[pk] = color
|
||||||
|
color_idx += 1
|
||||||
|
|
||||||
|
return overlap_map
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data(**kwargs)
|
ctx = super().get_context_data(**kwargs)
|
||||||
ctx["tags_param"] = self.request.GET.get("tags", "")
|
ctx["tags_param"] = self.request.GET.get("tags", "")
|
||||||
ctx["tag_list"] = getattr(self, "tag_list", [])
|
ctx["tag_list"] = getattr(self, "tag_list", [])
|
||||||
|
scrobbles = list(ctx.get("object_list", []))
|
||||||
|
ctx["overlap_map"] = self._compute_overlap_groups(scrobbles)
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user