Compare commits
	
		
			3 Commits
		
	
	
		
			c814b4c2cb
			...
			c4b0347f3b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c4b0347f3b | |||
| c6ed21167c | |||
| 4ce15c44fc | 
@ -1,3 +1,11 @@
 | 
			
		||||
## 1.1.1 / 2023-10-09 20:52+02:00
 | 
			
		||||
 | 
			
		||||
### New
 | 
			
		||||
* Add notes section to game overview
 | 
			
		||||
 | 
			
		||||
### Enhancements
 | 
			
		||||
* Make it possible to add any data on the game overview page
 | 
			
		||||
 | 
			
		||||
## 1.1.0 / 2023-10-09 00:01+02:00
 | 
			
		||||
 | 
			
		||||
### New
 | 
			
		||||
 | 
			
		||||
@ -6,17 +6,10 @@ RUN npm install && \
 | 
			
		||||
 | 
			
		||||
FROM python:3.10.9-slim-bullseye
 | 
			
		||||
 | 
			
		||||
ENV VERSION_NUMBER 1.1.0
 | 
			
		||||
ENV VERSION_NUMBER 1.1.1
 | 
			
		||||
ENV PROD 1
 | 
			
		||||
ENV PYTHONUNBUFFERED=1
 | 
			
		||||
 | 
			
		||||
RUN apt update && \
 | 
			
		||||
    apt install -y \
 | 
			
		||||
    bash \
 | 
			
		||||
    vim \
 | 
			
		||||
    curl && \
 | 
			
		||||
    rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
RUN useradd -m --uid 1000 timetracker
 | 
			
		||||
WORKDIR /home/timetracker/app
 | 
			
		||||
COPY . /home/timetracker/app/
 | 
			
		||||
 | 
			
		||||
@ -811,6 +811,14 @@ select {
 | 
			
		||||
  margin-top: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ml-8 {
 | 
			
		||||
  margin-left: 2rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ml-1 {
 | 
			
		||||
  margin-left: 0.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.block {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
@ -835,6 +843,14 @@ select {
 | 
			
		||||
  height: 1.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.h-4 {
 | 
			
		||||
  height: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.h-5 {
 | 
			
		||||
  height: 1.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.min-h-screen {
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
@ -847,6 +863,14 @@ select {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.w-5 {
 | 
			
		||||
  width: 1.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.w-7 {
 | 
			
		||||
  width: 1.75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.max-w-screen-lg {
 | 
			
		||||
  max-width: 1024px;
 | 
			
		||||
}
 | 
			
		||||
@ -881,6 +905,10 @@ select {
 | 
			
		||||
  align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.justify-center {
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.justify-between {
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
}
 | 
			
		||||
@ -927,6 +955,16 @@ select {
 | 
			
		||||
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bg-blue-600 {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(37 99 235 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bg-violet-600 {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(124 58 237 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.p-4 {
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
}
 | 
			
		||||
@ -954,6 +992,10 @@ select {
 | 
			
		||||
  padding-right: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pl-8 {
 | 
			
		||||
  padding-left: 2rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-center {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
@ -996,6 +1038,10 @@ select {
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.italic {
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-slate-300 {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(203 213 225 / var(--tw-text-opacity));
 | 
			
		||||
@ -1236,6 +1282,16 @@ th label {
 | 
			
		||||
  background-color: rgb(21 128 61 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hover\:bg-blue-700:hover {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(29 78 216 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hover\:bg-violet-700:hover {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(109 40 217 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hover\:underline:hover {
 | 
			
		||||
  text-decoration-line: underline;
 | 
			
		||||
}
 | 
			
		||||
@ -1256,6 +1312,16 @@ th label {
 | 
			
		||||
  --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-blue-500:focus {
 | 
			
		||||
  --tw-ring-opacity: 1;
 | 
			
		||||
  --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-violet-500:focus {
 | 
			
		||||
  --tw-ring-opacity: 1;
 | 
			
		||||
  --tw-ring-color: rgb(139 92 246 / var(--tw-ring-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-offset-2:focus {
 | 
			
		||||
  --tw-ring-offset-width: 2px;
 | 
			
		||||
}
 | 
			
		||||
@ -1264,6 +1330,10 @@ th label {
 | 
			
		||||
  --tw-ring-offset-color: #bfdbfe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-offset-violet-200:focus {
 | 
			
		||||
  --tw-ring-offset-color: #ddd6fe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:is(.dark .dark\:bg-gray-800) {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(31 41 55 / var(--tw-bg-opacity));
 | 
			
		||||
@ -1274,6 +1344,11 @@ th label {
 | 
			
		||||
  background-color: rgb(17 24 39 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:is(.dark .dark\:text-slate-500) {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(100 116 139 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:is(.dark .dark\:text-slate-600) {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(71 85 105 / var(--tw-text-opacity));
 | 
			
		||||
@ -1284,16 +1359,6 @@ th label {
 | 
			
		||||
  color: rgb(255 255 255 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:is(.dark .dark\:text-slate-400) {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(148 163 184 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:is(.dark .dark\:text-slate-500) {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(100 116 139 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (min-width: 640px) {
 | 
			
		||||
  .sm\:inline {
 | 
			
		||||
    display: inline;
 | 
			
		||||
@ -1320,6 +1385,10 @@ th label {
 | 
			
		||||
    padding-left: 0.5rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .sm\:pl-4 {
 | 
			
		||||
    padding-left: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .sm\:decoration-2 {
 | 
			
		||||
    text-decoration-thickness: 2px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								games/templates/components/edit_button.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								games/templates/components/edit_button.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
<a href="{{ edit_url }}">
 | 
			
		||||
  <button
 | 
			
		||||
    type="button"
 | 
			
		||||
    title="Edit"
 | 
			
		||||
    class="ml-1 py-1 px-2 flex justify-center items-center bg-violet-600 hover:bg-violet-700 focus:ring-violet-500 focus:ring-offset-violet-200 text-white transition ease-in duration-200 text-center text-base font-semibold shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 w-7 h-4 rounded-lg"
 | 
			
		||||
  >
 | 
			
		||||
    <svg
 | 
			
		||||
      xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
      viewBox="0 0 20 20"
 | 
			
		||||
      fill="currentColor"
 | 
			
		||||
      class="w-5 h-5"
 | 
			
		||||
    >
 | 
			
		||||
      <path
 | 
			
		||||
        d="M5.433 13.917l1.262-3.155A4 4 0 017.58 9.42l6.92-6.918a2.121 2.121 0 013 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 01-.65-.65z"
 | 
			
		||||
      />
 | 
			
		||||
      <path
 | 
			
		||||
        d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0010 3H4.75A2.75 2.75 0 002 5.75v9.5A2.75 2.75 0 004.75 18h9.5A2.75 2.75 0 0017 15.25V10a.75.75 0 00-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5z"
 | 
			
		||||
      />
 | 
			
		||||
    </svg>
 | 
			
		||||
  </button>
 | 
			
		||||
</a>
 | 
			
		||||
@ -6,7 +6,12 @@
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <div class="dark:text-white max-w-sm sm:max-w-xl lg:max-w-3xl mx-auto">
 | 
			
		||||
        <h1 class="text-4xl">{{ game.name }} <span class="dark:text-slate-500">(#{{ game.pk }})</span></h1>
 | 
			
		||||
        <h1 class="text-4xl flex items-center">
 | 
			
		||||
            {{ game.name }}
 | 
			
		||||
            <span class="dark:text-slate-500">(#{{ game.pk }})</span>
 | 
			
		||||
            {% url 'edit_game' game.id as edit_url %}
 | 
			
		||||
            {% include 'components/edit_button.html' with edit_url=edit_url %}
 | 
			
		||||
        </h1>
 | 
			
		||||
        <h2 class="text-lg my-2 ml-2">
 | 
			
		||||
            {{ total_hours }} <span class="dark:text-slate-500">total</span>
 | 
			
		||||
            {{ session_average }} <span class="dark:text-slate-500">avg</span> 
 | 
			
		||||
@ -17,7 +22,7 @@
 | 
			
		||||
        <h1 class="text-3xl mt-4 mb-1">Editions <span class="dark:text-slate-500">({{ editions.count }})</span></h1>
 | 
			
		||||
        <ul>
 | 
			
		||||
            {% for edition in editions %}
 | 
			
		||||
            <li class="sm:pl-2">
 | 
			
		||||
            <li class="sm:pl-2 flex items-center">
 | 
			
		||||
                {{ edition.name }} ({{ edition.platform }}, {{ edition.year_released }})
 | 
			
		||||
                {% if edition.wikidata %}
 | 
			
		||||
                <span class="hidden sm:inline">
 | 
			
		||||
@ -26,19 +31,50 @@
 | 
			
		||||
                    </a>
 | 
			
		||||
                </span>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
                {% url 'edit_edition' edition.id as edit_url %}
 | 
			
		||||
                {% include 'components/edit_button.html' with edit_url=edit_url %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
        <h1 class="text-3xl mt-4 mb-1">Purchases <span class="dark:text-slate-500">({{ purchases.count }})</span></h1>
 | 
			
		||||
        <ul>
 | 
			
		||||
            {% for purchase in purchases %}
 | 
			
		||||
            <li class="sm:pl-2">{{ purchase.platform }} ({{ purchase.get_ownership_type_display }}, {{ purchase.date_purchased | date:"Y" }}, {{ purchase.price }} {{ purchase.price_currency}})</li>
 | 
			
		||||
            <li class="sm:pl-2 flex items-center">
 | 
			
		||||
                {{ purchase.platform }}
 | 
			
		||||
                ({{ purchase.get_ownership_type_display }}, {{ purchase.date_purchased | date:"Y" }}, {{ purchase.price }} {{ purchase.price_currency}})
 | 
			
		||||
                {% url 'edit_purchase' purchase.id as edit_url %}
 | 
			
		||||
                {% include 'components/edit_button.html' with edit_url=edit_url %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
        <h1 class="text-3xl mt-4 mb-1">Sessions <span class="dark:text-slate-500">({{ sessions.count }})</span></h1>
 | 
			
		||||
        <ul>
 | 
			
		||||
            {% for session in sessions %}
 | 
			
		||||
            <li class="sm:pl-2">{{ session.timestamp_start | date:"d/m/Y" }} ({{ session.device.get_type_display | default:"Unknown" }}, {{ session.duration_formatted }})</li>
 | 
			
		||||
            <li class="sm:pl-2 flex items-center">
 | 
			
		||||
                {{ session.timestamp_start | date:"d/m/Y" }}
 | 
			
		||||
                ({{ session.device.get_type_display | default:"Unknown" }}, {{ session.duration_formatted }})
 | 
			
		||||
                {% url 'edit_session' session.id as edit_url %}
 | 
			
		||||
                {% include 'components/edit_button.html' with edit_url=edit_url %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
        <h1 class="text-3xl mt-4 mb-1">Notes <span class="dark:text-slate-500">({{ sessions_with_notes.count }})</span></h1>
 | 
			
		||||
        <ul>
 | 
			
		||||
            {% for session in sessions_with_notes %}
 | 
			
		||||
            <li class="sm:pl-2">
 | 
			
		||||
                <ul>
 | 
			
		||||
                    <li class="block dark:text-slate-500">
 | 
			
		||||
                        <span class="flex items-center">
 | 
			
		||||
                            {{ session.timestamp_start | date:"d/m/Y H:m" }}
 | 
			
		||||
                            {% url 'edit_session' session.id as edit_session_url %}
 | 
			
		||||
                            {% include 'components/edit_button.html' with edit_url=edit_session_url %}
 | 
			
		||||
                        </span>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li class="sm:pl-4 italic">
 | 
			
		||||
                        {{ session.note|linebreaks }}
 | 
			
		||||
                    </li>
 | 
			
		||||
                </ul>
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
@ -112,6 +112,7 @@ def view_game(request, game_id=None):
 | 
			
		||||
    # so the most recent are on top
 | 
			
		||||
    context["last_session"] = context["sessions"].first()
 | 
			
		||||
    context["first_session"] = context["sessions"].last()
 | 
			
		||||
    context["sessions_with_notes"] = context["sessions"].exclude(note="")
 | 
			
		||||
    return render(request, "view_game.html", context)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[tool.poetry]
 | 
			
		||||
name = "timetracker"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
version = "1.1.1"
 | 
			
		||||
description = "A simple time tracker."
 | 
			
		||||
authors = ["Lukáš Kucharczyk <lukas@kucharczyk.xyz>"]
 | 
			
		||||
license = "GPL"
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user