mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 07:11:08 -05:00
- Cleaned up and standardized assertions in ApiTestMixin for API response validation. - Updated ASGI settings to use os.environ for setting the DJANGO_SETTINGS_MODULE. - Removed unused imports and improved formatting in settings.py. - Refactored URL patterns in urls.py for better readability and organization. - Enhanced view functions in views.py for consistency and clarity. - Added .flake8 configuration for linting and style enforcement. - Introduced type stubs for django-environ to improve type checking with Pylance.
61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
from django.db import models
|
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.utils import timezone
|
|
from django.db.models import Count
|
|
|
|
|
|
class PageView(models.Model):
|
|
content_type = models.ForeignKey(
|
|
ContentType, on_delete=models.CASCADE, related_name="page_views"
|
|
)
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = GenericForeignKey("content_type", "object_id")
|
|
|
|
timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
|
|
ip_address = models.GenericIPAddressField()
|
|
user_agent = models.CharField(max_length=512, blank=True)
|
|
|
|
class Meta:
|
|
indexes = [
|
|
models.Index(fields=["timestamp"]),
|
|
models.Index(fields=["content_type", "object_id"]),
|
|
]
|
|
|
|
@classmethod
|
|
def get_trending_items(cls, model_class, hours=24, limit=10):
|
|
"""Get trending items of a specific model class based on views in last X hours.
|
|
|
|
Args:
|
|
model_class: The model class to get trending items for (e.g., Park, Ride)
|
|
hours (int): Number of hours to look back for views (default: 24)
|
|
limit (int): Maximum number of items to return (default: 10)
|
|
|
|
Returns:
|
|
QuerySet: The trending items ordered by view count
|
|
"""
|
|
content_type = ContentType.objects.get_for_model(model_class)
|
|
cutoff = timezone.now() - timezone.timedelta(hours=hours)
|
|
|
|
# Query through the ContentType relationship
|
|
item_ids = (
|
|
cls.objects.filter(content_type=content_type, timestamp__gte=cutoff)
|
|
.values("object_id")
|
|
.annotate(view_count=Count("id"))
|
|
.filter(view_count__gt=0)
|
|
.order_by("-view_count")
|
|
.values_list("object_id", flat=True)[:limit]
|
|
)
|
|
|
|
# Get the actual items in the correct order
|
|
if item_ids:
|
|
# Convert the list to a string of comma-separated values
|
|
id_list = list(item_ids)
|
|
# Use Case/When to preserve the ordering
|
|
from django.db.models import Case, When
|
|
|
|
preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(id_list)])
|
|
return model_class.objects.filter(pk__in=id_list).order_by(preserved)
|
|
|
|
return model_class.objects.none()
|