django-searchkit 1.1__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 (106) 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/example/example/__init__.py +0 -0
  34. build/lib/build/lib/build/lib/example/example/admin.py +16 -0
  35. build/lib/build/lib/build/lib/example/example/asgi.py +16 -0
  36. build/lib/build/lib/build/lib/example/example/management/__init__.py +0 -0
  37. build/lib/build/lib/build/lib/example/example/management/commands/__init__.py +0 -0
  38. build/lib/build/lib/build/lib/example/example/management/commands/createtestdata.py +62 -0
  39. build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py +48 -0
  40. build/lib/build/lib/build/lib/example/example/migrations/__init__.py +0 -0
  41. build/lib/build/lib/build/lib/example/example/models.py +38 -0
  42. build/lib/build/lib/build/lib/example/example/settings.py +125 -0
  43. build/lib/build/lib/build/lib/example/example/urls.py +23 -0
  44. build/lib/build/lib/build/lib/example/example/wsgi.py +16 -0
  45. build/lib/build/lib/build/lib/searchkit/__init__.py +0 -0
  46. build/lib/build/lib/build/lib/searchkit/__version__.py +16 -0
  47. build/lib/build/lib/build/lib/searchkit/admin.py +44 -0
  48. build/lib/build/lib/build/lib/searchkit/apps.py +6 -0
  49. build/lib/build/lib/build/lib/searchkit/filters.py +36 -0
  50. build/lib/build/lib/build/lib/searchkit/forms/__init__.py +5 -0
  51. build/lib/build/lib/build/lib/searchkit/forms/fields.py +56 -0
  52. build/lib/build/lib/build/lib/searchkit/forms/search.py +61 -0
  53. build/lib/build/lib/build/lib/searchkit/forms/searchkit.py +177 -0
  54. build/lib/build/lib/build/lib/searchkit/forms/utils.py +154 -0
  55. build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py +30 -0
  56. build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py +18 -0
  57. build/lib/build/lib/build/lib/searchkit/migrations/__init__.py +0 -0
  58. build/lib/build/lib/build/lib/searchkit/models.py +21 -0
  59. build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py +0 -0
  60. build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py +20 -0
  61. build/lib/build/lib/build/lib/searchkit/tests.py +400 -0
  62. build/lib/build/lib/build/lib/searchkit/urls.py +7 -0
  63. build/lib/build/lib/build/lib/searchkit/utils.py +13 -0
  64. build/lib/build/lib/build/lib/searchkit/views.py +23 -0
  65. build/lib/build/lib/example/example/admin.py +1 -1
  66. build/lib/build/lib/searchkit/__version__.py +1 -1
  67. build/lib/build/lib/searchkit/admin.py +15 -1
  68. build/lib/build/lib/searchkit/filters.py +15 -6
  69. build/lib/build/lib/searchkit/forms/fields.py +5 -4
  70. build/lib/build/lib/searchkit/forms/search.py +0 -1
  71. build/lib/build/lib/searchkit/forms/searchkit.py +36 -13
  72. build/lib/build/lib/searchkit/forms/utils.py +50 -74
  73. build/lib/build/lib/searchkit/models.py +0 -6
  74. build/lib/build/lib/searchkit/tests.py +1 -3
  75. build/lib/build/lib/searchkit/utils.py +13 -0
  76. build/lib/build/lib/searchkit/views.py +3 -3
  77. build/lib/example/example/admin.py +1 -1
  78. build/lib/searchkit/__version__.py +1 -1
  79. build/lib/searchkit/admin.py +15 -1
  80. build/lib/searchkit/filters.py +15 -6
  81. build/lib/searchkit/forms/fields.py +5 -4
  82. build/lib/searchkit/forms/search.py +0 -1
  83. build/lib/searchkit/forms/searchkit.py +36 -13
  84. build/lib/searchkit/forms/utils.py +50 -74
  85. build/lib/searchkit/models.py +0 -6
  86. build/lib/searchkit/tests.py +1 -3
  87. build/lib/searchkit/utils.py +13 -0
  88. build/lib/searchkit/views.py +3 -3
  89. {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/METADATA +1 -1
  90. django_searchkit-1.3.dist-info/RECORD +166 -0
  91. searchkit/__version__.py +1 -1
  92. searchkit/admin.py +15 -1
  93. searchkit/filters.py +15 -6
  94. searchkit/forms/fields.py +5 -4
  95. searchkit/forms/search.py +0 -1
  96. searchkit/forms/searchkit.py +36 -13
  97. searchkit/forms/utils.py +50 -74
  98. searchkit/models.py +0 -6
  99. searchkit/tests.py +1 -3
  100. searchkit/utils.py +13 -0
  101. searchkit/views.py +3 -3
  102. django_searchkit-1.1.dist-info/RECORD +0 -99
  103. {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/WHEEL +0 -0
  104. {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/licenses/LICENCE +0 -0
  105. {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/top_level.txt +0 -0
  106. {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/zip-safe +0 -0
@@ -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))
searchkit/forms/utils.py CHANGED
@@ -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()
searchkit/models.py CHANGED
@@ -19,9 +19,3 @@ class Search(models.Model):
19
19
  for data in self.data:
20
20
  lookups[f'{data["field"]}__{data["operator"]}'] = data['value']
21
21
  return lookups
22
-
23
- def as_queryset(self):
24
- """
25
- Returns a filtered queryset for the model.
26
- """
27
- return self.contenttype.model_class().objects.filter(**self.as_lookups())
searchkit/tests.py CHANGED
@@ -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
 
@@ -263,8 +263,6 @@ class SearchkitSearchFormTestCase(TestCase):
263
263
  self.assertEqual(len(filter_rules), len(INITIAL_DATA))
264
264
  for data in INITIAL_DATA:
265
265
  self.assertIn(f"{data['field']}__{data['operator']}", filter_rules)
266
- queryset = form.instance.as_queryset()
267
- self.assertTrue(queryset.model == ModelA)
268
266
 
269
267
 
270
268
  class SearchkitModelFormTestCase(TestCase):
searchkit/utils.py ADDED
@@ -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
+ )
searchkit/views.py CHANGED
@@ -14,9 +14,9 @@ class SearchkitAjaxView(View):
14
14
  Reload the formset via ajax.
15
15
  """
16
16
  def get(self, request, **kwargs):
17
- contenttype_form = SearchkitModelForm(data=self.request.GET)
18
- if contenttype_form.is_valid():
19
- model = contenttype_form.cleaned_data['searchkit_model'].model_class()
17
+ model_form = SearchkitModelForm(data=self.request.GET)
18
+ if model_form.is_valid():
19
+ model = model_form.cleaned_data['searchkit_model'].model_class()
20
20
  formset = searchkit_formset_factory(model=model)(data=request.GET)
21
21
  return HttpResponse(formset.render())
22
22
  else:
@@ -1,99 +0,0 @@
1
- build/lib/build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- build/lib/build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
3
- build/lib/build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
4
- build/lib/build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
5
- build/lib/build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
6
- build/lib/build/lib/example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
7
- build/lib/build/lib/example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
8
- build/lib/build/lib/example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- build/lib/build/lib/example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- build/lib/build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
11
- build/lib/build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
12
- build/lib/build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- build/lib/build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- build/lib/build/lib/searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
15
- build/lib/build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
16
- build/lib/build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
17
- build/lib/build/lib/searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
18
- build/lib/build/lib/searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
19
- build/lib/build/lib/searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
20
- build/lib/build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
21
- build/lib/build/lib/searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
22
- build/lib/build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
23
- build/lib/build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
24
- build/lib/build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
25
- build/lib/build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
26
- build/lib/build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
27
- build/lib/build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
28
- build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
29
- build/lib/build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- build/lib/build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- build/lib/build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
32
- build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
34
- build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
35
- build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
36
- build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
37
- build/lib/example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
38
- build/lib/example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
39
- build/lib/example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- build/lib/example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
42
- build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
43
- build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- build/lib/searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
46
- build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
47
- build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
48
- build/lib/searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
49
- build/lib/searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
50
- build/lib/searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
51
- build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
52
- build/lib/searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
53
- build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
54
- build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
55
- build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
56
- build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
57
- build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
58
- build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
59
- build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
60
- build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
63
- django_searchkit-1.1.dist-info/licenses/LICENCE,sha256=oqmlRYPA5GHG2T1yp8fPFGQdOO-NnJPdGITeFiJYWLg,1521
64
- example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- example/example/admin.py,sha256=KDjYyHPEqNdv7Xe8yx0VuWdx-bDn7qKKHM5ZYhFwdU0,445
66
- example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
67
- example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
68
- example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
69
- example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
70
- example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
71
- example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
74
- example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
75
- example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
78
- searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
79
- searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
80
- searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
81
- searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
82
- searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
83
- searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
84
- searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
85
- searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
86
- searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
87
- searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
88
- searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
89
- searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
90
- searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
91
- searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
92
- searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
95
- django_searchkit-1.1.dist-info/METADATA,sha256=oFRweWx1Rxx8Nshj_rrsoGCbLkAk_JIGoBzFYjQT-ew,3325
96
- django_searchkit-1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- django_searchkit-1.1.dist-info/top_level.txt,sha256=-4gF42VIaG-ckn2rb2wFa7LhxIZymHBsYVedNOr_NIY,29
98
- django_searchkit-1.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
99
- django_searchkit-1.1.dist-info/RECORD,,