django-searchkit 1.2__py3-none-any.whl → 1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. build/lib/build/lib/build/lib/build/lib/example/example/__init__.py +0 -0
  2. build/lib/build/lib/build/lib/build/lib/example/example/admin.py +16 -0
  3. build/lib/build/lib/build/lib/build/lib/example/example/asgi.py +16 -0
  4. build/lib/build/lib/build/lib/build/lib/example/example/management/__init__.py +0 -0
  5. build/lib/build/lib/build/lib/build/lib/example/example/management/commands/__init__.py +0 -0
  6. build/lib/build/lib/build/lib/build/lib/example/example/management/commands/createtestdata.py +62 -0
  7. build/lib/build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py +48 -0
  8. build/lib/build/lib/build/lib/build/lib/example/example/migrations/__init__.py +0 -0
  9. build/lib/build/lib/build/lib/build/lib/example/example/models.py +38 -0
  10. build/lib/build/lib/build/lib/build/lib/example/example/settings.py +125 -0
  11. build/lib/build/lib/build/lib/build/lib/example/example/urls.py +23 -0
  12. build/lib/build/lib/build/lib/build/lib/example/example/wsgi.py +16 -0
  13. build/lib/build/lib/build/lib/build/lib/searchkit/__init__.py +0 -0
  14. build/lib/build/lib/build/lib/build/lib/searchkit/__version__.py +16 -0
  15. build/lib/build/lib/build/lib/build/lib/searchkit/admin.py +44 -0
  16. build/lib/build/lib/build/lib/build/lib/searchkit/apps.py +6 -0
  17. build/lib/build/lib/build/lib/build/lib/searchkit/filters.py +36 -0
  18. build/lib/build/lib/build/lib/build/lib/searchkit/forms/__init__.py +5 -0
  19. build/lib/build/lib/build/lib/build/lib/searchkit/forms/fields.py +56 -0
  20. build/lib/build/lib/build/lib/build/lib/searchkit/forms/search.py +61 -0
  21. build/lib/build/lib/build/lib/build/lib/searchkit/forms/searchkit.py +177 -0
  22. build/lib/build/lib/build/lib/build/lib/searchkit/forms/utils.py +154 -0
  23. build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py +30 -0
  24. build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py +18 -0
  25. build/lib/build/lib/build/lib/build/lib/searchkit/migrations/__init__.py +0 -0
  26. build/lib/build/lib/build/lib/build/lib/searchkit/models.py +21 -0
  27. build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py +0 -0
  28. build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py +20 -0
  29. build/lib/build/lib/build/lib/build/lib/searchkit/tests.py +400 -0
  30. build/lib/build/lib/build/lib/build/lib/searchkit/urls.py +7 -0
  31. build/lib/build/lib/build/lib/build/lib/searchkit/utils.py +13 -0
  32. build/lib/build/lib/build/lib/build/lib/searchkit/views.py +23 -0
  33. build/lib/build/lib/build/lib/searchkit/__version__.py +1 -1
  34. build/lib/build/lib/build/lib/searchkit/admin.py +15 -1
  35. build/lib/build/lib/build/lib/searchkit/filters.py +10 -2
  36. build/lib/build/lib/build/lib/searchkit/forms/fields.py +5 -4
  37. build/lib/build/lib/build/lib/searchkit/forms/search.py +0 -1
  38. build/lib/build/lib/build/lib/searchkit/forms/searchkit.py +36 -13
  39. build/lib/build/lib/build/lib/searchkit/forms/utils.py +50 -74
  40. build/lib/build/lib/build/lib/searchkit/tests.py +1 -1
  41. build/lib/build/lib/build/lib/searchkit/utils.py +13 -0
  42. build/lib/build/lib/example/example/admin.py +1 -1
  43. build/lib/build/lib/searchkit/__version__.py +1 -1
  44. build/lib/build/lib/searchkit/admin.py +15 -1
  45. build/lib/build/lib/searchkit/filters.py +10 -2
  46. build/lib/build/lib/searchkit/forms/fields.py +5 -4
  47. build/lib/build/lib/searchkit/forms/search.py +0 -1
  48. build/lib/build/lib/searchkit/forms/searchkit.py +36 -13
  49. build/lib/build/lib/searchkit/forms/utils.py +50 -74
  50. build/lib/build/lib/searchkit/tests.py +1 -1
  51. build/lib/build/lib/searchkit/utils.py +13 -0
  52. build/lib/searchkit/__version__.py +1 -1
  53. build/lib/searchkit/admin.py +15 -1
  54. build/lib/searchkit/filters.py +10 -2
  55. build/lib/searchkit/forms/fields.py +5 -4
  56. build/lib/searchkit/forms/search.py +0 -1
  57. build/lib/searchkit/forms/searchkit.py +36 -13
  58. build/lib/searchkit/forms/utils.py +50 -74
  59. build/lib/searchkit/tests.py +1 -1
  60. build/lib/searchkit/utils.py +13 -0
  61. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/METADATA +1 -1
  62. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/RECORD +75 -39
  63. searchkit/__version__.py +1 -1
  64. searchkit/admin.py +15 -1
  65. searchkit/filters.py +10 -2
  66. searchkit/forms/fields.py +5 -4
  67. searchkit/forms/search.py +0 -1
  68. searchkit/forms/searchkit.py +36 -13
  69. searchkit/forms/utils.py +50 -74
  70. searchkit/tests.py +1 -1
  71. searchkit/utils.py +13 -0
  72. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/WHEEL +0 -0
  73. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/licenses/LICENCE +0 -0
  74. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/top_level.txt +0 -0
  75. {django_searchkit-1.2.dist-info → django_searchkit-1.3.dist-info}/zip-safe +0 -0
