Spaces:
Build error
Build error
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 |