mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge pull request #256 from ddddavidmartin/add_financial_year_filter
Add financial year documents filter
This commit is contained in:
		| @@ -167,6 +167,12 @@ PAPERLESS_PASSPHRASE="secret" | |||||||
| #PAPERLESS_TIME_ZONE=UTC | #PAPERLESS_TIME_ZONE=UTC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # If set, Paperless will show document filters per financial year. | ||||||
|  | # The dates must be in the format "mm-dd", for example "07-15" for July 15. | ||||||
|  | #PAPERLESS_FINANCIAL_YEAR_START="mm-dd" | ||||||
|  | #PAPERLESS_FINANCIAL_YEAR_END="mm-dd" | ||||||
|  |  | ||||||
|  |  | ||||||
| # The number of items on each page in the web UI.  This value must be a | # The number of items on each page in the web UI.  This value must be a | ||||||
| # positive integer, but if you don't define one in paperless.conf, a default of | # positive integer, but if you don't define one in paperless.conf, a default of | ||||||
| # 100 will be used. | # 100 will be used. | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | from datetime import datetime | ||||||
|  |  | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.contrib import admin | from django.contrib import admin | ||||||
| from django.contrib.auth.models import User, Group | from django.contrib.auth.models import User, Group | ||||||
| @@ -32,6 +34,71 @@ class MonthListFilter(admin.SimpleListFilter): | |||||||
|         return queryset.filter(created__year=year, created__month=month) |         return queryset.filter(created__year=year, created__month=month) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class FinancialYearFilter(admin.SimpleListFilter): | ||||||
|  |  | ||||||
|  |     title = "Financial Year" | ||||||
|  |     parameter_name = "fy" | ||||||
|  |     _fy_wraps = None | ||||||
|  |  | ||||||
|  |     def _fy_start(self, year): | ||||||
|  |         """Return date of the start of financial year for the given year.""" | ||||||
|  |         fy_start = "{}-{}".format(str(year), settings.FY_START) | ||||||
|  |         return datetime.strptime(fy_start, "%Y-%m-%d").date() | ||||||
|  |  | ||||||
|  |     def _fy_end(self, year): | ||||||
|  |         """Return date of the end of financial year for the given year.""" | ||||||
|  |         fy_end = "{}-{}".format(str(year), settings.FY_END) | ||||||
|  |         return datetime.strptime(fy_end, "%Y-%m-%d").date() | ||||||
|  |  | ||||||
|  |     def _fy_does_wrap(self): | ||||||
|  |         """Return whether the financial year spans across two years.""" | ||||||
|  |         if self._fy_wraps is None: | ||||||
|  |             start = "{}".format(settings.FY_START) | ||||||
|  |             start = datetime.strptime(start, "%m-%d").date() | ||||||
|  |             end = "{}".format(settings.FY_END) | ||||||
|  |             end = datetime.strptime(end, "%m-%d").date() | ||||||
|  |             self._fy_wraps = end < start | ||||||
|  |  | ||||||
|  |         return self._fy_wraps | ||||||
|  |  | ||||||
|  |     def _determine_fy(self, date): | ||||||
|  |         """Return a (query, display) financial year tuple of the given date.""" | ||||||
|  |         if self._fy_does_wrap(): | ||||||
|  |             fy_start = self._fy_start(date.year) | ||||||
|  |  | ||||||
|  |             if date.date() >= fy_start: | ||||||
|  |                 query = "{}-{}".format(date.year, date.year + 1) | ||||||
|  |             else: | ||||||
|  |                 query = "{}-{}".format(date.year - 1, date.year) | ||||||
|  |  | ||||||
|  |             # To keep it simple we use the same string for both | ||||||
|  |             # query parameter and the display. | ||||||
|  |             return (query, query) | ||||||
|  |  | ||||||
|  |         else: | ||||||
|  |             query = "{0}-{0}".format(date.year) | ||||||
|  |             display = "{}".format(date.year) | ||||||
|  |             return (query, display) | ||||||
|  |  | ||||||
|  |     def lookups(self, request, model_admin): | ||||||
|  |         if not settings.FY_START or not settings.FY_END: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |         r = [] | ||||||
|  |         for document in Document.objects.all(): | ||||||
|  |             r.append(self._determine_fy(document.created)) | ||||||
|  |  | ||||||
|  |         return sorted(set(r), key=lambda x: x[0], reverse=True) | ||||||
|  |  | ||||||
|  |     def queryset(self, request, queryset): | ||||||
|  |         if not self.value() or not settings.FY_START or not settings.FY_END: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |         start, end = self.value().split("-") | ||||||
|  |         return queryset.filter(created__gte=self._fy_start(start), | ||||||
|  |                                created__lte=self._fy_end(end)) | ||||||
|  |  | ||||||
|  |  | ||||||
| class CommonAdmin(admin.ModelAdmin): | class CommonAdmin(admin.ModelAdmin): | ||||||
|     list_per_page = settings.PAPERLESS_LIST_PER_PAGE |     list_per_page = settings.PAPERLESS_LIST_PER_PAGE | ||||||
|  |  | ||||||
| @@ -59,7 +126,9 @@ class DocumentAdmin(CommonAdmin): | |||||||
|  |  | ||||||
|     search_fields = ("correspondent__name", "title", "content") |     search_fields = ("correspondent__name", "title", "content") | ||||||
|     list_display = ("title", "created", "thumbnail", "correspondent", "tags_") |     list_display = ("title", "created", "thumbnail", "correspondent", "tags_") | ||||||
|     list_filter = ("tags", "correspondent", MonthListFilter) |     list_filter = ("tags", "correspondent", FinancialYearFilter, | ||||||
|  |                    MonthListFilter) | ||||||
|  |  | ||||||
|     ordering = ["-created", "correspondent"] |     ordering = ["-created", "correspondent"] | ||||||
|  |  | ||||||
|     def has_add_permission(self, request): |     def has_add_permission(self, request): | ||||||
|   | |||||||
| @@ -255,3 +255,6 @@ POST_CONSUME_SCRIPT = os.getenv("PAPERLESS_POST_CONSUME_SCRIPT") | |||||||
| # positive integer, but if you don't define one in paperless.conf, a default of | # positive integer, but if you don't define one in paperless.conf, a default of | ||||||
| # 100 will be used. | # 100 will be used. | ||||||
| PAPERLESS_LIST_PER_PAGE = int(os.getenv("PAPERLESS_LIST_PER_PAGE", 100)) | PAPERLESS_LIST_PER_PAGE = int(os.getenv("PAPERLESS_LIST_PER_PAGE", 100)) | ||||||
|  |  | ||||||
|  | FY_START = os.getenv("PAPERLESS_FINANCIAL_YEAR_START") | ||||||
|  | FY_END = os.getenv("PAPERLESS_FINANCIAL_YEAR_END") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Daniel Quinn
					Daniel Quinn