Turbiling's picture
Update modules/utils.py
7070e18 verified
Raw
History Blame Contribute Delete
6.64 kB
# 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