# 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

{int(score)}/100

گریڈ | Grade: {grade}

{emoji} {label}

--- ## 📊 تفصیلی سکور | 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 += """ ---

یاد رکھیں | Remember: ہر غلطی سیکھنے کا موقع ہے!
Every mistake is a learning opportunity!

""" return md