mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 19:17:13 -05:00 
			
		
		
		
	Merge pull request #256 from ddddavidmartin/add_financial_year_filter
Add financial year documents filter
This commit is contained in:
		
						commit
						09e1b505e1
					
				@ -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")
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user