From 88c2e589017249feb41c72d2427e635b424bbad7 Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Tue, 14 Feb 2023 11:28:33 -0800 Subject: [PATCH 1/6] add optional dark mode to save my eyes. --- tom_common/templates/tom_common/base.html | 5 +++++ tom_common/templatetags/tom_common_extras.py | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/tom_common/templates/tom_common/base.html b/tom_common/templates/tom_common/base.html index 4837eedb6..dd4184633 100644 --- a/tom_common/templates/tom_common/base.html +++ b/tom_common/templates/tom_common/base.html @@ -9,6 +9,11 @@ {% bootstrap_css %} + + {% dark_mode as dark_mode %} + {% if dark_mode %} + + {% endif %} {% block additional_css %} {% endblock %} diff --git a/tom_common/templatetags/tom_common_extras.py b/tom_common/templatetags/tom_common_extras.py index 4e1aa4ecb..8652670ba 100644 --- a/tom_common/templatetags/tom_common_extras.py +++ b/tom_common/templatetags/tom_common_extras.py @@ -76,3 +76,9 @@ def truncate_number(value): @register.simple_tag def tom_name(): return getattr(settings, 'TOM_NAME', 'TOM Toolkit') + + +@register.simple_tag +def dark_mode(): + """Check for Dark Mode in Settings""" + return getattr(settings, 'DARK_MODE', False) From 1952c489f5b0d8a235a6650850871bd4f9ba32c2 Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Tue, 14 Feb 2023 14:06:37 -0800 Subject: [PATCH 2/6] actually include darkmode css --- tom_common/static/tom_common/css/dark.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tom_common/static/tom_common/css/dark.css diff --git a/tom_common/static/tom_common/css/dark.css b/tom_common/static/tom_common/css/dark.css new file mode 100644 index 000000000..f7a017eb4 --- /dev/null +++ b/tom_common/static/tom_common/css/dark.css @@ -0,0 +1,16 @@ +body { + background-color: black; + color: white; +} + +.table { + color: #f2f7fc; +} + +.card { + background-color: #ffffff3d; +} + +.card-header { + background-color: rgb(0 0 0 / 45%) +} From d8daf388da290bafc97933a17f5994446b30943f Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Wed, 15 Feb 2023 10:10:59 -0800 Subject: [PATCH 3/6] optimize some low hanging fruit and index on created for faster sorting. --- tom_common/templates/tom_common/index.html | 1 + tom_targets/models.py | 2 +- tom_targets/templatetags/targets_extras.py | 4 ++++ tom_targets/views.py | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tom_common/templates/tom_common/index.html b/tom_common/templates/tom_common/index.html index 93efe1501..295d5a588 100644 --- a/tom_common/templates/tom_common/index.html +++ b/tom_common/templates/tom_common/index.html @@ -46,3 +46,4 @@

Other Resources

{% endblock %} + \ No newline at end of file diff --git a/tom_targets/models.py b/tom_targets/models.py index 3955cc486..136d7d303 100644 --- a/tom_targets/models.py +++ b/tom_targets/models.py @@ -168,7 +168,7 @@ class Target(models.Model): max_length=100, choices=TARGET_TYPES, verbose_name='Target Type', help_text='The type of this target.' ) created = models.DateTimeField( - auto_now_add=True, verbose_name='Time Created', + auto_now_add=True, verbose_name='Time Created', db_index=True, help_text='The time which this target was created in the TOM database.' ) modified = models.DateTimeField( diff --git a/tom_targets/templatetags/targets_extras.py b/tom_targets/templatetags/targets_extras.py index d5c8a40b1..232ba62ae 100644 --- a/tom_targets/templatetags/targets_extras.py +++ b/tom_targets/templatetags/targets_extras.py @@ -315,4 +315,8 @@ def target_table(targets): Returns a partial for a table of targets, used in the target_list.html template by default """ + # Prefetch related tables to speed up target List Load + related_tables = ['aliases', 'dataproduct_set', 'observationrecord_set'] + for table in related_tables: + targets = targets.prefetch_related(table) return {'targets': targets} diff --git a/tom_targets/views.py b/tom_targets/views.py index 500c1e472..9bf6e89e4 100644 --- a/tom_targets/views.py +++ b/tom_targets/views.py @@ -50,7 +50,7 @@ class TargetListView(PermissionListMixin, FilterView): View for listing targets in the TOM. Only shows targets that the user is authorized to view. Requires authorization. """ template_name = 'tom_targets/target_list.html' - paginate_by = 25 + paginate_by = 10 strict = False model = Target filterset_class = TargetFilter From 74e34f0a69c306850977bde876eec1850d4e4468 Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Tue, 28 Feb 2023 16:40:57 -0800 Subject: [PATCH 4/6] limit location plot to only showing current page of targets --- tom_targets/templates/tom_targets/target_list.html | 2 +- tom_targets/templatetags/targets_extras.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tom_targets/templates/tom_targets/target_list.html b/tom_targets/templates/tom_targets/target_list.html index b336e54c4..6fc90584e 100644 --- a/tom_targets/templates/tom_targets/target_list.html +++ b/tom_targets/templates/tom_targets/target_list.html @@ -23,7 +23,7 @@ {% select_target_js %} - {% target_distribution filter.qs %} + {% target_distribution object_list %} {% bootstrap_pagination page_obj extra=request.GET.urlencode %} diff --git a/tom_targets/templatetags/targets_extras.py b/tom_targets/templatetags/targets_extras.py index 232ba62ae..78c478e6d 100644 --- a/tom_targets/templatetags/targets_extras.py +++ b/tom_targets/templatetags/targets_extras.py @@ -225,7 +225,8 @@ def target_distribution(targets): """ Displays a plot showing on a map the locations of all sidereal targets in the TOM. """ - locations = targets.filter(type=Target.SIDEREAL).values_list('ra', 'dec', 'name') + locations = targets.values_list('ra', 'dec', 'name') + data = [ dict( lon=[location[0] for location in locations], From a13b081079f5f575bb9c5ee8593d549932c008bb Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Fri, 17 Mar 2023 13:20:14 -0700 Subject: [PATCH 5/6] unused reference --- tom_targets/templatetags/targets_extras.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tom_targets/templatetags/targets_extras.py b/tom_targets/templatetags/targets_extras.py index 78c478e6d..9d7490e62 100644 --- a/tom_targets/templatetags/targets_extras.py +++ b/tom_targets/templatetags/targets_extras.py @@ -13,7 +13,7 @@ from plotly import graph_objs as go from tom_observations.utils import get_sidereal_visibility -from tom_targets.models import Target, TargetExtra, TargetList +from tom_targets.models import TargetExtra, TargetList from tom_targets.forms import TargetVisibilityForm register = template.Library() From b26c561bd68b39b0658e98d03db7978ea520a8e4 Mon Sep 17 00:00:00 2001 From: Joseph Chatelain Date: Mon, 27 Mar 2023 14:10:45 -0700 Subject: [PATCH 6/6] conditionally speed up home page for users with no permissions and non-superusers --- tom_targets/templatetags/targets_extras.py | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tom_targets/templatetags/targets_extras.py b/tom_targets/templatetags/targets_extras.py index 9d7490e62..69cdd3217 100644 --- a/tom_targets/templatetags/targets_extras.py +++ b/tom_targets/templatetags/targets_extras.py @@ -8,12 +8,14 @@ from django.conf import settings from django.db.models import Q from guardian.shortcuts import get_objects_for_user +from guardian.models import GroupObjectPermission +from guardian.core import ObjectPermissionChecker import numpy as np from plotly import offline from plotly import graph_objs as go from tom_observations.utils import get_sidereal_visibility -from tom_targets.models import TargetExtra, TargetList +from tom_targets.models import TargetExtra, TargetList, Target from tom_targets.forms import TargetVisibilityForm register = template.Library() @@ -24,8 +26,28 @@ def recent_targets(context, limit=10): """ Displays a list of the most recently created targets in the TOM up to the given limit, or 10 if not specified. """ + # Get User and group permissions for user user = context['request'].user - return {'targets': get_objects_for_user(user, 'tom_targets.view_target').order_by('-created')[:limit]} + groups = user.groups.all() + group_permissions = GroupObjectPermission.objects.filter(group__in=groups, permission__codename='view_target') + + # Build Query for the most recently created objects + target_query = Target.objects.order_by('-created').prefetch_related()[:limit] + + # Build permission checker and check if user has permission to view each target + checker = ObjectPermissionChecker(user) + checker.prefetch_perms(target_query) + targets = [target for target in target_query if checker.has_perm('view_target', target)] + + if targets: + # If any of these targets are viewable, display them + return {'targets': targets} + elif group_permissions.count(): + # Otherwise, if user has permission to view ANY target, find them. (EXPENSIVE) + return {'targets': get_objects_for_user(user, 'tom_targets.view_target').order_by('-created')[:limit]} + else: + # Return empty list if user has no permissions. + return {'targets': []} @register.inclusion_tag('tom_targets/partials/recently_updated_targets.html', takes_context=True)