Jelajahi Sumber

Add taggit and better searching

Colin Powell 3 tahun lalu
induk
melakukan
9c7c80d2ab

+ 1 - 0
emus/settings.py

@@ -49,6 +49,7 @@ INSTALLED_APPS = [
     "django.contrib.staticfiles",
     "django.contrib.sites",
     "django_extensions",
+    "taggit",
     "emus",
     "mathfilters",
     "search",

+ 5 - 0
games/admin.py

@@ -12,6 +12,11 @@ class GameAdmin(admin.ModelAdmin):
         "region",
         "game_system",
     )
+    search_fields = [
+        "name",
+        "description",
+        "region",
+    ]
 
 
 class GameInline(admin.TabularInline):

+ 36 - 0
games/migrations/0016_game_source_game_tags_and_more.py

@@ -0,0 +1,36 @@
+# Generated by Django 4.0.4 on 2022-04-19 02:27
+
+from django.db import migrations, models
+import django.db.models.deletion
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'),
+        ('games', '0015_gamecollection'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='game',
+            name='source',
+            field=models.CharField(blank=True, max_length=500, null=True),
+        ),
+        migrations.AddField(
+            model_name='game',
+            name='tags',
+            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
+        ),
+        migrations.AlterField(
+            model_name='gamecollection',
+            name='game_system',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='games.gamesystem'),
+        ),
+        migrations.AlterField(
+            model_name='gamecollection',
+            name='genre',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='games.genre'),
+        ),
+    ]

+ 8 - 7
games/models.py

@@ -1,6 +1,5 @@
 import logging
 import os
-from enum import Enum
 from shlex import quote
 
 from django.conf import settings
@@ -10,6 +9,7 @@ from django.urls import reverse
 from django_extensions.db.fields import AutoSlugField
 from django_extensions.db.models import TimeStampedModel
 from emus.utils import ChoiceEnum
+from taggit.managers import TaggableManager
 
 logger = logging.getLogger(__name__)
 
@@ -30,12 +30,6 @@ def get_rom_upload_path(instance, filename):
     return f"{instance.game_system.retropie_slug}/{filename}"
 
 
-class Region(Enum):
-    USA = "US"
-    EUROPE = "EU"
-    JAPAN = "JP"
-
-
 class BaseModel(TimeStampedModel):
     """A base model for providing name and slugged fields for organizational models"""
 
@@ -215,6 +209,13 @@ class Game(BaseModel):
         blank=True,
         null=True,
     )
+    source = models.CharField(
+        max_length=500,
+        blank=True,
+        null=True,
+    )
+
+    tags = TaggableManager()
 
     class Meta:
         ordering = ["game_system", "name"]

+ 1 - 1
games/utils.py

