diff --git a/__pycache__/seed_data.cpython-311.pyc b/__pycache__/seed_data.cpython-311.pyc new file mode 100644 index 0000000..6bd7068 Binary files /dev/null and b/__pycache__/seed_data.cpython-311.pyc differ diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a636..6e7673c 100644 Binary files a/config/__pycache__/__init__.cpython-311.pyc and b/config/__pycache__/__init__.cpython-311.pyc differ diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce55..82d3a66 100644 Binary files a/config/__pycache__/settings.cpython-311.pyc and b/config/__pycache__/settings.cpython-311.pyc differ diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94..7a26413 100644 Binary files a/config/__pycache__/urls.cpython-311.pyc and b/config/__pycache__/urls.cpython-311.pyc differ diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09..d32e301 100644 Binary files a/config/__pycache__/wsgi.cpython-311.pyc and b/config/__pycache__/wsgi.cpython-311.pyc differ diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b1112..834ea89 100644 Binary files a/core/__pycache__/__init__.cpython-311.pyc and b/core/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392..863d1c7 100644 Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4..82edc20 100644 Binary files a/core/__pycache__/apps.cpython-311.pyc and b/core/__pycache__/apps.cpython-311.pyc differ diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf223..3b7e6d4 100644 Binary files a/core/__pycache__/context_processors.cpython-311.pyc and b/core/__pycache__/context_processors.cpython-311.pyc differ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640..93b9855 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659..668fb67 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd6..a6e696f 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/admin.py b/core/admin.py index 8c38f3f..61d0fb0 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,22 @@ from django.contrib import admin +from .models import Level, Question, Option, Score -# Register your models here. +class OptionInline(admin.TabularInline): + model = Option + extra = 4 + +class QuestionAdmin(admin.ModelAdmin): + inlines = [OptionInline] + list_display = ('text', 'level', 'points', 'time_limit') + list_filter = ('level',) + +class LevelAdmin(admin.ModelAdmin): + list_display = ('title', 'order') + +class ScoreAdmin(admin.ModelAdmin): + list_display = ('player_name', 'score', 'level', 'date_played') + list_filter = ('level', 'date_played') + +admin.site.register(Level, LevelAdmin) +admin.site.register(Question, QuestionAdmin) +admin.site.register(Score, ScoreAdmin) \ No newline at end of file diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..8e06875 --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,72 @@ +# Generated by Django 5.2.7 on 2026-02-20 16:10 + +import django.db.models.deletion +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Level', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200, verbose_name='Մակարդակ')), + ('description', models.TextField(blank=True, verbose_name='Նկարագրություն')), + ('order', models.IntegerField(default=0, verbose_name='Հերթականություն')), + ], + options={ + 'verbose_name': 'Մակարդակ', + 'verbose_name_plural': 'Մակարդակներ', + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField(verbose_name='Հարց')), + ('points', models.IntegerField(default=10, verbose_name='Միավորներ')), + ('time_limit', models.IntegerField(default=30, verbose_name='Ժամանակ (վայրկյան)')), + ('level', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='core.level', verbose_name='Մակարդակ')), + ], + options={ + 'verbose_name': 'Հարց', + 'verbose_name_plural': 'Հարցեր', + }, + ), + migrations.CreateModel( + name='Option', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(max_length=500, verbose_name='Տարբերակ')), + ('is_correct', models.BooleanField(default=False, verbose_name='Ճիշտ է')), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='core.question', verbose_name='Հարց')), + ], + options={ + 'verbose_name': 'Տարբերակ', + 'verbose_name_plural': 'Տարբերակներ', + }, + ), + migrations.CreateModel( + name='Score', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('player_name', models.CharField(max_length=100, verbose_name='Խաղացող')), + ('score', models.IntegerField(verbose_name='Միավոր')), + ('date_played', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Ամսաթիվ')), + ('level', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.level', verbose_name='Մակարդակ')), + ], + options={ + 'verbose_name': 'Արդյունք', + 'verbose_name_plural': 'Արդյունքներ', + 'ordering': ['-score', '-date_played'], + }, + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000..99f00c5 Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8..cd7d6ba 100644 Binary files a/core/migrations/__pycache__/__init__.cpython-311.pyc and b/core/migrations/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 71a8362..5397e20 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,54 @@ from django.db import models +from django.utils import timezone -# Create your models here. +class Level(models.Model): + title = models.CharField(max_length=200, verbose_name="Մակարդակ") + description = models.TextField(blank=True, verbose_name="Նկարագրություն") + order = models.IntegerField(default=0, verbose_name="Հերթականություն") + + def __str__(self): + return self.title + + class Meta: + verbose_name = "Մակարդակ" + verbose_name_plural = "Մակարդակներ" + ordering = ['order'] + +class Question(models.Model): + level = models.ForeignKey(Level, on_delete=models.CASCADE, related_name="questions", verbose_name="Մակարդակ") + text = models.TextField(verbose_name="Հարց") + points = models.IntegerField(default=10, verbose_name="Միավորներ") + time_limit = models.IntegerField(default=30, verbose_name="Ժամանակ (վայրկյան)") + + def __str__(self): + return self.text[:50] + + class Meta: + verbose_name = "Հարց" + verbose_name_plural = "Հարցեր" + +class Option(models.Model): + question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="options", verbose_name="Հարց") + text = models.CharField(max_length=500, verbose_name="Տարբերակ") + is_correct = models.BooleanField(default=False, verbose_name="Ճիշտ է") + + def __str__(self): + return self.text + + class Meta: + verbose_name = "Տարբերակ" + verbose_name_plural = "Տարբերակներ" + +class Score(models.Model): + player_name = models.CharField(max_length=100, verbose_name="Խաղացող") + score = models.IntegerField(verbose_name="Միավոր") + level = models.ForeignKey(Level, on_delete=models.CASCADE, verbose_name="Մակարդակ") + date_played = models.DateTimeField(default=timezone.now, verbose_name="Ամսաթիվ") + + def __str__(self): + return f"{self.player_name} - {self.score}" + + class Meta: + verbose_name = "Արդյունք" + verbose_name_plural = "Արդյունքներ" + ordering = ['-score', '-date_played'] \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..43761b0 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,122 @@ +{% load static %} - - + - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {{ title|default:"Իմ հայրենիք" }} + + + + + + {% block extra_css %}{% endblock %} - - {% block content %}{% endblock %} - + - + {% block content %}{% endblock %} + + + + + {% block extra_js %}{% endblock %} + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..efcfee9 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,67 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Իմ Հայրենիք

