Opened 16 years ago
Closed 16 years ago
#8330 closed (duplicate)
Cannot add new filterspecs without modifining filterspecs.py
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | contrib.admin | Version: | dev |
Severity: | Keywords: | Filters | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Adding your own filter specs works easily by simply using this code within an applications admin.py
from django.contrib.admin.filterspecs import FilterSpec class MyFilterSpec(FilterSpec): ... FilterSpec.register(...)
However, since the last default FilterSpec is always evaluated as True, and new FilterSpec's never get tested. It doesn't seem right to require a library file be modified in order to add a a feature to an application (for example, django-tagging which is what I was messing with when I found this.)
Since I don't know exactly what channels I should be going through to submit this as a patch, I'll just put the solution I found here. It's easy to fix if you add the following the FilterSpec.
class FilterSpec(object): filter_specs = [] default = None #added ... def create(cls, f, request, params, model, model_admin): for test, factory in cls.filter_specs: if test(f): return factory(f, request, params, model, model_admin) ### added after this point if callable(default): return default(f, request, params, model, model_admin) create = classmethod(create) # new method def set_default(cls, factory): if callable(factory): cls.default = factory set_default = classmethod(set_default)
Then, just replace the last line (which registers AllValuesFilterSpec) with:
FilterSpec.set_default(AllValuesFilterSpec)
Attachments (1)
Change History (2)
by , 16 years ago
Attachment: | filterspecs.py added |
---|
comment:1 by , 16 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Closing as a dupe of #5833.
New version of filterspecs.py