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