@@ -1,15 +1,18 @@
1
1
  from django.contrib import admin
2
2
  from django.http import HttpResponseRedirect
3
3
  from django.urls import reverse
4
+ from django.utils.html import format_html
4
5
  from .models import Search
5
6
  from .forms import SearchForm
6
7
  from .filters import SearchkitFilter
8
+ from .filters import SearchableModelFilter
7
9
 
8
10
 
9
11
  @admin.register(Search)
10
12
  class SearchkitSearchAdmin(admin.ModelAdmin):
11
13
  form = SearchForm
12
- list_display = ('name', 'contenttype', 'created_date')
14
+ list_display = ('name', 'contenttype', 'created_date', 'apply_search_view')
15
+ list_filter = (('contenttype', SearchableModelFilter),)
13
16
 
14
17
  def get_url_for_applied_search(self, obj):
15
18
  app_label = obj.contenttype.app_label
@@ -28,3 +31,14 @@ class SearchkitSearchAdmin(admin.ModelAdmin):
28
31
  return HttpResponseRedirect(self.get_url_for_applied_search(obj))
29
32
  else:
30
33
  return super().response_change(request, obj, *args, **kwargs)
34
+
35
+ def apply_search_view(self, obj):
36
+ """
37
+ Returns a link to apply the search.
38
+ """
39
+ return format_html(
40
+ '<a href="{}" >Apply search "{}"</a>',
41
+ self.get_url_for_applied_search(obj),
42
+ obj.name
43
+ )
44
+ apply_search_view.short_description = 'Apply Search'
@@ -1,9 +1,10 @@
1
- from django.contrib.admin import SimpleListFilter
1
+ from django.contrib import admin
2
2
  from django.contrib.contenttypes.models import ContentType
3
3
  from .models import Search
4
+ from .utils import is_searchable_model
4
5
 
5
6
 
6
- class SearchkitFilter(SimpleListFilter):
7
+ class SearchkitFilter(admin.SimpleListFilter):
7
8
  title = 'Searchkit Filter'
8
9
  parameter_name = 'search'
9
10
  template = 'searchkit/searchkit_filter.html'
@@ -26,3 +27,10 @@ class SearchkitFilter(SimpleListFilter):
26
27
  if self.value():
27
28
  search = Search.objects.get(id=int(self.value()))
28
29
  return queryset.filter(**search.as_lookups())
30
+
31
+
32
+ class SearchableModelFilter(admin.filters.RelatedFieldListFilter):
33
+ def __init__(self, *args, **kwargs):
34
+ super().__init__(*args, **kwargs)
35
+ contenttypes = ContentType.objects.order_by('app_label', 'model')
36
+ self.lookup_choices = [(m.id, m) for m in contenttypes if is_searchable_model(m.model_class())]
@@ -1,4 +1,5 @@
1
1
  from django import forms
2
+ from django.contrib.admin import widgets
2
3
  from django.utils.translation import gettext_lazy as _
3
4
 
4
5
 
@@ -46,10 +47,10 @@ class IntegerRangeField(BaseRangeField):
46
47
  class DateRangeField(BaseRangeField):
47
48
  incomplete_message = _("Enter the first and the last date.")
48
49
  field_type = forms.DateField
49
- widget_type = forms.DateInput
50
+ widget_type = widgets.AdminDateWidget
50
51
 
51
52
 
52
- class DateTimeRangeField(BaseRangeField):
53
+ class DateTimeRangeField(DateRangeField):
53
54
  incomplete_message = _("Enter the first and the last datetime.")
54
- field_type = forms.DateTimeField
55
- widget_type = forms.DateTimeInput
55
+ field_type = forms.SplitDateTimeField
56
+ widget_type = widgets.AdminSplitDateTime
@@ -1,6 +1,5 @@
1
1
  from django import forms
2
2
  from django.utils.functional import cached_property
3
- from django.contrib.contenttypes.models import ContentType
4
3
  from ..models import Search
5
4
  from .searchkit import SearchkitModelForm
6
5
  from .searchkit import searchkit_formset_factory
@@ -1,19 +1,30 @@
1
1
  from django import forms
2
+ from django.apps import apps
3
+ from django.contrib.admin import widgets
4
+ from django.contrib.contenttypes.models import ContentType
2
5
  from django.utils.translation import gettext_lazy as _
3
6
  from django.utils.functional import cached_property
4
7
  from .utils import CssClassMixin, FIELD_PLAN, OPERATOR_DESCRIPTION
5
8
  from .utils import SUPPORTED_FIELDS
6
9
  from .utils import ModelTree
7
10
  from .utils import MediaMixin
8
- from .utils import get_searchable_models
11
+ from .fields import DateRangeField
12
+ from ..utils import is_searchable_model
9
13
 
10
14
 
11
15
  class SearchkitModelForm(forms.Form):
12
16
  """
13
17
  Form to select a content type.
14
18
  """
19
+ def __init__(self, *args, **kwargs):
20
+ super().__init__(*args, **kwargs)
21
+ models = [m for m in apps.get_models() if is_searchable_model(m)]
22
+ ids = [ContentType.objects.get_for_model(m).id for m in models]
23
+ queryset = self.fields['searchkit_model'].queryset.filter(pk__in=ids)
24
+ self.fields['searchkit_model'].queryset = queryset
25
+
15
26
  searchkit_model = forms.ModelChoiceField(
16
- queryset=get_searchable_models(),
27
+ queryset=ContentType.objects.all().order_by('app_label', 'model'),
17
28
  label=_('Model'),
18
29
  empty_label=_('Select a Model'),
19
30
  widget=forms.Select(attrs={
@@ -105,27 +116,19 @@ class BaseSearchkitForm(MediaMixin, CssClassMixin, forms.Form):
105
116
  return choices
106
117
 
107
118
  def _add_field_name_field(self):
108
- initial = self.initial.get('field')
109
119
  choices = self._get_model_field_choices()
110
- field = forms.ChoiceField(label=_('Model field'), choices=choices, initial=initial)
120
+ field = forms.ChoiceField(label=_('Model field'), choices=choices)
111
121
  field.widget.attrs.update({"class": self.reload_on_change_css_class})
112
122
  self.fields['field'] = field
113
123
 
114
124
  def _add_operator_field(self):
115
- initial = self.initial.get('operator')
116
125
  choices = [(o, OPERATOR_DESCRIPTION[o]) for o in self.field_plan.keys()]
117
- field = forms.ChoiceField(label=_('Operator'), choices=choices, initial=initial)
126
+ field = forms.ChoiceField(label=_('Operator'), choices=choices)
118
127
  field.widget.attrs.update({"class": self.reload_on_change_css_class})
119
128
  self.fields['operator'] = field
120
129
 
121
130
  def _add_value_field(self):
122
- initial = self.initial.get('value')
123
- field_class = self.field_plan[self.operator][0]
124
- if getattr(field_class, 'choices', None) and getattr(self.model_field, 'choices', None):
125
- field = field_class(choices=self.model_field.choices, initial=initial)
126
- else:
127
- field = field_class()
128
- self.fields['value'] = field
131
+ self.fields['value'] = self.field_plan[self.operator](self.model_field)
129
132
 
130
133
 
131
134
  class BaseSearchkitFormSet(CssClassMixin, forms.BaseFormSet):
@@ -143,6 +146,26 @@ class BaseSearchkitFormSet(CssClassMixin, forms.BaseFormSet):
143
146
  def get_default_prefix(self):
144
147
  return "searchkit"
145
148
 
149
+ @cached_property
150
+ def uses_date_widget(self):
151
+ """
152
+ Check if the form uses a date widget.
153
+ """
154
+ for form in self.forms:
155
+ for field in form.fields.values():
156
+ if isinstance(field.widget, (widgets.AdminDateWidget, widgets.AdminSplitDateTime)):
157
+ return True
158
+ elif isinstance(field, DateRangeField):
159
+ return True
160
+ return False
161
+
162
+ @cached_property
163
+ def forms(self):
164
+ if self.model:
165
+ return super().forms
166
+ else:
167
+ return []
168
+
146
169
 
147
170
  def searchkit_formset_factory(model, **kwargs):
148
171
  form = type('SearchkitForm', (BaseSearchkitForm,), dict(model=model))
@@ -1,13 +1,9 @@
1
1
  from modeltree import ModelTree as BaseModelTree
2
2
  from collections import OrderedDict
3
- from django.apps import apps
4
- from django.contrib import admin
5
- from django.contrib.contenttypes.models import ContentType
3
+ from django.contrib.admin.widgets import AdminDateWidget, AdminSplitDateTime
6
4
  from django.db import models
7
- from django.db.utils import OperationalError
8
5
  from django import forms
9
6
  from django.utils.translation import gettext_lazy as _
10
- from ..filters import SearchkitFilter
11
7
  from . import fields as searchkit_fields
12
8
 
13
9
 
@@ -50,94 +46,95 @@ FIELD_PLAN = OrderedDict((
50
46
  (
51
47
  lambda f: isinstance(f, models.BooleanField),
52
48
  {
53
- 'exact': (forms.NullBooleanField,),
49
+ 'exact': lambda f: forms.NullBooleanField() if f.null else forms.BooleanField(),
54
50
  }
55
51
  ),
56
52
  (
57
53
  lambda f: isinstance(f, models.CharField) and f.choices,
58
54
  {
59
- 'exact': (forms.ChoiceField,),
60
- 'contains': (forms.CharField,),
61
- 'startswith': (forms.CharField,),
62
- 'endswith': (forms.CharField,),
63
- 'regex': (forms.CharField,),
64
- 'in': (forms.MultipleChoiceField,),
55
+ 'exact': lambda f: forms.ChoiceField(choices=f.choices),
56
+ 'contains': lambda f: forms.CharField(),
57
+ 'startswith': lambda f: forms.CharField(),
58
+ 'endswith': lambda f: forms.CharField(),
59
+ 'regex': lambda f: forms.CharField(),
60
+ 'in': lambda f: forms.MultipleChoiceField(choices=f.choices),
65
61
  }
66
62
  ),
67
63
  (
68
64
  lambda f: isinstance(f, models.CharField),
69
65
  {
70
- 'exact': (forms.CharField,),
71
- 'contains': (forms.CharField,),
72
- 'startswith': (forms.CharField,),
73
- 'endswith': (forms.CharField,),
74
- 'regex': (forms.CharField,),
66
+ 'exact': lambda f: forms.CharField(),
67
+ 'contains': lambda f: forms.CharField(),
68
+ 'startswith': lambda f: forms.CharField(),
69
+ 'endswith': lambda f: forms.CharField(),
70
+ 'regex': lambda f: forms.CharField(),
75
71
  }
76
72
  ),
77
73
  (
78
74
  lambda f: isinstance(f, models.IntegerField) and f.choices,
79
75
  {
80
- 'exact': (forms.ChoiceField,),
81
- 'contains': (forms.IntegerField,),
82
- 'startswith': (forms.IntegerField,),
83
- 'endswith': (forms.IntegerField,),
84
- 'regex': (forms.IntegerField,),
85
- 'in': (forms.MultipleChoiceField,),
76
+ 'exact': lambda f: forms.ChoiceField(choices=f.choices),
77
+ 'gt': lambda f: forms.IntegerField(),
78
+ 'gte': lambda f: forms.IntegerField(),
79
+ 'lt': lambda f: forms.IntegerField(),
80
+ 'lte': lambda f: forms.IntegerField(),
81
+ 'range': lambda f: searchkit_fields.IntegerRangeField(),
82
+ 'in': lambda f: forms.MultipleChoiceField(choices=f.choices),
86
83
  }
87
84
  ),
88
85
  (
89
86
  lambda f: isinstance(f, models.IntegerField),
90
87
  {
91
- 'exact': (forms.IntegerField,),
92
- 'gt': (forms.IntegerField,),
93
- 'gte': (forms.IntegerField,),
94
- 'lt': (forms.IntegerField,),
95
- 'lte': (forms.IntegerField,),
96
- 'range': (searchkit_fields.IntegerRangeField,),
88
+ 'exact': lambda f: forms.IntegerField(),
89
+ 'gt': lambda f: forms.IntegerField(),
90
+ 'gte': lambda f: forms.IntegerField(),
91
+ 'lt': lambda f: forms.IntegerField(),
92
+ 'lte': lambda f: forms.IntegerField(),
93
+ 'range': lambda f: searchkit_fields.IntegerRangeField(),
97
94
  }
98
95
  ),
99
96
  (
100
97
  lambda f: isinstance(f, models.FloatField),
101
98
  {
102
- 'exact': (forms.FloatField,),
103
- 'gt': (forms.FloatField,),
104
- 'gte': (forms.FloatField,),
105
- 'lt': (forms.FloatField,),
106
- 'lte': (forms.FloatField,),
107
- 'range': (searchkit_fields.IntegerRangeField,),
99
+ 'exact': lambda f: forms.FloatField(),
100
+ 'gt': lambda f: forms.FloatField(),
101
+ 'gte': lambda f: forms.FloatField(),
102
+ 'lt': lambda f: forms.FloatField(),
103
+ 'lte': lambda f: forms.FloatField(),
104
+ 'range': lambda f: searchkit_fields.IntegerRangeField(),
108
105
  }
109
106
  ),
110
107
  (
111
108
  lambda f: isinstance(f, models.DecimalField),
112
109
  {
113
- 'exact': (forms.DecimalField,),
114
- 'gt': (forms.DecimalField,),
115
- 'gte': (forms.DecimalField,),
116
- 'lt': (forms.DecimalField,),
117
- 'lte': (forms.DecimalField,),
118
- 'range': (searchkit_fields.IntegerRangeField,),
110
+ 'exact': lambda f: forms.DecimalField(),
111
+ 'gt': lambda f: forms.DecimalField(),
112
+ 'gte': lambda f: forms.DecimalField(),
113
+ 'lt': lambda f: forms.DecimalField(),
114
+ 'lte': lambda f: forms.DecimalField(),
115
+ 'range': lambda f: searchkit_fields.IntegerRangeField(),
119
116
  }
120
117
  ),
121
118
  (
122
119
  lambda f: isinstance(f, models.DateTimeField),
123
120
  {
124
- 'exact': (forms.DateTimeField,),
125
- 'gt': (forms.DateTimeField,),
126
- 'gte': (forms.DateTimeField,),
127
- 'lt': (forms.DateTimeField,),
128
- 'lte': (forms.DateTimeField,),
129
- 'range': (searchkit_fields.DateTimeRangeField,),
121
+ 'exact': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
122
+ 'gt': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
123
+ 'gte': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
124
+ 'lt': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
125
+ 'lte': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
126
+ 'range': lambda f: searchkit_fields.DateTimeRangeField(),
130
127
  }
131
128
  ),
132
129
  (
133
130
  lambda f: isinstance(f, models.DateField),
134
131
  {
135
- 'exact': (forms.DateField,),
136
- 'gt': (forms.DateField,),
137
- 'gte': (forms.DateField,),
138
- 'lt': (forms.DateField,),
139
- 'lte': (forms.DateField,),
140
- 'range': (searchkit_fields.DateRangeField,),
132
+ 'exact': lambda f: forms.DateField(widget=AdminDateWidget()),
133
+ 'gt': lambda f: forms.DateField(widget=AdminDateWidget()),
134
+ 'gte': lambda f: forms.DateField(widget=AdminDateWidget()),
135
+ 'lt': lambda f: forms.DateField(widget=AdminDateWidget()),
136
+ 'lte': lambda f: forms.DateField(widget=AdminDateWidget()),
137
+ 'range': lambda f: searchkit_fields.DateRangeField(),
141
138
  }
142
139
  ),
143
140
  ))
@@ -155,24 +152,3 @@ class MediaMixin:
155
152
  'admin/js/jquery.init.js',
156
153
  "searchkit/searchkit.js"
157
154
  ]
158
-
159
-
160
- def is_searchable_model(model):
161
- """
162
- Check if the model is searchable by Searchkit.
163
- """
164
- return admin.site.is_registered(model) and SearchkitFilter in admin.site._registry[model].list_filter
165
-
166
-
167
- def get_searchable_models():
168
- """
169
- Return a queryset of searchable models.
170
- """
171
- # Before mirating the database we get an OperationalError when trying to
172
- # access ContentType database table.
173
- try:
174
- models = [m for m in apps.get_models() if is_searchable_model(m)]
175
- ids = [ContentType.objects.get_for_model(m).id for m in models]
176
- return ContentType.objects.filter(pk__in=ids).order_by('app_label', 'model')
177
- except OperationalError:
178
- return ContentType.objects.all()
@@ -49,7 +49,7 @@ INITIAL_DATA = [
49
49
  dict(
50
50
  field='datetime',
51
51
  operator='exact',
52
- value='2025-05-14 08:45',
52
+ value=['2025-05-14', '08:45'],
53
53
  )
54
54
  ]
55
55
 
@@ -0,0 +1,13 @@
1
+ from django.contrib import admin
2
+
3
+
4
+ def is_searchable_model(model):
5
+ """
6
+ Check if the model is searchable by Searchkit.
7
+ """
8
+ # We do not import SearchkitFilter to avoid circular imports. So we check
9
+ # the filter by its name.
10
+ return (
11
+ admin.site.is_registered(model)
12
+ and 'SearchkitFilter' in [getattr(f, '__name__', '') for f in admin.site._registry[model].list_filter]
13
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-searchkit
3
- Version: 1.2
3
+ Version: 1.3
4
4
  Summary: Finally a real searchkit for django!
5
5
  Home-page: https://github.com/thomst/django-searchkit
6
6
  Author: Thomas Leichtfuß
@@ -1,3 +1,35 @@
1
+ build/lib/build/lib/build/lib/build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ build/lib/build/lib/build/lib/build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
3
+ build/lib/build/lib/build/lib/build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
4
+ build/lib/build/lib/build/lib/build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
5
+ build/lib/build/lib/build/lib/build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
6
+ build/lib/build/lib/build/lib/build/lib/example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
7
+ build/lib/build/lib/build/lib/build/lib/example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
8
+ build/lib/build/lib/build/lib/build/lib/example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ build/lib/build/lib/build/lib/build/lib/example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ build/lib/build/lib/build/lib/build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
11
+ build/lib/build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
12
+ build/lib/build/lib/build/lib/build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ build/lib/build/lib/build/lib/build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ build/lib/build/lib/build/lib/build/lib/searchkit/__version__.py,sha256=gR3PFKf352QJTKmvgE6eB0I5fdfM4mnk6oQ0ogK2fQs,661
15
+ build/lib/build/lib/build/lib/build/lib/searchkit/admin.py,sha256=0q31L44qoUiB-ZK1JuL3JPWJx7EGbF0DP3GXq0h3Qqc,1671
16
+ build/lib/build/lib/build/lib/build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
17
+ build/lib/build/lib/build/lib/build/lib/searchkit/filters.py,sha256=lkiJaCxEFGDYYgK1sRg4BMtShBdCIJ5LsatikLJ9Fds,1456
18
+ build/lib/build/lib/build/lib/build/lib/searchkit/models.py,sha256=0LEe0z3jOTqAGrqNGknDDY1L1anaG3kCcQ_Zm_7dl9I,800
19
+ build/lib/build/lib/build/lib/build/lib/searchkit/tests.py,sha256=gzl8T_kENyLY4IHFH75SoIynre-8ml7XMCOFkhIJ23s,14854
20
+ build/lib/build/lib/build/lib/build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
21
+ build/lib/build/lib/build/lib/build/lib/searchkit/utils.py,sha256=UYhddwdLz1sOj-svDk_yTQnIofCdwUvjKVoKBKDtieo,411
22
+ build/lib/build/lib/build/lib/build/lib/searchkit/views.py,sha256=ECSwsge2pD0OJLHdHwpOdWS7XiItUX2NFCO8FSjBigE,919
23
+ build/lib/build/lib/build/lib/build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
24
+ build/lib/build/lib/build/lib/build/lib/searchkit/forms/fields.py,sha256=gXQTlB1Gt0mMAtOwregIdRHxY_QoRxX_Envbev1ZUkI,1682
25
+ build/lib/build/lib/build/lib/build/lib/searchkit/forms/search.py,sha256=9YsSE4LDdvFXDApa02lJse5ryuX1Bn6O93VooXWzSDY,2271
26
+ build/lib/build/lib/build/lib/build/lib/searchkit/forms/searchkit.py,sha256=T6qf6f16SNtxEX8Ln-cgKLcbsgosUKSiSH1lmwgyMAQ,6754
27
+ build/lib/build/lib/build/lib/build/lib/searchkit/forms/utils.py,sha256=u5Z9QjuqadGybFF-vGs1yHCEQ5D9j_gRnFSoQH-D8DI,5232
28
+ build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
29
+ build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
30
+ build/lib/build/lib/build/lib/build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
1
33
  build/lib/build/lib/build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
34
  build/lib/build/lib/build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
3
35
  build/lib/build/lib/build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
@@ -11,26 +43,27 @@ build/lib/build/lib/build/lib/example/example/management/commands/createtestdata
11
43
  build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
12
44
  build/lib/build/lib/build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
45
  build/lib/build/lib/build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- build/lib/build/lib/build/lib/searchkit/__version__.py,sha256=g6zhPyD9UelvcYrhtmQjIk-7_RH9Bu2W8YLlyW3M5OM,661
15
- build/lib/build/lib/build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
46
+ build/lib/build/lib/build/lib/searchkit/__version__.py,sha256=gR3PFKf352QJTKmvgE6eB0I5fdfM4mnk6oQ0ogK2fQs,661
47
+ build/lib/build/lib/build/lib/searchkit/admin.py,sha256=0q31L44qoUiB-ZK1JuL3JPWJx7EGbF0DP3GXq0h3Qqc,1671
16
48
  build/lib/build/lib/build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
17
- build/lib/build/lib/build/lib/searchkit/filters.py,sha256=l8756ftyURUpK3KSkl__TDP5KpqaapxjYMaAjh729ps,1098
49
+ build/lib/build/lib/build/lib/searchkit/filters.py,sha256=lkiJaCxEFGDYYgK1sRg4BMtShBdCIJ5LsatikLJ9Fds,1456
18
50
  build/lib/build/lib/build/lib/searchkit/models.py,sha256=0LEe0z3jOTqAGrqNGknDDY1L1anaG3kCcQ_Zm_7dl9I,800
19
- build/lib/build/lib/build/lib/searchkit/tests.py,sha256=qm8rvKC8aDnaspIXwzCsDwMkfXMR4uOHzqDLWhdv2dA,14849
51
+ build/lib/build/lib/build/lib/searchkit/tests.py,sha256=gzl8T_kENyLY4IHFH75SoIynre-8ml7XMCOFkhIJ23s,14854
20
52
  build/lib/build/lib/build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
53
+ build/lib/build/lib/build/lib/searchkit/utils.py,sha256=UYhddwdLz1sOj-svDk_yTQnIofCdwUvjKVoKBKDtieo,411
21
54
  build/lib/build/lib/build/lib/searchkit/views.py,sha256=ECSwsge2pD0OJLHdHwpOdWS7XiItUX2NFCO8FSjBigE,919
22
55
  build/lib/build/lib/build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
23
- build/lib/build/lib/build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
24
- build/lib/build/lib/build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
25
- build/lib/build/lib/build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
26
- build/lib/build/lib/build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
56
+ build/lib/build/lib/build/lib/searchkit/forms/fields.py,sha256=gXQTlB1Gt0mMAtOwregIdRHxY_QoRxX_Envbev1ZUkI,1682
57
+ build/lib/build/lib/build/lib/searchkit/forms/search.py,sha256=9YsSE4LDdvFXDApa02lJse5ryuX1Bn6O93VooXWzSDY,2271
58
+ build/lib/build/lib/build/lib/searchkit/forms/searchkit.py,sha256=T6qf6f16SNtxEX8Ln-cgKLcbsgosUKSiSH1lmwgyMAQ,6754
59
+ build/lib/build/lib/build/lib/searchkit/forms/utils.py,sha256=u5Z9QjuqadGybFF-vGs1yHCEQ5D9j_gRnFSoQH-D8DI,5232
27
60
  build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
28
61
  build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
29
62
  build/lib/build/lib/build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
63
  build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
64
  build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
32
65
  build/lib/build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- build/lib/build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
66
+ build/lib/build/lib/example/example/admin.py,sha256=KDjYyHPEqNdv7Xe8yx0VuWdx-bDn7qKKHM5ZYhFwdU0,445
34
67
  build/lib/build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
35
68
  build/lib/build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
36
69
  build/lib/build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
@@ -42,19 +75,20 @@ build/lib/build/lib/example/example/management/commands/createtestdata.py,sha256
42
75
  build/lib/build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
43
76
  build/lib/build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
77
  build/lib/build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- build/lib/build/lib/searchkit/__version__.py,sha256=g6zhPyD9UelvcYrhtmQjIk-7_RH9Bu2W8YLlyW3M5OM,661
46
- build/lib/build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
78
+ build/lib/build/lib/searchkit/__version__.py,sha256=gR3PFKf352QJTKmvgE6eB0I5fdfM4mnk6oQ0ogK2fQs,661
79
+ build/lib/build/lib/searchkit/admin.py,sha256=0q31L44qoUiB-ZK1JuL3JPWJx7EGbF0DP3GXq0h3Qqc,1671
47
80
  build/lib/build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
48
- build/lib/build/lib/searchkit/filters.py,sha256=l8756ftyURUpK3KSkl__TDP5KpqaapxjYMaAjh729ps,1098
81
+ build/lib/build/lib/searchkit/filters.py,sha256=lkiJaCxEFGDYYgK1sRg4BMtShBdCIJ5LsatikLJ9Fds,1456
49
82
  build/lib/build/lib/searchkit/models.py,sha256=0LEe0z3jOTqAGrqNGknDDY1L1anaG3kCcQ_Zm_7dl9I,800
50
- build/lib/build/lib/searchkit/tests.py,sha256=qm8rvKC8aDnaspIXwzCsDwMkfXMR4uOHzqDLWhdv2dA,14849
83
+ build/lib/build/lib/searchkit/tests.py,sha256=gzl8T_kENyLY4IHFH75SoIynre-8ml7XMCOFkhIJ23s,14854
51
84
  build/lib/build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
85
+ build/lib/build/lib/searchkit/utils.py,sha256=UYhddwdLz1sOj-svDk_yTQnIofCdwUvjKVoKBKDtieo,411
52
86
  build/lib/build/lib/searchkit/views.py,sha256=ECSwsge2pD0OJLHdHwpOdWS7XiItUX2NFCO8FSjBigE,919
53
87
  build/lib/build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
54
- build/lib/build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
55
- build/lib/build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
56
- build/lib/build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
57
- build/lib/build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
88
+ build/lib/build/lib/searchkit/forms/fields.py,sha256=gXQTlB1Gt0mMAtOwregIdRHxY_QoRxX_Envbev1ZUkI,1682
89
+ build/lib/build/lib/searchkit/forms/search.py,sha256=9YsSE4LDdvFXDApa02lJse5ryuX1Bn6O93VooXWzSDY,2271
90
+ build/lib/build/lib/searchkit/forms/searchkit.py,sha256=T6qf6f16SNtxEX8Ln-cgKLcbsgosUKSiSH1lmwgyMAQ,6754
91
+ build/lib/build/lib/searchkit/forms/utils.py,sha256=u5Z9QjuqadGybFF-vGs1yHCEQ5D9j_gRnFSoQH-D8DI,5232
58
92
  build/lib/build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
59
93
  build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
60
94
  build/lib/build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -73,25 +107,26 @@ build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak1
73
107
  build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
74
108
  build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
109
  build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- build/lib/searchkit/__version__.py,sha256=g6zhPyD9UelvcYrhtmQjIk-7_RH9Bu2W8YLlyW3M5OM,661
77
- build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
110
+ build/lib/searchkit/__version__.py,sha256=gR3PFKf352QJTKmvgE6eB0I5fdfM4mnk6oQ0ogK2fQs,661
111
+ build/lib/searchkit/admin.py,sha256=0q31L44qoUiB-ZK1JuL3JPWJx7EGbF0DP3GXq0h3Qqc,1671
78
112
  build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
79
- build/lib/searchkit/filters.py,sha256=l8756ftyURUpK3KSkl__TDP5KpqaapxjYMaAjh729ps,1098
113
+ build/lib/searchkit/filters.py,sha256=lkiJaCxEFGDYYgK1sRg4BMtShBdCIJ5LsatikLJ9Fds,1456
80
114
  build/lib/searchkit/models.py,sha256=0LEe0z3jOTqAGrqNGknDDY1L1anaG3kCcQ_Zm_7dl9I,800
81
- build/lib/searchkit/tests.py,sha256=qm8rvKC8aDnaspIXwzCsDwMkfXMR4uOHzqDLWhdv2dA,14849
115
+ build/lib/searchkit/tests.py,sha256=gzl8T_kENyLY4IHFH75SoIynre-8ml7XMCOFkhIJ23s,14854
82
116
  build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
117
+ build/lib/searchkit/utils.py,sha256=UYhddwdLz1sOj-svDk_yTQnIofCdwUvjKVoKBKDtieo,411
83
118
  build/lib/searchkit/views.py,sha256=ECSwsge2pD0OJLHdHwpOdWS7XiItUX2NFCO8FSjBigE,919
84
119
  build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
85
- build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
86
- build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
87
- build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
88
- build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
120
+ build/lib/searchkit/forms/fields.py,sha256=gXQTlB1Gt0mMAtOwregIdRHxY_QoRxX_Envbev1ZUkI,1682
121
+ build/lib/searchkit/forms/search.py,sha256=9YsSE4LDdvFXDApa02lJse5ryuX1Bn6O93VooXWzSDY,2271
122
+ build/lib/searchkit/forms/searchkit.py,sha256=T6qf6f16SNtxEX8Ln-cgKLcbsgosUKSiSH1lmwgyMAQ,6754
123
+ build/lib/searchkit/forms/utils.py,sha256=u5Z9QjuqadGybFF-vGs1yHCEQ5D9j_gRnFSoQH-D8DI,5232
89
124
  build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
90
125
  build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
91
126
  build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
127
  build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
128
  build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
94
- django_searchkit-1.2.dist-info/licenses/LICENCE,sha256=oqmlRYPA5GHG2T1yp8fPFGQdOO-NnJPdGITeFiJYWLg,1521
129
+ django_searchkit-1.3.dist-info/licenses/LICENCE,sha256=oqmlRYPA5GHG2T1yp8fPFGQdOO-NnJPdGITeFiJYWLg,1521
95
130
  example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
131
  example/example/admin.py,sha256=KDjYyHPEqNdv7Xe8yx0VuWdx-bDn7qKKHM5ZYhFwdU0,445
97
132
  example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
@@ -105,26 +140,27 @@ example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_
105
140
  example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
106
141
  example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
142
  searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- searchkit/__version__.py,sha256=g6zhPyD9UelvcYrhtmQjIk-7_RH9Bu2W8YLlyW3M5OM,661
109
- searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
143
+ searchkit/__version__.py,sha256=gR3PFKf352QJTKmvgE6eB0I5fdfM4mnk6oQ0ogK2fQs,661
144
+ searchkit/admin.py,sha256=0q31L44qoUiB-ZK1JuL3JPWJx7EGbF0DP3GXq0h3Qqc,1671
110
145
  searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
111
- searchkit/filters.py,sha256=l8756ftyURUpK3KSkl__TDP5KpqaapxjYMaAjh729ps,1098
146
+ searchkit/filters.py,sha256=lkiJaCxEFGDYYgK1sRg4BMtShBdCIJ5LsatikLJ9Fds,1456
112
147
  searchkit/models.py,sha256=0LEe0z3jOTqAGrqNGknDDY1L1anaG3kCcQ_Zm_7dl9I,800
113
- searchkit/tests.py,sha256=qm8rvKC8aDnaspIXwzCsDwMkfXMR4uOHzqDLWhdv2dA,14849
148
+ searchkit/tests.py,sha256=gzl8T_kENyLY4IHFH75SoIynre-8ml7XMCOFkhIJ23s,14854
114
149
  searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
150
+ searchkit/utils.py,sha256=UYhddwdLz1sOj-svDk_yTQnIofCdwUvjKVoKBKDtieo,411
115
151
  searchkit/views.py,sha256=ECSwsge2pD0OJLHdHwpOdWS7XiItUX2NFCO8FSjBigE,919
116
152
  searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
117
- searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
118
- searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
119
- searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
120
- searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
153
+ searchkit/forms/fields.py,sha256=gXQTlB1Gt0mMAtOwregIdRHxY_QoRxX_Envbev1ZUkI,1682
154
+ searchkit/forms/search.py,sha256=9YsSE4LDdvFXDApa02lJse5ryuX1Bn6O93VooXWzSDY,2271
155
+ searchkit/forms/searchkit.py,sha256=T6qf6f16SNtxEX8Ln-cgKLcbsgosUKSiSH1lmwgyMAQ,6754
156
+ searchkit/forms/utils.py,sha256=u5Z9QjuqadGybFF-vGs1yHCEQ5D9j_gRnFSoQH-D8DI,5232
121
157
  searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
122
158
  searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
123
159
  searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
160
  searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
161
  searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
126
- django_searchkit-1.2.dist-info/METADATA,sha256=uKoqf1iEWc63SpPhb3cRFIvfY9_J3ziOoPgazA8Dn_w,3325
127
- django_searchkit-1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
128
- django_searchkit-1.2.dist-info/top_level.txt,sha256=-4gF42VIaG-ckn2rb2wFa7LhxIZymHBsYVedNOr_NIY,29
129
- django_searchkit-1.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
130
- django_searchkit-1.2.dist-info/RECORD,,
162
+ django_searchkit-1.3.dist-info/METADATA,sha256=yi3p_QFsJU_UlkQ5uvqdegoVDDTl5sPd5x0mHHMaazE,3325
163
+ django_searchkit-1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
164
+ django_searchkit-1.3.dist-info/top_level.txt,sha256=-4gF42VIaG-ckn2rb2wFa7LhxIZymHBsYVedNOr_NIY,29
165
+ django_searchkit-1.3.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
166
+ django_searchkit-1.3.dist-info/RECORD,,
searchkit/__version__.py CHANGED
@@ -13,4 +13,4 @@ Version 0.x should be considered a development version with an unstable API,
13
13
  and backwards compatibility is not guaranteed for minor versions.
14
14
  """
15
15
 
16
- __version__ = "1.2"
16
+ __version__ = "1.3"
searchkit/admin.py CHANGED
@@ -1,15 +1,18 @@
1
1
  from django.contrib import admin
2
2
  from django.http import HttpResponseRedirect
3
3
  from django.urls import reverse
4
+ from django.utils.html import format_html
4
5
  from .models import Search
5
6
  from .forms import SearchForm
6
7
  from .filters import SearchkitFilter
8
+ from .filters import SearchableModelFilter
7
9
 
8
10
 
9
11
  @admin.register(Search)
10
12
  class SearchkitSearchAdmin(admin.ModelAdmin):
11
13
  form = SearchForm
12
- list_display = ('name', 'contenttype', 'created_date')
14
+ list_display = ('name', 'contenttype', 'created_date', 'apply_search_view')
15
+ list_filter = (('contenttype', SearchableModelFilter),)
13
16
 
14
17
  def get_url_for_applied_search(self, obj):
15
18
  app_label = obj.contenttype.app_label
@@ -28,3 +31,14 @@ class SearchkitSearchAdmin(admin.ModelAdmin):
28
31
  return HttpResponseRedirect(self.get_url_for_applied_search(obj))
29
32
  else:
30
33
  return super().response_change(request, obj, *args, **kwargs)
34
+
35
+ def apply_search_view(self, obj):
36
+ """
37
+ Returns a link to apply the search.
38
+ """
39
+ return format_html(
40
+ '<a href="{}" >Apply search "{}"</a>',
41
+ self.get_url_for_applied_search(obj),
42
+ obj.name
43
+ )
44
+ apply_search_view.short_description = 'Apply Search'