@@ -74,7 +74,7 @@ def import_gamelist_file_to_db_for_system(
         undub = game_path.lower() in UNDUB_KEYWORDS
         hack = game_path.lower() in HACK_KEYWORDS
 
-        region = None
+        region = Game.Region.X.name
 
         if any(us in game_path for us in REGION_KEYWORDS["US"]):
             region = Game.Region.US.name

+ 22 - 7
poetry.lock

@@ -1,6 +1,6 @@
 [[package]]
 name = "amqp"
-version = "5.1.0"
+version = "5.1.1"
 description = "Low-level AMQP client for Python (fork of amqplib)."
 category = "main"
 optional = false
@@ -283,7 +283,7 @@ requests-oauthlib = ">=0.3.0"
 
 [[package]]
 name = "django-celery-results"
-version = "2.3.0"
+version = "2.3.1"
 description = "Celery result backends for Django."
 category = "main"
 optional = false
@@ -322,6 +322,17 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "django-taggit"
+version = "2.1.0"
+description = "django-taggit is a reusable Django application for simple tagging."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+Django = ">=2.2"
+
 [[package]]
 name = "djangorestframework"
 version = "3.13.1"
@@ -670,12 +681,12 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.8"
-content-hash = "62cb868b58192f799dc8814c6bd7e447fe5629a303e127d6630eb4bd9bd21456"
+content-hash = "7609f0e9f4d23f838a491440fb9d26e3c8168daad2bfc40d5fb02479f19d8bd6"
 
 [metadata.files]
 amqp = [
-    {file = "amqp-5.1.0-py3-none-any.whl", hash = "sha256:a575f4fa659a2290dc369b000cff5fea5c6be05fe3f2d5e511bcf56c7881c3ef"},
-    {file = "amqp-5.1.0.tar.gz", hash = "sha256:446b3e8a8ebc2ceafd424ffcaab1c353830d48161256578ed7a65448e601ebed"},
+    {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"},
+    {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"},
 ]
 asgiref = [
     {file = "asgiref-3.5.0-py3-none-any.whl", hash = "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9"},
@@ -837,8 +848,8 @@ django-allauth = [
     {file = "django-allauth-0.50.0.tar.gz", hash = "sha256:ee3a174e249771caeb1d037e64b2704dd3c56cfec44f2058fae2214b224d35e8"},
 ]
 django-celery-results = [
-    {file = "django_celery_results-2.3.0-py2.py3-none-any.whl", hash = "sha256:37b8734ad0038cdeabe9efb09721dfdbe1ff7bf6e1d81ff3e10a1eb23a2b321f"},
-    {file = "django_celery_results-2.3.0.tar.gz", hash = "sha256:203cf7321081d09be91738aff715c97bcc769db8c727621049e2786118059dac"},
+    {file = "django_celery_results-2.3.1-py3-none-any.whl", hash = "sha256:b8c9416619dbcc38f13398e31bcb1f14a228cd1e8f65fb22d3b7fc68aaa5331a"},
+    {file = "django_celery_results-2.3.1.tar.gz", hash = "sha256:bf24ecc29c42e49cc7eb30b9b3739471331e2a0ca517cc88ca53a0cf3a2031d1"},
 ]
 django-extensions = [
     {file = "django-extensions-3.1.5.tar.gz", hash = "sha256:28e1e1bf49f0e00307ba574d645b0af3564c981a6dfc87209d48cb98f77d0b1a"},
@@ -852,6 +863,10 @@ django-mathfilters = [
     {file = "django-mathfilters-1.0.0.tar.gz", hash = "sha256:c9b892ef6dfc893683e75cfd0279c187a601ca68f4684c38f9da44657fb64b07"},
     {file = "django_mathfilters-1.0.0-py3-none-any.whl", hash = "sha256:64200a21bb249fbf27be601d4bbb788779e09c6e063170c097cd82c4d18ebb83"},
 ]
+django-taggit = [
+    {file = "django-taggit-2.1.0.tar.gz", hash = "sha256:a9f41e4ad58efe4b28d86f274728ee87eb98eeae90c9eb4b4efad39e5068184e"},
+    {file = "django_taggit-2.1.0-py3-none-any.whl", hash = "sha256:61547a23fc99967c9304107414a09e662b459f4163dbbae32e60b8ba40c34d05"},
+]
 djangorestframework = [
     {file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"},
     {file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"},

+ 1 - 0
pyproject.toml

@@ -22,6 +22,7 @@ django-mathfilters = "^1.0.0"
 django-allauth = "^0.50.0"
 django-celery-results = "^2.3.0"
 redis = "^4.2.2"
+django-taggit = "^2.1.0"
 
 [build-system]
 requires = ["poetry-core>=1.0.0"]

+ 1 - 0
search/views.py

@@ -22,5 +22,6 @@ def search(request):
             | Q(genre__name__icontains=query)
             | Q(publisher__name__icontains=query)
             | Q(developer__name__icontains=query)
+            | Q(tags__name__icontains=query)
         ).distinct()
     return render(request, "search/search.html", {"query": query, "results": results})