Skip to content

Commit

Permalink
feat(gui): add option: sort days by number of opinions
Browse files Browse the repository at this point in the history
  • Loading branch information
nritsche committed Dec 16, 2020
1 parent aad52bb commit 5cc89f3
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 15 deletions.
45 changes: 30 additions & 15 deletions bondia/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class BondiaGui(param.Parameterized):
lsd = param.ObjectSelector(label="Select Sidereal Day")
revision = param.ObjectSelector(label="Select Data Revision")
filter_lsd = param.Boolean(default=False, label="Hide days I have voted for")
sort_lsds = param.Boolean(default=False, label="Sort by number of opinions")

def __init__(
self,
Expand Down Expand Up @@ -65,20 +66,31 @@ def __init__(
self.param["lsd"].objects = list(self._data.days(self.revision))
self.lsd = self._choose_lsd()

@param.depends("revision", "filter_lsd", watch=True)
@param.depends("revision", "filter_lsd", "sort_lsds", watch=True)
def update_days(self):
"""Update days depending on selected revision."""

if self.filter_lsd and self.current_user is not None:
self.param["lsd"].objects = opinion.get_days_without_opinion(
days = opinion.get_days_without_opinion(
list(self._data.days(self.revision)),
self.revision,
self.current_user,
)
else:
self.param["lsd"].objects = list(self._data.days(self.revision))
days = list(self._data.days(self.revision))

if self.sort_lsds:
days = opinion.sort_by_num_opinions(self.revision, days)

self.param["lsd"].objects = days

if self.param["lsd"].objects:
self.lsd = self._choose_lsd()
l = self._choose_lsd()
if getattr(self, "lsd", -1) == l:
self.lsd = l
self.param.trigger("lsd")
else:
self.lsd = l

@param.depends("lsd")
def data_description(self):
Expand All @@ -99,20 +111,19 @@ def update_data_description_day(self):
plot.revision = self.revision

def _choose_lsd(self):
selected_day = getattr(self, "lsd", None)
if self.sort_lsds:
day = self.param["lsd"].objects[0]
else:
selected_day = getattr(self, "lsd", None)

days = self._data.days(self.revision)
if self.current_user is None:
return days[-1]
day = opinion.get_day_without_opinion(
selected_day, days, self.revision, self.current_user
)
days = self._data.days(self.revision)
if self.current_user is None:
return days[-1]
day = opinion.get_day_without_opinion(
selected_day, days, self.revision, self.current_user
)
logger.debug(f"Chose new LSD to display: {day}.")

# If day doesn't change, the opinion UI is not updated. So we do it here...
if hasattr(self, "lsd") and day == selected_day:
self.param.trigger("lsd")

return day

def _update_opinion_warning(self):
Expand Down Expand Up @@ -194,6 +205,8 @@ def populate_template(self, template):

# Checkbox to show only days w/o opinion
template.add_panel("day_filter_opinion_checkbox", self.param["filter_lsd"])
# Checkbox to sort days by number of opinions
template.add_panel("day_sort_checkbox", self.param["sort_lsds"])

# Fill the template with components
template.add_panel("data_description", self.data_description)
Expand Down Expand Up @@ -321,6 +334,8 @@ def _click_opinion(self, event, decision):
else:
self._opinion_warning.alert_type = "success"
self._opinion_warning.object = f"Opinion added for LSD {lsd.lsd}"
if self.sort_lsds or self.filter_lsd:
self.update_days()
self.lsd = self._choose_lsd()

@property
Expand Down
37 changes: 37 additions & 0 deletions bondia/opinion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

from time import time

from peewee import fn

from chimedb.dataflag import DataFlagOpinion, DataFlagOpinionType, DataRevision
from chimedb.core.mediawiki import MediaWikiUser

Expand Down Expand Up @@ -102,6 +104,39 @@ def get_days_with_opinion(revision, user):
return [d.lsd for d in days_with_opinion]


def sort_by_num_opinions(revision, lsds):
results = (
DataFlagOpinion.select(
DataFlagOpinion.lsd, fn.COUNT(DataFlagOpinion.id).alias("count")
)
.join(DataRevision)
.where(
DataRevision.name == revision, DataFlagOpinion.lsd << [d.lsd for d in lsds]
)
.group_by(DataFlagOpinion.lsd)
.order_by(fn.COUNT(DataFlagOpinion.id))
).execute()

lsds = {day.lsd: day for day in lsds}
sort_keys = [(r.count, r.lsd) for r in results]
_, lsd_keys = zip(*sort_keys)

# add the days witout opinions
for lsd in lsds.keys():
if lsd not in lsd_keys:
lsd_keys.append(lsd)
sort_keys.append((lsd, 0))

sort_keys.sort()

# reuse old day objects
sorted_lsds = []
for keys in sort_keys:
sorted_lsds.append(lsds[keys[1]])

return sorted_lsds


def get_days_without_opinion(days, revision, user):
user = user.capitalize()
days_with_opinion = get_days_with_opinion(revision, user)
Expand Down Expand Up @@ -215,6 +250,8 @@ def get_notes_for_day(day):
Dict[string, Tuple[string, string]]
Decisions ("good", "bad" or "unsure") and notes with user names as keys
"""
if day is None:
return {}
try:
entries = DataFlagOpinion.select(
DataFlagOpinion.notes, DataFlagOpinion.decision, DataFlagOpinion.user_id
Expand Down
1 change: 1 addition & 0 deletions bondia/templates/material.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<div align="center"><p><h4>Select Day</h4></p>
{{ embed(roots.day_selector) | indent(8) }}</div>
{{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.day_sort_checkbox) }}
<hr>
<div>{{ embed(roots.plot_selector) | indent(8) }}</div>
<hr>
Expand Down
1 change: 1 addition & 0 deletions bondia/templates/mdl.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
{{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.day_sort_checkbox) }}
<hr>
<div><h4>Select Plots</h4></div>
<div>{{ embed(roots.toggle_delay_spectrum) }}</div>
Expand Down
1 change: 1 addition & 0 deletions bondia/templates/mdl_tabs.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
{{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.day_sort_checkbox) }}
<hr>
<div align="center"><h4>Select Plots</h4></div>
<div>{{ embed(roots.toggle_delay_spectrum) }}</div>
Expand Down
1 change: 1 addition & 0 deletions bondia/templates/mwc.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
{{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.day_sort_checkbox) }}
<hr>
<div align="center"><p><h4>Select Plots</h4></p></div>
<div>{{ embed(roots.toggle_delay_spectrum) }}</div>
Expand Down

0 comments on commit 5cc89f3

Please sign in to comment.