Initial working version with minor bugs
This commit is contained in:
parent
f946e4933a
commit
71b3993326
83 changed files with 34485 additions and 173 deletions
0
cards/__init__ .py
Normal file
0
cards/__init__ .py
Normal file
9
cards/admin.py
Normal file
9
cards/admin.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
from django.contrib import admin
|
||||
from .models import CardSet, Deck, Card, Rarity, DeckNameTranslation, CardNameTranslation
|
||||
|
||||
admin.site.register(CardSet)
|
||||
admin.site.register(Deck)
|
||||
admin.site.register(Card)
|
||||
admin.site.register(Rarity)
|
||||
admin.site.register(DeckNameTranslation)
|
||||
admin.site.register(CardNameTranslation)
|
||||
5
cards/apps.py
Normal file
5
cards/apps.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CardsConfig(AppConfig):
|
||||
name = "cards"
|
||||
92
cards/migrations/0001_initial.py
Normal file
92
cards/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
# Generated by Django 5.1.2 on 2025-02-26 08:04
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Card',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('cardnum', models.IntegerField()),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CardSet',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Rarity',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('icons', models.CharField(max_length=64)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CardNameTranslation',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('language', models.CharField(max_length=64)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('card', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='name_translations', to='cards.card')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='card',
|
||||
name='cardset',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='cards', to='cards.cardset'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Deck',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('hex_color', models.CharField(max_length=9)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('cardset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='decks', to='cards.cardset')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='card',
|
||||
name='decks',
|
||||
field=models.ManyToManyField(to='cards.deck'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DeckNameTranslation',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('language', models.CharField(max_length=64)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('deck', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='name_translations', to='cards.deck')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='card',
|
||||
name='rarity',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='cards', to='cards.rarity'),
|
||||
),
|
||||
]
|
||||
0
cards/migrations/__init__.py
Normal file
0
cards/migrations/__init__.py
Normal file
66
cards/models.py
Normal file
66
cards/models.py
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
from django.db import models
|
||||
|
||||
class DeckNameTranslation(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
deck = models.ForeignKey("Deck", on_delete=models.PROTECT, related_name='name_translations')
|
||||
language = models.CharField(max_length=64)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class CardNameTranslation(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
card = models.ForeignKey("Card", on_delete=models.PROTECT, related_name='name_translations')
|
||||
language = models.CharField(max_length=64)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class CardSet(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Deck(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
hex_color = models.CharField(max_length=9)
|
||||
cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='decks')
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Rarity(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
icons = models.CharField(max_length=64)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Card(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=64)
|
||||
decks = models.ManyToManyField("Deck")
|
||||
cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='cards')
|
||||
cardnum = models.IntegerField()
|
||||
rarity = models.ForeignKey(Rarity, on_delete=models.PROTECT, related_name='cards')
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name + " " + self.rarity.icons + " " + self.cardset.name
|
||||
0
cards/templatetags/__init__.py
Normal file
0
cards/templatetags/__init__.py
Normal file
11
cards/templatetags/card_badge.py
Normal file
11
cards/templatetags/card_badge.py
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
from django import template
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.inclusion_tag("includes/card_badge.html")
|
||||
def card_badge(card):
|
||||
return {
|
||||
'card': card,
|
||||
'decks': card.decks.all() if card else None,
|
||||
'dropdown': card is None
|
||||
}
|
||||
48
cards/templatetags/card_multiselect.py
Normal file
48
cards/templatetags/card_multiselect.py
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
from django import template
|
||||
from cards.models import Card
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.inclusion_tag('includes/card_multiselect.html')
|
||||
def card_multiselect(field_name, label, available_cards, placeholder, selected_values=None, cache_timeout=86400, cache_key="available_cards_options"):
|
||||
"""
|
||||
Renders a Select2 field for choosing cards.
|
||||
|
||||
Parameters:
|
||||
- field_name: The name attribute for the select tag.
|
||||
- label: Label text to show above the selector.
|
||||
- available_cards: A queryset or list of card objects that will populate the options.
|
||||
- placeholder: Placeholder text to show in the select.
|
||||
- selected_values: (Optional) A list of selected card IDs (will be compared as strings).
|
||||
- cache_timeout: (Optional) Cache timeout (in seconds) for the options block.
|
||||
- cache_key: (Optional) Cache key—by default both select fields use the same key so that caching is shared.
|
||||
"""
|
||||
if selected_values is None:
|
||||
selected_values = []
|
||||
# Normalize selected_values to strings.
|
||||
selected_values = [str(val) for val in selected_values]
|
||||
|
||||
# --- Available cards for the search form ---
|
||||
available_cards = list(
|
||||
Card.objects.order_by("name", "rarity__pk")
|
||||
.select_related("rarity", "cardset")
|
||||
.prefetch_related("decks")
|
||||
)
|
||||
for card in available_cards:
|
||||
if card.decks.count() == 1:
|
||||
card.style = "background-color: " + card.decks.all()[0].hex_color + "; color: white;"
|
||||
elif card.decks.count() == 2:
|
||||
card.style = "background: linear-gradient(to right, " + card.decks.all()[0].hex_color + ", " + card.decks.all()[1].hex_color + "); color: white;"
|
||||
elif card.decks.count() >= 3:
|
||||
card.style = "background: linear-gradient(to right, " + card.decks.all()[0].hex_color + ", " + card.decks.all()[1].hex_color + ", " + card.decks.all()[2].hex_color + "); color: white;"
|
||||
|
||||
return {
|
||||
'field_name': field_name,
|
||||
'field_id': field_name, # using the name as id for simplicity
|
||||
'label': label,
|
||||
'available_cards': available_cards,
|
||||
'placeholder': placeholder,
|
||||
'selected_values': selected_values,
|
||||
'cache_timeout': cache_timeout,
|
||||
'cache_key': cache_key,
|
||||
}
|
||||
3
cards/tests.py
Normal file
3
cards/tests.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
5
cards/urls.py
Normal file
5
cards/urls.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
from django.urls import path
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
]
|
||||
4
cards/views.py
Normal file
4
cards/views.py
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
from django.views.generic import TemplateView
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.generic import UpdateView, DeleteView, CreateView, ListView, DetailView
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue