File size: 6,642 Bytes
f6b9117
 
 
 
 
 
 
 
7070e18
f6b9117
 
 
 
 
 
 
 
 
7070e18
f6b9117
7070e18
f6b9117
7070e18
f6b9117
 
7070e18
f6b9117
7070e18
f6b9117
7070e18
f6b9117
7070e18
f6b9117
7070e18
f6b9117
7070e18
 
 
 
 
 
 
 
f6b9117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7070e18
f6b9117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7070e18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f6b9117
 
 
 
 
7070e18
f6b9117
 
 
 
 
 
7070e18
f6b9117
 
 
 
 
7070e18
f6b9117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# modules/utils.py

import logging
from typing import Optional

logger = logging.getLogger(__name__)


def validate_inputs(student_name: str, essay_text: str, essay_file) -> Optional[str]:
    if not student_name or not student_name.strip():
        return "❌ طالب علم کا نام درکار ہے | Student name is required"
    
    if not essay_text and essay_file is None:
        return "❌ مضمون درکار ہے (فائل یا متن) | Essay is required (file or text)"
    
    return None


def get_performance_label(score: int) -> tuple:
    """
    Get performance label and color based on score
    
    Returns: (label, color, emoji)
    """
    if score >= 90:
        return ("Exceptional", "🟢", "🏆")
    elif score >= 80:
        return ("Excellent", "🟢", "⭐")
    elif score >= 70:
        return ("Very Good", "🟡", "👍")
    elif score >= 60:
        return ("Good", "🟡", "✓")
    elif score >= 50:
        return ("Pass", "🟠", "📝")
    else:
        return ("Needs Improvement", "🔴", "💪")


def format_results(student_name: str, grade_level: int, essay_type: str, result: dict, word_count: int) -> str:
    score = result['total_score']
    grade = result['grade']
    
    label, color, emoji = get_performance_label(score)
    
    md = f"""
# {color} جانچ کے نتائج | Grading Results

---

## 📋 طالب علم کی تفصیلات | Student Details

| معلومات | تفصیل |
|---------|-------|
| **نام** \| **Name** | {student_name} |
| **جماعت** \| **Grade** | {grade_level} |
| **مضمون کی قسم** \| **Essay Type** | {essay_type} |
| **الفاظ** \| **Words** | {word_count} |

---

## 🎯 کل نمبر | Total Score

<div style="text-align: center; padding: 30px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; color: white; margin: 20px 0;">
    <h1 style="font-size: 64px; margin: 10px 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">{int(score)}/100</h1>
    <h2 style="margin: 10px 0; font-size: 36px;">گریڈ | Grade: {grade}</h2>
    <p style="font-size: 24px; margin: 10px 0;">{emoji} {label}</p>
</div>

---

## 📊 تفصیلی سکور | Detailed Scores

| شعبہ \| Category | نمبر \| Score | زیادہ سے زیادہ \| Max | فیصد \| % |
|-----------------|--------------|----------------------|----------|
| **مواد اور استدلال** \| **Content & Arguments** | {result['scores']['content']} | 40 | {(result['scores']['content']/40*100):.1f}% |
| **تنظیم اور ساخت** \| **Organization** | {result['scores']['organization']} | 20 | {(result['scores']['organization']/20*100):.1f}% |
| **زبان اور اسلوب** \| **Language & Style** | {result['scores']['language']} | 20 | {(result['scores']['language']/20*100):.1f}% |
| **گرامر اور املا** \| **Grammar & Spelling** | {result['scores']['grammar']} | 20 | {(result['scores']['grammar']/20*100):.1f}% |

---
"""
    
    # Structure Analysis
    if 'structure_analysis' in result:
        struct = result['structure_analysis']
        md += "\n## 🏗️ ساخت کا تجزیہ | Structure Analysis\n\n"
        
        md += f"- **تعارف | Introduction**: {'✅ موجود' if struct.get('has_introduction') else '❌ غائب'}\n"
        md += f"- **باڈی پیراگرافس | Body Paragraphs**: {struct.get('body_paragraphs_count', 0)} "
        if struct.get('body_paragraphs_count', 0) < 2:
            md += "⚠️ (کم از کم 2 چاہیے | Need at least 2)\n"
        else:
            md += "✅\n"
        md += f"- **منتقلی | Transitions**: {'✅ اچھی' if struct.get('has_transitions') else '❌ کمزور'}\n"
        md += f"- **اختتام | Conclusion**: {'✅ موجود' if struct.get('has_conclusion') else '❌ غائب'}\n\n"
        
        if struct.get('structure_feedback'):
            md += f"**رائے | Feedback**: {struct['structure_feedback']}\n\n---\n"
    
    md += "\n## ✅ طاقتوں کے پہلو | Strengths\n\n"
    
    strengths = result.get('strengths', [])
    if strengths:
        for i, strength in enumerate(strengths, 1):
            md += f"{i}. {strength}\n"
    else:
        md += "*کوئی خاص طاقت نوٹ نہیں کی گئی*\n"
    
    md += "\n---\n\n## ⚠️ بہتری کے شعبے | Areas for Improvement\n\n"
    
    weaknesses = result.get('weaknesses', [])
    if weaknesses:
        for i, weakness in enumerate(weaknesses, 1):
            md += f"### {i}. {weakness.get('issue', 'مسئلہ')}\n\n"
            if 'example' in weakness and weakness['example']:
                md += f"**مثال | Example**: {weakness['example']}\n\n"
            if 'suggestion' in weakness and weakness['suggestion']:
                md += f"**💡 تجویز | Suggestion**: {weakness['suggestion']}\n\n"
    else:
        md += "*بہترین کارکردگی!*\n\n"
    
    grammar_errors = result.get('grammar_errors', [])
    if grammar_errors and len(grammar_errors) > 0:
        md += "\n---\n\n## 📝 گرامر کی غلطیاں | Grammar Errors\n\n"
        for i, error in enumerate(grammar_errors[:5], 1):
            md += f"{i}. ❌ **{error.get('error', '')}** → ✅ **{error.get('correction', '')}**\n"
            if 'explanation' in error and error['explanation']:
                md += f"   - *{error['explanation']}*\n"
    
    spelling_errors = result.get('spelling_errors', [])
    if spelling_errors and len(spelling_errors) > 0:
        md += "\n---\n\n## 🔤 املا کی غلطیاں | Spelling Errors\n\n"
        for i, error in enumerate(spelling_errors[:5], 1):
            md += f"{i}. ❌ **{error.get('error', '')}** → ✅ **{error.get('correction', '')}**\n"
    
    suggestions = result.get('improvement_suggestions', [])
    if suggestions and len(suggestions) > 0:
        md += "\n---\n\n## 💡 بہتری کی تجاویز | Improvement Suggestions\n\n"
        for i, suggestion in enumerate(suggestions, 1):
            md += f"{i}. {suggestion}\n"
    
    overall_feedback = result.get('overall_feedback', '')
    if overall_feedback:
        md += f"\n---\n\n## 💬 مجموعی تبصرہ | Overall Feedback\n\n{overall_feedback}\n"
    
    md += """
---

<div style="text-align: center; padding: 15px; background-color: #f0f9ff; border-radius: 10px; border-left: 4px solid #3b82f6;">
    <p style="margin: 5px 0; color: #1e40af;">
        <strong>یاد رکھیں | Remember:</strong> ہر غلطی سیکھنے کا موقع ہے!<br>
        Every mistake is a learning opportunity!
    </p>
</div>
"""
    
    return md