Browse Source

Add profiles, progress and better session management

Colin Powell 2 years ago
parent
commit
c993e05d2f

+ 2 - 1
emus/settings.py

@@ -59,6 +59,7 @@ INSTALLED_APPS = [
     "markdownify.apps.MarkdownifyConfig",
     "taggit",
     "emus",
+    "profiles",
     "mathfilters",
     "search",
     "games",
@@ -102,7 +103,6 @@ TEMPLATES = [
 
 WSGI_APPLICATION = "emus.wsgi.application"
 
-
 DATABASES = {
     "default": dj_database_url.config(
         default=os.getenv("EMUS_DATABASE_URL", "sqlite:///db.sqlite3"), conn_max_age=600
@@ -122,6 +122,7 @@ if REDIS_URL:
     CACHES["default"]["BACKEND"] = "django.core.cache.backends.redis.RedisCache"
     CACHES["default"]["LOCATION"] = REDIS_URL
 
+SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
 
 AUTHENTICATION_BACKENDS = [
     "django.contrib.auth.backends.ModelBackend",

+ 0 - 0
profiles/__init__.py


+ 10 - 0
profiles/admin.py

@@ -0,0 +1,10 @@
+from profiles.models import UserGameProgress, UserProfile
+from django.contrib import admin
+
+
+class UserProfileAdmin(admin.ModelAdmin):
+    filter_horizontal = ("favorite_games",)
+
+
+admin.site.register(UserProfile, UserProfileAdmin)
+admin.site.register(UserGameProgress)

+ 6 - 0
profiles/apps.py

@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class GamesConfig(AppConfig):
+    default_auto_field = "django.db.models.BigAutoField"
+    name = "profiles"

+ 43 - 0
profiles/migrations/0001_initial.py

@@ -0,0 +1,43 @@
+# Generated by Django 4.0.4 on 2022-06-20 16:20
+
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import django_extensions.db.fields
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('games', '0020_developer_uuid_game_uuid_gamecollection_uuid_and_more'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='UserProfile',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('favorite_games', models.ManyToManyField(related_name='favorite_games', to='games.game')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='UserGameProgress',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
+                ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
+                ('percent', models.IntegerField(default=0, help_text='Keeps track of how far through the game you are', validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)])),
+                ('game', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='games.game')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'get_latest_by': 'modified',
+                'abstract': False,
+            },
+        ),
+    ]

+ 0 - 0
profiles/migrations/__init__.py


+ 29 - 0
profiles/models.py

@@ -0,0 +1,29 @@
+from django.contrib.auth import get_user_model
+from django.core.validators import MaxValueValidator, MinValueValidator
+from django.db import models
+from django.db.models.deletion import CASCADE, DO_NOTHING
+from django_extensions.db.models import TimeStampedModel
+from games.models import Game
+
+User = get_user_model()
+
+
+class UserGameProgress(TimeStampedModel):
+    user = models.OneToOneField(User, on_delete=models.CASCADE)
+    game = models.ForeignKey(Game, on_delete=DO_NOTHING)
+    percent = models.IntegerField(
+        default=0,
+        validators=[MaxValueValidator(100), MinValueValidator(0)],
+        help_text="Keeps track of how far through the game you are",
+    )
+
+    def __str__(self):
+        return f"Progress in {self.game} for {self.user} {self.percent}"
+
+
+class UserProfile(models.Model):
+    user = models.OneToOneField(User, on_delete=CASCADE)
+    favorite_games = models.ManyToManyField(Game, related_name="favorite_games")
+
+    def __str__(self):
+        return f"User profile for {self.user}"