Skip to content

Commit ec1b8e1

Browse files
authored
Merge branch 'main' into rollback-to-f3a044c
2 parents f3a044c + 1bbdf6f commit ec1b8e1

35 files changed

+745
-466
lines changed

guessquest/games/admin.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
from django.contrib import admin
2+
from .models import TriviaQuestion
23

34
# Register your models here.
5+
@admin.register(TriviaQuestion)
6+
class TriviaQuestionAdmin(admin.ModelAdmin):
7+
list_display = ('question_text', 'difficulty') # whatever fields you have
8+
search_fields = ('question_text', 'difficulty')
9+

guessquest/games/management/__init__.py

Whitespace-only changes.

guessquest/games/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import time, requests
2+
from django.core.management.base import BaseCommand
3+
from ...models import TriviaQuestion
4+
5+
API_URL = "https://opentdb.com/api.php"
6+
TOTAL = 4516
7+
BATCH_SIZE= 50
8+
9+
class Command(BaseCommand):
10+
help = "Fetch all trivia questions in 50‑question batches"
11+
12+
def handle(self, *args, **opts):
13+
no_new_rounds = 0
14+
while TriviaQuestion.objects.count() < TOTAL and no_new_rounds < 5:
15+
resp = requests.get(API_URL, params={
16+
"amount": BATCH_SIZE,
17+
"type": "multiple",
18+
"encode": "base64" # avoid HTML entities
19+
})
20+
data = resp.json().get("results", [])
21+
new = 0
22+
23+
for item in data:
24+
# decode base64 fields
25+
import base64
26+
def d(s): return base64.b64decode(s).decode()
27+
qtxt = d(item["question"])
28+
if not TriviaQuestion.objects.filter(question_text=qtxt).exists():
29+
TriviaQuestion.objects.create(
30+
question_text = qtxt,
31+
correct_answer = d(item["correct_answer"]),
32+
incorrect_answers = [d(x) for x in item["incorrect_answers"]],
33+
)
34+
new += 1
35+
36+
total = TriviaQuestion.objects.count()
37+
self.stdout.write(f"+{new}{total}/{TOTAL}")
38+
no_new_rounds = no_new_rounds + 1 if new == 0 else 0
39+
time.sleep(1)
40+
41+
self.stdout.write(
42+
self.style.SUCCESS("Done!")
43+
if total >= TOTAL else
44+
self.style.WARNING(f"Stopped at {total}/{TOTAL}")
45+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.20 on 2025-04-13 18:00
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('games', '0002_rename_user_temperaturegamesession_player_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.RenameField(
14+
model_name='temperaturegamesession',
15+
old_name='total_score',
16+
new_name='score',
17+
),
18+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.20 on 2025-04-13 18:22
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('games', '0003_rename_total_score_temperaturegamesession_score'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='temperaturequestion',
15+
name='user_guess',
16+
field=models.FloatField(blank=True, null=True),
17+
),
18+
]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Generated by Django 4.2.20 on 2025-04-18 23:28
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import django.db.models.manager
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('games', '0004_alter_temperaturequestion_user_guess'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='TriviaQuestion',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
],
20+
),
21+
migrations.CreateModel(
22+
name='WeatherLeaderBoard',
23+
fields=[
24+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25+
('score', models.IntegerField()),
26+
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.player')),
27+
],
28+
options={
29+
'ordering': ['-score', 'player_id'],
30+
'abstract': False,
31+
},
32+
managers=[
33+
('top_players', django.db.models.manager.Manager()),
34+
],
35+
),
36+
migrations.CreateModel(
37+
name='TriviaLeaderBoard',
38+
fields=[
39+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40+
('score', models.IntegerField()),
41+
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.player')),
42+
],
43+
options={
44+
'ordering': ['-score', 'player_id'],
45+
'abstract': False,
46+
},
47+
managers=[
48+
('top_players', django.db.models.manager.Manager()),
49+
],
50+
),
51+
migrations.CreateModel(
52+
name='TriviaGameSession',
53+
fields=[
54+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
55+
('score', models.IntegerField(default=0)),
56+
('questions_left', models.IntegerField(default=5)),
57+
('game_status', models.CharField(choices=[('active', 'Active'), ('completed', 'Completed')], default='active', max_length=10)),
58+
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.player')),
59+
],
60+
),
61+
]
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Generated by Django 4.2.20 on 2025-04-19 00:07
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('games', '0005_triviaquestion_weatherleaderboard_trivialeaderboard_and_more'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='triviaquestion',
16+
name='correct_answer',
17+
field=models.CharField(blank=True, max_length=50, null=True),
18+
),
19+
migrations.AddField(
20+
model_name='triviaquestion',
21+
name='difficulty',
22+
field=models.CharField(choices=[('easy', 'Easy'), ('medium', 'Medium'), ('hard', 'Hard')], default='easy', max_length=10),
23+
),
24+
migrations.AddField(
25+
model_name='triviaquestion',
26+
name='game',
27+
field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='games.triviagamesession'),
28+
preserve_default=False,
29+
),
30+
migrations.AddField(
31+
model_name='triviaquestion',
32+
name='incorrect_answers',
33+
field=models.JSONField(blank=True, null=True),
34+
),
35+
migrations.AddField(
36+
model_name='triviaquestion',
37+
name='question_text',
38+
field=models.TextField(default=''),
39+
preserve_default=False,
40+
),
41+
migrations.AddField(
42+
model_name='triviaquestion',
43+
name='question_type',
44+
field=models.CharField(blank=True, choices=[('multiple', 'Multiple Choice'), ('boolean', 'Boolean')], max_length=10, null=True),
45+
),
46+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 4.2.20 on 2025-04-19 00:37
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('games', '0006_triviaquestion_correct_answer_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='triviaquestion',
15+
name='game',
16+
),
17+
]
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Generated by Django 4.2.20 on 2025-04-21 19:18
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('games', '0007_remove_triviaquestion_game'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='weatherleaderboard',
15+
name='player',
16+
),
17+
migrations.RenameField(
18+
model_name='player',
19+
old_name='high_score',
20+
new_name='trivia_high_score',
21+
),
22+
migrations.RemoveField(
23+
model_name='temperaturegamesession',
24+
name='time_created',
25+
),
26+
migrations.RemoveField(
27+
model_name='temperaturequestion',
28+
name='time_created',
29+
),
30+
migrations.RemoveField(
31+
model_name='temperaturequestion',
32+
name='time_limit',
33+
),
34+
migrations.AddField(
35+
model_name='player',
36+
name='weather_high_score',
37+
field=models.FloatField(default=0),
38+
),
39+
migrations.DeleteModel(
40+
name='TriviaLeaderBoard',
41+
),
42+
migrations.DeleteModel(
43+
name='WeatherLeaderBoard',
44+
),
45+
]

0 commit comments

Comments
 (0)