Compare commits

...

3 Commits

Author SHA1 Message Date
Lukáš Kucharczyk 63504a5768 Update CSS
continuous-integration/drone/push Build is passing Details
2023-01-02 19:37:49 +01:00
Lukáš Kucharczyk fe7aec1b87 Enable admin site 2023-01-02 19:36:22 +01:00
Lukáš Kucharczyk 3cdfb94fe2 Clean up migrations, do not include database 2023-01-02 19:36:03 +01:00
13 changed files with 222 additions and 284 deletions

Binary file not shown.

View File

@ -1,3 +1,8 @@
from django.contrib import admin
from .models import Game, Purchase, Platform, Session
# Register your models here.
admin.site.register(Game)
admin.site.register(Purchase)
admin.site.register(Platform)
admin.site.register(Session)

View File

@ -0,0 +1,98 @@
- model: tracker.game
pk: 1
fields:
name: Nioh 2
wikidata: Q67482292
- model: tracker.game
pk: 2
fields:
name: Elden Ring
wikidata: Q64826862
- model: tracker.game
pk: 3
fields:
name: Cyberpunk 2077
wikidata: Q3182559
- model: tracker.purchase
pk: 1
fields:
game: 1
platform: 1
date_purchased: 2021-02-13
date_refunded: null
- model: tracker.purchase
pk: 2
fields:
game: 2
platform: 1
date_purchased: 2022-02-24
date_refunded: null
- model: tracker.purchase
pk: 3
fields:
game: 3
platform: 1
date_purchased: 2020-12-07
date_refunded: null
- model: tracker.platform
pk: 1
fields:
name: Steam
group: PC
- model: tracker.platform
pk: 3
fields:
name: Xbox Gamepass
group: PC
- model: tracker.platform
pk: 4
fields:
name: Epic Games Store
group: PC
- model: tracker.platform
pk: 5
fields:
name: Playstation 5
group: Playstation
- model: tracker.platform
pk: 6
fields:
name: Playstation 4
group: Playstation
- model: tracker.platform
pk: 7
fields:
name: Nintendo Switch
group: Nintendo
- model: tracker.platform
pk: 8
fields:
name: Nintendo 3DS
group: Nintendo
- model: tracker.session
pk: 1
fields:
purchase: 2
timestamp_start: 2022-12-31 14:25:58+00:00
timestamp_end: 2022-12-31 16:25:22+00:00
duration_manual: null
duration_calculated: null
note: ''
- model: tracker.session
pk: 3
fields:
purchase: 3
timestamp_start: 2023-01-01 22:00:23+00:00
timestamp_end: 2023-01-01 23:28:23+00:00
duration_manual: null
duration_calculated: null
note: ''
- model: tracker.session
pk: 4
fields:
purchase: 3
timestamp_start: 2020-01-01 23:29:17+00:00
timestamp_end: 2020-01-01 23:29:17+00:00
duration_manual: '12:00:00'
duration_calculated: null
note: ''

View File

@ -1,6 +1,7 @@
# Generated by Django 4.1.4 on 2022-12-30 22:02
# Generated by Django 4.1.4 on 2023-01-02 18:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
@ -11,7 +12,68 @@ class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name="TrackerModel",
name="Game",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("wikidata", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="Platform",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("group", models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name="Purchase",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("date_purchased", models.DateField()),
("date_refunded", models.DateField(blank=True, null=True)),
(
"game",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="tracker.game"
),
),
(
"platform",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tracker.platform",
),
),
],
),
migrations.CreateModel(
name="Session",
fields=[
(
"id",
@ -22,10 +84,18 @@ class Migration(migrations.Migration):
verbose_name="ID",
),
),
("name", models.CharField(max_length=200)),
("timestamp_start", models.DateTimeField()),
("timestamp_end", models.DateTimeField()),
("note", models.TextField()),
("duration_manual", models.DurationField(blank=True, null=True)),
("duration_calculated", models.DurationField(blank=True, null=True)),
("note", models.TextField(blank=True, null=True)),
(
"purchase",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tracker.purchase",
),
),
],
),
]

View File

@ -1,104 +0,0 @@
# Generated by Django 4.1.4 on 2022-12-31 12:35
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("tracker", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Game",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("wikidata", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="Platform",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("group", models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name="Purchase",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("date_purchased", models.DateTimeField()),
("date_refunded", models.DateTimeField()),
(
"game",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="tracker.game"
),
),
(
"platform",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tracker.platform",
),
),
],
),
migrations.CreateModel(
name="Session",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("timestamp_start", models.DateTimeField()),
("timestamp_end", models.DateTimeField()),
("duration_manual", models.DurationField()),
("duration_calculated", models.DurationField()),
("note", models.TextField()),
(
"purchase",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tracker.purchase",
),
),
],
),
migrations.DeleteModel(
name="TrackerModel",
),
]

View File

