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) }}

Select Plots

{{ embed(roots.toggle_delay_spectrum) }}