From 3935db4bf8489dcbaa62df0b93c0a720e5c1745f Mon Sep 17 00:00:00 2001
From: Rick Nitsche
Date: Tue, 3 Nov 2020 17:52:41 -0800
Subject: [PATCH] feat(gui): add option to hide days with opinion
Closes #65
---
bondia/gui.py | 25 +++++++++++++++++++-
bondia/opinion.py | 43 +++++++++++++++++++++++++++-------
bondia/plot/delayspectrum.py | 2 ++
bondia/plot/ringmap.py | 14 +++++++++++
bondia/plot/sensitivity.py | 4 ++++
bondia/templates/material.html | 1 +
bondia/templates/mdl.html | 1 +
bondia/templates/mdl_tabs.html | 1 +
bondia/templates/mwc.html | 1 +
9 files changed, 83 insertions(+), 9 deletions(-)
diff --git a/bondia/gui.py b/bondia/gui.py
index 1f44810..7facdf1 100644
--- a/bondia/gui.py
+++ b/bondia/gui.py
@@ -25,6 +25,9 @@ def __init__(self, template, width_drawer_widgets, data_loader, config_plots):
self._opinion_header = pn.pane.Markdown(
"####Opinion", width=width_drawer_widgets
)
+ self._day_filter_opinion = pn.widgets.Checkbox(
+ name="Hide days I have voted for", disabled=self.current_user is None
+ )
# TODO: remove after https://github.com/holoviz/panel/commit/203a16c10cb8fd4c55ec7887fade561ecc222938
pn.pane.Alert.priority = 0
@@ -104,7 +107,17 @@ def populate_template(self, template):
def update_days(day_selector, event):
"""Update days depending on selected revision."""
- day_selector.value = self._choose_lsd()
+ if self._day_filter_opinion.value and self.current_user is not None:
+ day_selector.options = opinion.get_days_without_opinion(
+ list(self._data.days(self.rev_selector.value)),
+ self.rev_selector.value,
+ self.current_user,
+ )
+ else:
+ day_selector.options = list(self._data.days(self.rev_selector.value))
+
+ if self.day_selector.options:
+ day_selector.value = self._choose_lsd()
# Add a title over the plots showing the selected day and rev (and keep it updated)
data_description = pn.pane.Markdown(
@@ -123,6 +136,12 @@ def update_data_description_day(data_description, event):
data_description, callbacks={"value": update_data_description_day}
)
+ # Checkbox to show only days w/o opinion
+ template.add_panel("day_filter_opinion_checkbox", self._day_filter_opinion)
+ self._day_filter_opinion.link(
+ self.day_selector, callbacks={"value": update_days}
+ )
+
# Fill the template with components
template.add_panel("data_description", data_description)
template.add_panel("data_description1", data_description)
@@ -222,6 +241,10 @@ def toggle_plot(event, toggle_plot):
def _click_opinion(self, event, decision):
lsd = self.day_selector.value
+ if lsd is None:
+ self._opinion_warning.alert_type = "danger"
+ self._opinion_warning.object = "No data selected."
+ return
try:
opinion.insert(
self.current_user,
diff --git a/bondia/opinion.py b/bondia/opinion.py
index b751620..d594fde 100644
--- a/bondia/opinion.py
+++ b/bondia/opinion.py
@@ -20,6 +20,8 @@
def get(lsd, revision, user):
+ if lsd is None:
+ return None
user = user.capitalize()
try:
return (
@@ -40,6 +42,8 @@ def get(lsd, revision, user):
def insert(user, lsd, revision, decision):
+ if lsd is None:
+ return
user = user.capitalize()
try:
existing_decision = (
@@ -82,6 +86,36 @@ def insert(user, lsd, revision, decision):
existing_decision.save()
+def get_days_with_opinion(revision, user):
+ user = user.capitalize()
+ days_with_opinion = (
+ DataFlagOpinion.select(DataFlagOpinion.lsd)
+ .join(MediaWikiUser)
+ .switch(DataFlagOpinion)
+ .join(DataRevision)
+ .where(MediaWikiUser.user_name == user, DataRevision.name == revision)
+ )
+ return [d.lsd for d in days_with_opinion]
+
+
+def get_days_without_opinion(days, revision, user):
+ user = user.capitalize()
+ days_with_opinion = get_days_with_opinion(revision, user)
+ logger.debug(
+ f"Days w/ opinion for user {user}, rev {revision}: {days_with_opinion}."
+ )
+ days_without_opinion = []
+
+ for d in days:
+ if d.lsd not in days_with_opinion:
+ days_without_opinion.append(d)
+
+ logger.debug(
+ f"Days w/o opinion for user {user}, rev {revision}: {days_without_opinion}."
+ )
+ return days_without_opinion
+
+
def get_day_without_opinion(last_selected_day, days, revision, user):
"""
Find a day the user hasn't voted on.
@@ -105,14 +139,7 @@ def get_day_without_opinion(last_selected_day, days, revision, user):
If `last_selected_day` is None, the latest day without an opinion by that user will be returned.
"""
user = user.capitalize()
- days_with_opinion = (
- DataFlagOpinion.select(DataFlagOpinion.lsd)
- .join(MediaWikiUser)
- .switch(DataFlagOpinion)
- .join(DataRevision)
- .where(MediaWikiUser.user_name == user, DataRevision.name == revision)
- )
- days_with_opinion = [d.lsd for d in days_with_opinion]
+ days_with_opinion = get_days_with_opinion(revision, user)
logger.debug(
f"Days w/ opinion for user {user}, rev {revision}: {days_with_opinion}."
)
diff --git a/bondia/plot/delayspectrum.py b/bondia/plot/delayspectrum.py
index 331d82a..1155a69 100644
--- a/bondia/plot/delayspectrum.py
+++ b/bondia/plot/delayspectrum.py
@@ -50,6 +50,8 @@ def __init__(self, data, config, **params):
"helper_lines",
)
def view(self):
+ if self.lsd is None:
+ return panel.pane.Markdown("No data selected.")
try:
spectrum = self.data.load_file(self.revision, self.lsd, "delayspectrum")
except DataError as err:
diff --git a/bondia/plot/ringmap.py b/bondia/plot/ringmap.py
index 09c7864..593bf69 100644
--- a/bondia/plot/ringmap.py
+++ b/bondia/plot/ringmap.py
@@ -112,6 +112,10 @@ def _finalise_config(self):
@param.depends("lsd", watch=True)
def update_freqs(self):
+ if self.lsd is None:
+ # Anyways make sure watchers are triggered
+ self.param.trigger("frequency")
+ return
try:
rm = self.data.load_file(self.revision, self.lsd, "ringmap")
except DataError as err:
@@ -126,6 +130,10 @@ def update_freqs(self):
@param.depends("frequency", watch=True)
def update_beam(self):
+ if self.lsd is None:
+ # Anyways make sure watchers are triggered
+ self.param.trigger("beam")
+ return
try:
rm = self.data.load_file(self.revision, self.lsd, "ringmap")
except DataError as err:
@@ -139,6 +147,10 @@ def update_beam(self):
@param.depends("beam", watch=True)
def update_pol(self):
+ if self.lsd is None:
+ # Anyways make sure watchers are triggered
+ self.param.trigger("polarization")
+ return
try:
rm = self.data.load_file(self.revision, self.lsd, "ringmap")
except DataError as err:
@@ -186,6 +198,8 @@ def param_control(self):
"flags",
)
def view(self):
+ if self.lsd is None:
+ return panel.pane.Markdown("No data selected.")
try:
container = self.data.load_file(self.revision, self.lsd, "ringmap")
except DataError as err:
diff --git a/bondia/plot/sensitivity.py b/bondia/plot/sensitivity.py
index dc0d6f4..fbfdc66 100644
--- a/bondia/plot/sensitivity.py
+++ b/bondia/plot/sensitivity.py
@@ -63,6 +63,8 @@ def __init__(self, data, config, **params):
@param.depends("lsd", watch=True)
def update_pol(self):
+ if self.lsd is None:
+ return
try:
rm = self.data.load_file(self.revision, self.lsd, "sensitivity")
except DataError as err:
@@ -86,6 +88,8 @@ def update_pol(self):
"mask_rfi",
)
def view(self):
+ if self.lsd is None:
+ return panel.pane.Markdown("No data selected.")
try:
sens_container = self.data.load_file(self.revision, self.lsd, "sensitivity")
except DataError as err:
diff --git a/bondia/templates/material.html b/bondia/templates/material.html
index 8097de6..4d22bac 100644
--- a/bondia/templates/material.html
+++ b/bondia/templates/material.html
@@ -32,6 +32,7 @@
Select Day
{{ embed(roots.day_selector) | indent(8) }}
+ {{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.plot_selector) | indent(8) }}
diff --git a/bondia/templates/mdl.html b/bondia/templates/mdl.html
index 6d2e3a0..0d84caa 100644
--- a/bondia/templates/mdl.html
+++ b/bondia/templates/mdl.html
@@ -34,6 +34,7 @@
Select Data
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
+ {{ embed(roots.day_filter_opinion_checkbox) }}
Select Plots
{{ embed(roots.toggle_delay_spectrum) }}
diff --git a/bondia/templates/mdl_tabs.html b/bondia/templates/mdl_tabs.html
index 175fe55..f72647b 100644
--- a/bondia/templates/mdl_tabs.html
+++ b/bondia/templates/mdl_tabs.html
@@ -35,6 +35,7 @@
Select Data
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
+ {{ embed(roots.day_filter_opinion_checkbox) }}
Select Plots
{{ embed(roots.toggle_delay_spectrum) }}
diff --git a/bondia/templates/mwc.html b/bondia/templates/mwc.html
index 0865a01..499b461 100644
--- a/bondia/templates/mwc.html
+++ b/bondia/templates/mwc.html
@@ -56,6 +56,7 @@
Select Data
{{ embed(roots.rev_selector) }}
{{ embed(roots.day_selector) }}
+ {{ embed(roots.day_filter_opinion_checkbox) }}
{{ embed(roots.toggle_delay_spectrum) }}