+

Ինտելեկտուալ խաղ Հայաստանի, մշակույթի և պատմության մասին

+
+
+
+ +
+
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
+ + +
+

Ընտրեք մակարդակը

+
+ {% for level in levels %} +
+
+
+

{{ level.title }}

+

{{ level.description }}

+ +
+
+
+ {% empty %} +
+

Մակարդակներ դեռ չկան: Խնդրում ենք ավելացնել Ադմինի միջոցով:

+ Ավելացնել մակարդակ +
+ {% endfor %} +
+ +
+
+
+

Ինչո՞ւ խաղալ

+
    +
  • ✅ Սովորիր նոր փաստեր հայրենիքիդ մասին
  • +
  • ✅ Մրցիր ընկերներիդ հետ
  • +
  • ✅ Բարելավիր գիտելիքներդ
  • +
  • ✅ Զվարճացիր և հաղթիր
  • +
+
+
+ Armenia +
+
+
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file +{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/templates/core/leaderboard.html b/core/templates/core/leaderboard.html new file mode 100644 index 0000000..f28b2be --- /dev/null +++ b/core/templates/core/leaderboard.html @@ -0,0 +1,46 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+

Լավագույն 10 Խաղացողները

+ +
+
+ + + + + + + + + + + + {% for score in top_scores %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
#ԽաղացողՄիավորՄակարդակԱմսաթիվ
{{ forloop.counter }}{{ score.player_name }}{{ score.score }}{{ score.level.title }}{{ score.date_played|date:"d.m.Y" }}
Արդյունքներ դեռ չկան: Եղիր առաջինը!
+
+
+ + +
+
+
+{% endblock %} diff --git a/core/templates/core/quiz.html b/core/templates/core/quiz.html new file mode 100644 index 0000000..d620417 --- /dev/null +++ b/core/templates/core/quiz.html @@ -0,0 +1,216 @@ +{% extends 'base.html' %} +{% load static %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+
+
+ + +
+
+ Հարց 1 / 10 + Միավորներ: 0 +
+ +
30
+ +

Բեռնում...

+ +
+ +
+
+ + +
+

Խաղն ավարտվեց:

+
+

Շնորհավորում ենք, :

+

0

+

ընդհանուր միավոր

+
+ +
+
+
+{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..7743aee 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,9 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.index, name='index'), + path('quiz//', views.quiz_view, name='quiz'), + path('submit_score/', views.submit_score, name='submit_score'), + path('leaderboard/', views.leaderboard, name='leaderboard'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..84c4ba4 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,70 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone - - -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() +import json +from django.shortcuts import render, get_object_or_404, redirect +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from .models import Level, Question, Option, Score +def index(request): + levels = Level.objects.all() context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + 'levels': levels, + 'title': 'Իմ հայրենիք - Գլխավոր', } - return render(request, "core/index.html", context) + return render(request, 'core/index.html', context) + +def quiz_view(request, level_id): + level = get_object_or_404(Level, id=level_id) + questions = level.questions.all() + + # Shuffle or select specific questions if needed + question_data = [] + for q in questions: + options = [] + for opt in q.options.all(): + options.append({ + 'id': opt.id, + 'text': opt.text, + 'is_correct': opt.is_correct + }) + question_data.append({ + 'id': q.id, + 'text': q.text, + 'points': q.points, + 'time_limit': q.time_limit, + 'options': options + }) + + context = { + 'level': level, + 'questions_json': json.dumps(question_data), + 'title': f'Իմ հայրենիք - {level.title}', + } + return render(request, 'core/quiz.html', context) + +@csrf_exempt +def submit_score(request): + if request.method == 'POST': + try: + data = json.loads(request.body) + player_name = data.get('player_name', 'Անանուն') + score_value = data.get('score', 0) + level_id = data.get('level_id') + + level = Level.objects.get(id=level_id) + score_obj = Score.objects.create( + player_name=player_name, + score=score_value, + level=level + ) + return JsonResponse({'status': 'success', 'score_id': score_obj.id}) + except Exception as e: + return JsonResponse({'status': 'error', 'message': str(e)}, status=400) + return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=405) + +def leaderboard(request): + top_scores = Score.objects.all()[:10] + context = { + 'top_scores': top_scores, + 'title': 'Իմ հայրենիք - Լավագույնները', + } + return render(request, 'core/leaderboard.html', context) \ No newline at end of file