Filtering sessions by purchase
This commit is contained in:
		@ -6,31 +6,31 @@
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
    <title>{% block title %}No Title{% endblock title %}</title>
 | 
			
		||||
    <title>Timetracker - {% block title %}Untitled{% endblock title %}</title>
 | 
			
		||||
    <link rel="stylesheet" href="https://rsms.me/inter/inter.css">
 | 
			
		||||
    <link rel="stylesheet" href="{% static 'base.css' %}" />
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body class="dark">
 | 
			
		||||
    <div class="dark:bg-gray-800 h-screen">
 | 
			
		||||
    <nav class="mb-4 bg-white dark:bg-gray-900 border-gray-200 rounded">
 | 
			
		||||
        <div class="container flex flex-wrap items-center justify-between mx-auto">
 | 
			
		||||
            <a href="#" class="flex items-center">
 | 
			
		||||
                <span class="text-4xl">⌚</span>
 | 
			
		||||
                <span class="self-center text-xl font-semibold whitespace-nowrap text-white">Timetracker</span>
 | 
			
		||||
            </a>
 | 
			
		||||
            <div class="w-full md:block md:w-auto">
 | 
			
		||||
                <ul
 | 
			
		||||
        <nav class="mb-4 bg-white dark:bg-gray-900 border-gray-200 rounded">
 | 
			
		||||
            <div class="container flex flex-wrap items-center justify-between mx-auto">
 | 
			
		||||
                <a href="#" class="flex items-center">
 | 
			
		||||
                    <span class="text-4xl">⌚</span>
 | 
			
		||||
                    <span class="self-center text-xl font-semibold whitespace-nowrap text-white">Timetracker</span>
 | 
			
		||||
                </a>
 | 
			
		||||
                <div class="w-full md:block md:w-auto">
 | 
			
		||||
                    <ul
 | 
			
		||||
                        class="flex flex-col md:flex-row p-4 mt-4 dark:text-white">
 | 
			
		||||
                    <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_game' %}">New Game</a></li>
 | 
			
		||||
                    <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_purchase' %}">New Purchase</a></li>
 | 
			
		||||
                    <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_session' %}">New Session</a></li>
 | 
			
		||||
                    <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'list_sessions' %}">All Sessions</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                        <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_game' %}">New Game</a></li>
 | 
			
		||||
                        <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_purchase' %}">New Purchase</a></li>
 | 
			
		||||
                        <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'add_session' %}">New Session</a></li>
 | 
			
		||||
                        <li><a class="block py-2 pl-3 pr-4 hover:underline" href="{% url 'list_sessions' %}">All Sessions</a></li>
 | 
			
		||||
                    </ul>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </nav>
 | 
			
		||||
    {% block content %}No content here.{% endblock %}
 | 
			
		||||
        </nav>
 | 
			
		||||
        {% block content %}No content here.{% endblock %}
 | 
			
		||||
    </div>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,21 @@
 | 
			
		||||
{% extends 'base.html' %}
 | 
			
		||||
 | 
			
		||||
{% block title %}Tracker Entry List{% endblock title %}
 | 
			
		||||
{% block title %}Sessions{% endblock title %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% if purchase %}
 | 
			
		||||
<div class="text-center text-xl mb-4 dark:text-slate-400">
 | 
			
		||||
    <h1>Listing sessions only for purchase "{{ purchase }}"</h1>
 | 
			
		||||
    <a class="dark:text-white hover:underline" href="{% url 'list_sessions' %}">View all sessions</a>
 | 
			
		||||
</div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
<div class="grid grid-cols-4 gap-4 shadow rounded-xl max-w-screen-lg mx-auto dark:bg-slate-700 p-2 justify-center">
 | 
			
		||||
    <div class="dark:border-white dark:text-slate-300 text-lg">Name</div>
 | 
			
		||||
    <div class="dark:border-white dark:text-slate-300 text-lg">Start</div>
 | 
			
		||||
    <div class="dark:border-white dark:text-slate-300 text-lg">End</div>
 | 
			
		||||
    <div class="dark:border-white dark:text-slate-300 text-lg">Duration</div>
 | 
			
		||||
    {% for data in dataset %}
 | 
			
		||||
    <div class="dark:text-slate-400">{{ data.purchase }}</div>
 | 
			
		||||
    <div class=""><a class="dark:text-white hover:underline" href="{% url 'list_sessions' data.purchase.id %}">{{ data.purchase }}</a></div>
 | 
			
		||||
    <div class="dark:text-slate-400">{{ data.timestamp_start }}</div>
 | 
			
		||||
    <div class="dark:text-slate-400">{{ data.timestamp_end }}</div>
 | 
			
		||||
    <div class="dark:text-slate-400">{{ data.time_delta }}</div>
 | 
			
		||||
 | 
			
		||||
@ -7,4 +7,9 @@ urlpatterns = [
 | 
			
		||||
    path("add-session/", views.add_session, name="add_session"),
 | 
			
		||||
    path("add-purchase/", views.add_purchase, name="add_purchase"),
 | 
			
		||||
    path("list-sessions/", views.list_sessions, name="list_sessions"),
 | 
			
		||||
    path(
 | 
			
		||||
        "list-sessions/by-purchase/<int:purchase_id>",
 | 
			
		||||
        views.list_sessions,
 | 
			
		||||
        name="list_sessions",
 | 
			
		||||
    ),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ from .models import Game, Platform, Purchase, Session
 | 
			
		||||
from .forms import SessionForm, PurchaseForm, GameForm
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from django.db.models import ExpressionWrapper, F, DurationField
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def add_session(request):
 | 
			
		||||
@ -18,9 +19,16 @@ def add_session(request):
 | 
			
		||||
    return render(request, "add_session.html", context)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def list_sessions(request):
 | 
			
		||||
def list_sessions(request, purchase_id=None):
 | 
			
		||||
    context = {}
 | 
			
		||||
    dataset = Session.objects.annotate(
 | 
			
		||||
 | 
			
		||||
    if purchase_id != None:
 | 
			
		||||
        dataset = Session.objects.filter(purchase=purchase_id)
 | 
			
		||||
        context["purchase"] = Purchase.objects.get(id=purchase_id)
 | 
			
		||||
    else:
 | 
			
		||||
        dataset = Session.objects.all()
 | 
			
		||||
 | 
			
		||||
    dataset = dataset.annotate(
 | 
			
		||||
        time_delta=ExpressionWrapper(
 | 
			
		||||
            F("timestamp_end") - F("timestamp_start"), output_field=DurationField()
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user