• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

TOMToolkit / tom_base / 6713509976

31 Oct 2023 11:13PM UTC coverage: 86.773% (+0.7%) from 86.072%
6713509976

push

github-actions

web-flow
Merge pull request #699 from TOMToolkit/dev

Multi-Feature Merge. Please Review Carefully.

795 of 795 new or added lines in 39 files covered. (100.0%)

8253 of 9511 relevant lines covered (86.77%)

0.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.19
/tom_targets/filters.py
1
from django.conf import settings
1✔
2
from django.db.models import Q
1✔
3
import django_filters
1✔
4

5
from tom_targets.models import Target, TargetList, TargetMatchManager
1✔
6
from tom_targets.utils import cone_search_filter
1✔
7

8

9
def filter_for_field(field):
1✔
10
    if field['type'] == 'number':
1✔
11
        return django_filters.RangeFilter(field_name=field['name'], method=filter_number)
×
12
    elif field['type'] == 'boolean':
1✔
13
        return django_filters.BooleanFilter(field_name=field['name'], method=filter_boolean)
1✔
14
    elif field['type'] == 'datetime':
1✔
15
        return django_filters.DateTimeFromToRangeFilter(field_name=field['name'], method=filter_datetime)
1✔
16
    elif field['type'] == 'string':
1✔
17
        return django_filters.CharFilter(field_name=field['name'], method=filter_text)
1✔
18
    else:
19
        raise ValueError(
×
20
            'Invalid field type {}. Field type must be one of: number, boolean, datetime string'.format(field['type'])
21
        )
22

23

24
def filter_number(queryset, name, value):
1✔
25
    return queryset.filter(
×
26
        targetextra__key=name, targetextra__float_value__gte=value.start, targetextra__float_value__lte=value.stop
27
    )
28

29

30
def filter_datetime(queryset, name, value):
1✔
31
    return queryset.filter(
1✔
32
        targetextra__key=name, targetextra__time_value__gte=value.start, targetextra__time_value__lte=value.stop
33
    )
34

35

36
def filter_boolean(queryset, name, value):
1✔
37
    return queryset.filter(targetextra__key=name, targetextra__bool_value=value)
1✔
38

39

40
def filter_text(queryset, name, value):
1✔
41
    return queryset.filter(targetextra__key=name, targetextra__value__icontains=value)
1✔
42

43

44
class TargetFilter(django_filters.FilterSet):
1✔
45
    key = django_filters.CharFilter(field_name='targetextra__key', label='Key')
1✔
46
    value = django_filters.CharFilter(field_name='targetextra__value', label='Value')
1✔
47

48
    def __init__(self, *args, **kwargs):
1✔
49
        super().__init__(*args, **kwargs)
1✔
50
        for field in settings.EXTRA_FIELDS:
1✔
51
            new_filter = filter_for_field(field)
1✔
52
            new_filter.parent = self
1✔
53
            self.filters[field['name']] = new_filter
1✔
54

55
    name = django_filters.CharFilter(method='filter_name', label='Name')
1✔
56

57
    def filter_name(self, queryset, name, value):
1✔
58
        """
59
        Return a queryset for targets with names or aliases containing the given coma-separated list of terms.
60
        """
61
        q_set = Q()
1✔
62
        for term in value.split(','):
1✔
63
            q_set |= Q(name__icontains=term) | Q(aliases__name__icontains=term)
1✔
64
        return queryset.filter(q_set).distinct()
1✔
65

66
    name_fuzzy = django_filters.CharFilter(method='filter_name_fuzzy', label='Name (Fuzzy)')
1✔
67

68
    def filter_name_fuzzy(self, queryset, name, value):
1✔
69
        """
70
        Return a queryset for targets with names or aliases fuzzy matching the given coma-separated list of terms.
71
        A fuzzy match is determined by the `make_simple_name` method of the `TargetMatchManager` class.
72
        """
73
        matching_names = []
×
74
        for term in value.split(','):
×
75
            simple_name = TargetMatchManager.make_simple_name(self, term)
×
76
            for target in Target.objects.all().prefetch_related('aliases'):
×
77
                for alias in target.names:
×
78
                    if TargetMatchManager.make_simple_name(self, alias) == simple_name:
×
79
                        matching_names.append(target.name)
×
80
        return queryset.filter(name__in=matching_names).distinct()
×
81

82
    cone_search = django_filters.CharFilter(method='filter_cone_search', label='Cone Search',
1✔
83
                                            help_text='RA, Dec, Search Radius (degrees)')
84

85
    target_cone_search = django_filters.CharFilter(method='filter_cone_search', label='Cone Search (Target)',
1✔
86
                                                   help_text='Target Name, Search Radius (degrees)')
87

88
    def filter_cone_search(self, queryset, name, value):
1✔
89
        """
90
        Perform a cone search filter on this filter's queryset,
91
        using the cone search utlity method and either specified RA, DEC
92
        or the RA/DEC from the named target.
93
        """
94
        if name == 'cone_search':
1✔
95
            ra, dec, radius = value.split(',')
1✔
96
        elif name == 'target_cone_search':
1✔
97
            target_name, radius = value.split(',')
1✔
98
            targets = Target.objects.filter(
1✔
99
                Q(name__icontains=target_name) | Q(aliases__name__icontains=target_name)
100
            ).distinct()
101
            if len(targets) == 1:
1✔
102
                ra = targets[0].ra
1✔
103
                dec = targets[0].dec
1✔
104
            else:
105
                return queryset.filter(name=None)
×
106
        else:
107
            return queryset
×
108

109
        ra = float(ra)
1✔
110
        dec = float(dec)
1✔
111

112
        return cone_search_filter(queryset, ra, dec, radius)
1✔
113

114
    # hide target grouping list if user not logged in
115
    def get_target_list_queryset(request):
1✔
116
        if request.user.is_authenticated:
1✔
117
            return TargetList.objects.all()
1✔
118
        else:
119
            return TargetList.objects.none()
1✔
120

121
    targetlist__name = django_filters.ModelChoiceFilter(queryset=get_target_list_queryset, label="Target Grouping")
1✔
122

123
    order = django_filters.OrderingFilter(
1✔
124
        fields=['name', 'created', 'modified'],
125
        field_labels={
126
            'name': 'Name',
127
            'created': 'Creation Date',
128
            'modified': 'Last Update'
129
        }
130
    )
131

132
    class Meta:
1✔
133
        model = Target
1✔
134
        fields = ['type', 'name', 'key', 'value', 'cone_search', 'targetlist__name']
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc