diff --git a/README.md b/README.md index 72ff563..8ff6037 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Count visits in your view like this: ```python def view_blog_post(request, post_id): post = get_object_or_404(MyBlogPost, pk=post_id) - post.update_visit_count() + post.count_visit() ... ``` @@ -59,6 +59,17 @@ def view_blog_post(request, post_id): ... ``` +You can pass an optional keyword argument `session_duration` (integer, number of seconds) +to `count_visit` or `is_new_visit`. + +## Settings + +Default settings: + +```python +VISIT_COUNT_DEFAULT_SESSION_DURATION = 5 * 60 # seconds +``` + ## Development - Install development dependencies in your virtualenv with `pip install -e '.[dev]'` diff --git a/django_visit_count/app_settings.py b/django_visit_count/app_settings.py new file mode 100644 index 0000000..d6936bc --- /dev/null +++ b/django_visit_count/app_settings.py @@ -0,0 +1,5 @@ +import os + +from django.conf import settings + +VISIT_COUNT_DEFAULT_SESSION_DURATION = getattr(settings, "VISIT_COUNT_DEFAULT_SESSION_DURATION", 5 * 60) diff --git a/django_visit_count/models.py b/django_visit_count/models.py index 13ad2b7..6c22849 100644 --- a/django_visit_count/models.py +++ b/django_visit_count/models.py @@ -2,13 +2,14 @@ from django.db.models import F from django.utils.translation import gettext_lazy as _ +from .app_settings import VISIT_COUNT_DEFAULT_SESSION_DURATION from .utils import is_new_visit class VisitCountMixin: visit_count = models.PositiveIntegerField(default=0, help_text=_("Visit count")) - def update_visit_count(self, request): - if is_new_visit(request, self): + def count_visit(self, request, session_duration=VISIT_COUNT_DEFAULT_SESSION_DURATION): + if is_new_visit(request, self, session_duration=session_duration): self.visit_count = F("visit_count") + 1 self.save(update_fields=["visit_count"]) diff --git a/django_visit_count/utils.py b/django_visit_count/utils.py index f2e0a45..6bc85dc 100644 --- a/django_visit_count/utils.py +++ b/django_visit_count/utils.py @@ -1,8 +1,10 @@ from django.core.cache import cache from ipware import get_client_ip +from .app_settings import VISIT_COUNT_DEFAULT_SESSION_DURATION -def is_new_visit(request, obj, *, timeout=5 * 60): + +def is_new_visit(request, obj, *, session_duration=VISIT_COUNT_DEFAULT_SESSION_DURATION): if request.user.is_authenticated: user_key = f"user-{request.user.id}" else: @@ -16,5 +18,5 @@ def is_new_visit(request, obj, *, timeout=5 * 60): if cache.get(cache_key): return False - cache.set(cache_key, True, timeout) + cache.set(cache_key, True, timeout=session_duration) return True