Skip to content

feature: add filter_parameters #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 5 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,11 @@ class MyFilter(AnyLogicFilter):
]

def queryset(self, request, queryset):
if self.form.is_valid():
filter_params = {
p: self.form.cleaned_data.get(p)
for p in self.expected_parameters()
if self.form.cleaned_data.get(p) is not None
}
# some query, using subquery with 2+ parameters or anything else you need
return queryset.filter(...filter_params['field_name']...filter_params['other_field_name']...)
else:
if not self.form.is_valid():
return queryset
filter_params = self.filter_parameters()
# some query, using subquery with any parameters or anything else you need
return queryset.filter(...filter_params['field_name']...filter_params['other_field_name']...)
```
3. Add it to ```admin.py```:
```Python
Expand All @@ -60,4 +55,4 @@ class YourModelAdmin(admin.ModelAdmin):
## Contributing
Bug reports and/or pull requests are welcome :)
## License
[MIT License](LICENSE)
[MIT License](LICENSE)
24 changes: 15 additions & 9 deletions anylogicfilter/filter.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.contrib import admin
from django import forms
from django.contrib import admin
from django.core.exceptions import ValidationError


class AnyLogicFilter(admin.FieldListFilter):
Expand All @@ -20,6 +21,16 @@ def __init__(self, field, request, params, model, model_admin, field_path):
def expected_parameters(self):
return [field[0] for field in self.filter_fields]

def filter_parameters(self):
if not self.form.is_valid():
# Check form for being valid before call
raise ValidationError(self.form.errors)
return {
param: self.form.cleaned_data.get(param)
for param in self.expected_parameters()
if self.form.cleaned_data.get(param) is not None
}

def _prepare_form_class(self):
return type(str('AnyLogicFilter'), (forms.Form,), dict(self.filter_fields))

Expand All @@ -38,14 +49,9 @@ def queryset(self, request, queryset):
(Don't forget to set form_fields)!
This might help you:

if self.form.is_valid():
filter_params = {
p: self.form.cleaned_data.get(p)
for p in self.expected_parameters()
if self.form.cleaned_data.get(p) is not None
}
return queryset.filter(**filter_params)
else:
if not self.form.is_valid():
return queryset
filter_params = self.filter_parameters()
return queryset.filter(**filter_params)
"""
raise NotImplementedError('The "queryset" method is not implemented. Told ya!')
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def get_package_data(package):

setup(
name='django-admin-anylogicfilter',
version='0.1.3',
version='0.2.0',
install_requires=[],
author='Maxim Medentsev',
author_email='[email protected]',
Expand Down