diff --git a/backlogger/__init__.py b/backlogger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backlogger/admin.py b/backlogger/admin.py new file mode 100644 index 0000000..c7f6669 --- /dev/null +++ b/backlogger/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin +from .models import Item + + +@admin.register(Item) +class ItemAdmin(admin.ModelAdmin): + list_display = ['name', 'category', 'progress_percent', 'favorite', 'created_at'] + list_filter = ['category', 'favorite'] + search_fields = ['name'] diff --git a/backlogger/apps.py b/backlogger/apps.py new file mode 100644 index 0000000..71b6767 --- /dev/null +++ b/backlogger/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BackloggerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'backlogger' diff --git a/backlogger/forms.py b/backlogger/forms.py new file mode 100644 index 0000000..674c78e --- /dev/null +++ b/backlogger/forms.py @@ -0,0 +1,46 @@ +from django import forms +from .models import Item + + +class ItemForm(forms.ModelForm): + progress_percent = forms.FloatField( + min_value=0, + max_value=100, + initial=0, + widget=forms.NumberInput(attrs={ + 'type': 'range', + 'min': '0', + 'max': '100', + 'step': '1', + }), + ) + + class Meta: + model = Item + fields = [ + 'category', 'name', 'progress_percent', 'favorite', + 'hours_played', 'total_hours', + 'pages_read', 'total_pages', + 'watched', 'duration_minutes', + ] + widgets = { + 'hours_played': forms.NumberInput(attrs={'step': '0.5', 'min': '0'}), + 'total_hours': forms.NumberInput(attrs={'step': '0.5', 'min': '0'}), + 'pages_read': forms.NumberInput(attrs={'min': '0'}), + 'total_pages': forms.NumberInput(attrs={'min': '0'}), + 'duration_minutes': forms.NumberInput(attrs={'min': '0'}), + } + + def clean(self): + cleaned_data = super().clean() + category = cleaned_data.get('category') + if category != Item.GAMES: + cleaned_data['hours_played'] = None + cleaned_data['total_hours'] = None + if category != Item.BOOKS: + cleaned_data['pages_read'] = None + cleaned_data['total_pages'] = None + if category != Item.FILMS: + cleaned_data['watched'] = None + cleaned_data['duration_minutes'] = None + return cleaned_data diff --git a/backlogger/migrations/0001_initial.py b/backlogger/migrations/0001_initial.py new file mode 100644 index 0000000..1530520 --- /dev/null +++ b/backlogger/migrations/0001_initial.py @@ -0,0 +1,32 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('category', models.CharField(choices=[('games', 'Games'), ('books', 'Books'), ('films', 'Films'), ('other', 'Other')], max_length=10)), + ('name', models.CharField(max_length=200)), + ('progress_percent', models.FloatField(default=0.0)), + ('favorite', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('hours_played', models.FloatField(blank=True, null=True)), + ('total_hours', models.FloatField(blank=True, null=True)), + ('pages_read', models.IntegerField(blank=True, null=True)), + ('total_pages', models.IntegerField(blank=True, null=True)), + ('watched', models.BooleanField(blank=True, null=True)), + ('duration_minutes', models.IntegerField(blank=True, null=True)), + ], + options={ + 'ordering': ['-favorite', 'name'], + }, + ), + ] diff --git a/backlogger/migrations/__init__.py b/backlogger/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backlogger/models.py b/backlogger/models.py new file mode 100644 index 0000000..19bc14f --- /dev/null +++ b/backlogger/models.py @@ -0,0 +1,39 @@ +from django.db import models + + +class Item(models.Model): + GAMES = 'games' + BOOKS = 'books' + FILMS = 'films' + OTHER = 'other' + CATEGORY_CHOICES = [ + (GAMES, 'Games'), + (BOOKS, 'Books'), + (FILMS, 'Films'), + (OTHER, 'Other'), + ] + + category = models.CharField(max_length=10, choices=CATEGORY_CHOICES) + name = models.CharField(max_length=200) + progress_percent = models.FloatField(default=0.0) + favorite = models.BooleanField(default=False) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + # Games + hours_played = models.FloatField(null=True, blank=True) + total_hours = models.FloatField(null=True, blank=True) + + # Books + pages_read = models.IntegerField(null=True, blank=True) + total_pages = models.IntegerField(null=True, blank=True) + + # Films + watched = models.BooleanField(null=True, blank=True) + duration_minutes = models.IntegerField(null=True, blank=True) + + class Meta: + ordering = ['-favorite', 'name'] + + def __str__(self): + return f"{self.get_category_display()}: {self.name}" diff --git a/backlogger/templates/backlogger/item_form.html b/backlogger/templates/backlogger/item_form.html new file mode 100644 index 0000000..5627b0f --- /dev/null +++ b/backlogger/templates/backlogger/item_form.html @@ -0,0 +1,260 @@ + + +
+ + +Backlogger
+ + {% if form.non_field_errors %} + + {% endif %} + + +