@ -1,23 +0,0 @@
# Generated by Django 4.1.4 on 2022-12-31 13:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tracker", "0002_game_platform_purchase_session_delete_trackermodel"),
]
operations = [
migrations.AlterField(
model_name="purchase",
name="date_purchased",
field=models.DateField(),
),
migrations.AlterField(
model_name="purchase",
name="date_refunded",
field=models.DateField(),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 4.1.4 on 2022-12-31 13:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tracker", "0003_alter_purchase_date_purchased_and_more"),
]
operations = [
migrations.AlterField(
model_name="purchase",
name="date_refunded",
field=models.DateField(blank=True),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 4.1.4 on 2022-12-31 13:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tracker", "0004_alter_purchase_date_refunded"),
]
operations = [
migrations.AlterField(
model_name="purchase",
name="date_refunded",
field=models.DateField(blank=True, null=True),
),
]

View File

@ -1,28 +0,0 @@
# Generated by Django 4.1.4 on 2022-12-31 13:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tracker", "0005_alter_purchase_date_refunded"),
]
operations = [
migrations.AlterField(
model_name="session",
name="duration_calculated",
field=models.DurationField(blank=True, null=True),
),
migrations.AlterField(
model_name="session",
name="duration_manual",
field=models.DurationField(blank=True, null=True),
),
migrations.AlterField(
model_name="session",
name="note",
field=models.TextField(blank=True, null=True),
),
]

View File

@ -1,4 +1,5 @@
from django.db import models
from datetime import timedelta
class Game(models.Model):
@ -31,12 +32,20 @@ class Session(models.Model):
purchase = models.ForeignKey("Purchase", on_delete=models.CASCADE)
timestamp_start = models.DateTimeField()
timestamp_end = models.DateTimeField()
duration_manual = models.DurationField(blank=True, null=True)
duration_manual = models.DurationField(blank=True, null=True, default=timedelta(0))
duration_calculated = models.DurationField(blank=True, null=True)
note = models.TextField(blank=True, null=True)
def __str__(self):
return self.purchase
mark = ", manual" if self.duration_manual != None else ""
return f"{str(self.purchase)} {str(self.timestamp_start.date())} ({self.total_duration()}{mark})"
def calculated_duration(self):
return self.timestamp_end - self.timestamp_start
def total_duration(self):
return (
self.calculated_duration()
if self.duration_manual == None
else self.duration_manual + self.calculated_duration()
)

View File

@ -726,10 +726,6 @@ select {
margin-bottom: 1rem;
}
.mr-3 {
margin-right: 0.75rem;
}
.mt-4 {
margin-top: 1rem;
}
@ -746,10 +742,6 @@ select {
display: grid;
}
.h-6 {
height: 1.5rem;
}
.w-full {
width: 100%;
}
@ -798,38 +790,20 @@ select {
border-radius: 0.25rem;
}
.rounded-lg {
border-radius: 0.5rem;
}
.rounded-xl {
border-radius: 0.75rem;
}
.border {
border-width: 1px;
}
.border-gray-200 {
--tw-border-opacity: 1;
border-color: rgb(229 231 235 / var(--tw-border-opacity));
}
.border-gray-100 {
--tw-border-opacity: 1;
border-color: rgb(243 244 246 / var(--tw-border-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-gray-50 {
--tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
}
.p-4 {
padding: 1rem;
}
@ -851,6 +825,11 @@ select {
padding-right: 1rem;
}
.text-4xl {
font-size: 2.25rem;
line-height: 2.5rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
@ -861,15 +840,15 @@ select {
line-height: 1.75rem;
}
.text-4xl {
font-size: 2.25rem;
line-height: 2.5rem;
}
.font-semibold {
font-weight: 600;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
@ -880,62 +859,29 @@ select {
text-decoration-line: underline;
}
@media (prefers-color-scheme: dark) {
.dark\:border-gray-700 {
--tw-border-opacity: 1;
border-color: rgb(55 65 81 / var(--tw-border-opacity));
}
.dark\:border-white {
--tw-border-opacity: 1;
border-color: rgb(255 255 255 / var(--tw-border-opacity));
}
.dark\:bg-slate-800 {
--tw-bg-opacity: 1;
background-color: rgb(30 41 59 / var(--tw-bg-opacity));
}
.dark\:bg-gray-900 {
--tw-bg-opacity: 1;
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
.dark\:bg-gray-800 {
--tw-bg-opacity: 1;
background-color: rgb(31 41 55 / var(--tw-bg-opacity));
}
.dark\:bg-slate-700 {
--tw-bg-opacity: 1;
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
}
.dark\:text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.dark\:text-gray-900 {
--tw-text-opacity: 1;
color: rgb(17 24 39 / var(--tw-text-opacity));
}
.dark\:text-slate-300 {
--tw-text-opacity: 1;
color: rgb(203 213 225 / var(--tw-text-opacity));
}
.dark\:text-slate-400 {
--tw-text-opacity: 1;
color: rgb(148 163 184 / var(--tw-text-opacity));
}
.dark .dark\:border-white {
--tw-border-opacity: 1;
border-color: rgb(255 255 255 / var(--tw-border-opacity));
}
@media (min-width: 640px) {
.sm\:h-9 {
height: 2.25rem;
}
.dark .dark\:bg-gray-900 {
--tw-bg-opacity: 1;
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
.dark .dark\:bg-slate-700 {
--tw-bg-opacity: 1;
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
}
.dark .dark\:text-slate-300 {
--tw-text-opacity: 1;
color: rgb(203 213 225 / var(--tw-text-opacity));
}
.dark .dark\:text-slate-400 {
--tw-text-opacity: 1;
color: rgb(148 163 184 / var(--tw-text-opacity));
}
@media (min-width: 768px) {

View File

@ -11,12 +11,12 @@
<link rel="stylesheet" href="{% static 'base.css' %}" />
</head>
<body class="bg-white dark:bg-slate-800 dark:text-white">
<body class="dark">
<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">Timetracker</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

View File

@ -19,6 +19,7 @@ from django.views.generic import RedirectView
urlpatterns = [
path("admin/", admin.site.urls),
path("", RedirectView.as_view(url="/tracker/list-sessions")),
path("tracker/", include("tracker.urls")),
]