Mazenbs commited on
Commit
7230c8c
·
verified ·
1 Parent(s): e1a51d7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -30
app.py CHANGED
@@ -1,5 +1,6 @@
1
  # app.py
2
  from fastapi import FastAPI, HTTPException, Query
 
3
  from typing import List, Dict, Optional, Any, Tuple
4
  import json
5
 
@@ -14,6 +15,16 @@ app = FastAPI(
14
  version="2.1.0"
15
  )
16
 
 
 
 
 
 
 
 
 
 
 
17
  class TextResponse(BaseModel):
18
  text: str
19
 
@@ -38,50 +49,66 @@ def validate_ranges(ranges: List[List[int]]) -> List[Tuple[int, int]]:
38
  return validated_ranges
39
 
40
  # -----------------------------
41
- # نقطة النهاية GET
42
  # -----------------------------
43
- @app.get("/extract", response_model=LegalDocumentResponse)
44
- async def extract_text_endpoint(
45
- url: str,
46
- return_parsed: bool = False,
47
- save_to_supabase: bool = False,
48
- timeout: int = 10,
49
- ranges: Optional[str] = Query(None, description="نطاقات الاستخراج كـ JSON string: [[start,end],[start,end]]")
50
- ):
51
  try:
52
- # تحويل ranges من JSON string إلى قائمة
53
- parsed_ranges: Optional[List[List[int]]] = None
54
- if ranges:
55
- try:
56
- parsed_ranges = json.loads(ranges)
57
- except json.JSONDecodeError:
58
- raise HTTPException(status_code=400, detail="تنسيق ranges غير صالح. يجب أن يكون JSON مثل [[0,5],[10,20]]")
59
-
60
- # استخراج النصوص من URL
61
- all_texts = await extract_text_from_url(url, timeout)
62
-
63
- # تطبيق النطاقات إذا وجدت
64
- if parsed_ranges:
65
- validated_ranges = validate_ranges(parsed_ranges)
66
  filtered_texts = clip_by_ranges(all_texts, validated_ranges)
67
  else:
68
  filtered_texts = all_texts
69
 
70
- # تحليل القانون إذا طلب
71
- if return_parsed:
72
  parsed_document = parse_law_from_texts(filtered_texts)
73
- if save_to_supabase:
74
  save_law_to_supabase(parsed_document["law"])
75
  parsed_document["saved_to_db"] = True
76
  else:
77
  parsed_document["saved_to_db"] = False
78
  return LegalDocumentResponse(parsed_document=parsed_document)
79
 
 
80
  return LegalDocumentResponse(raw_texts=filtered_texts)
81
 
82
- except httpx.RequestError as e:
83
- raise HTTPException(status_code=400, detail=f"خطأ في جلب الصفحة: {str(e)}")
84
- except HTTPException:
85
- raise
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  except Exception as e:
87
  raise HTTPException(status_code=500, detail=f"خطأ في معالجة المحتوى: {str(e)}")
 
1
  # app.py
2
  from fastapi import FastAPI, HTTPException, Query
3
+ from pydantic import BaseModel, HttpUrl, Field
4
  from typing import List, Dict, Optional, Any, Tuple
5
  import json
6
 
 
15
  version="2.1.0"
16
  )
17
 
18
+ # -----------------------------
19
+ # نماذج البيانات
20
+ # -----------------------------
21
+ class URLRequest(BaseModel):
22
+ url: HttpUrl
23
+ return_parsed: bool = Field(default=False)
24
+ save_to_supabase: bool = Field(default=False)
25
+ timeout: int = Field(default=10, ge=1, le=60)
26
+ ranges: Optional[List[List[int]]] = None
27
+
28
  class TextResponse(BaseModel):
29
  text: str
30
 
 
49
  return validated_ranges
50
 
51
  # -----------------------------
52
+ # نقطة النهاية POST
53
  # -----------------------------
54
+ @app.post("/extract", response_model=LegalDocumentResponse)
55
+ async def extract_text_endpoint(request: URLRequest):
 
 
 
 
 
 
56
  try:
57
+ # 1) استخراج جميع النصوص
58
+ all_texts = await extract_text_from_url(str(request.url), request.timeout)
59
+
60
+ # 2) تطبيق النطاقات إذا وجدت
61
+ if request.ranges:
62
+ validated_ranges = validate_ranges(request.ranges)
 
 
 
 
 
 
 
 
63
  filtered_texts = clip_by_ranges(all_texts, validated_ranges)
64
  else:
65
  filtered_texts = all_texts
66
 
67
+ # 3) تحليل القانون إذا طلب
68
+ if request.return_parsed:
69
  parsed_document = parse_law_from_texts(filtered_texts)
70
+ if request.save_to_supabase:
71
  save_law_to_supabase(parsed_document["law"])
72
  parsed_document["saved_to_db"] = True
73
  else:
74
  parsed_document["saved_to_db"] = False
75
  return LegalDocumentResponse(parsed_document=parsed_document)
76
 
77
+ # 4) النصوص الخام
78
  return LegalDocumentResponse(raw_texts=filtered_texts)
79
 
80
+ except Exception as e:
81
+ raise HTTPException(status_code=500, detail=f"خطأ في معالجة المحتوى: {str(e)}")
82
+
83
+
84
+ # -----------------------------
85
+ # نقطة النهاية GET
86
+ # -----------------------------
87
+ @app.get("/extract", response_model=LegalDocumentResponse)
88
+ async def extract_text_get(
89
+ url: HttpUrl = Query(..., description="رابط الصفحة لاستخراج النصوص"),
90
+ return_parsed: bool = Query(False, description="تحليل القانون إذا True"),
91
+ save_to_supabase: bool = Query(False, description="حفظ المستند في قاعدة البيانات إذا True"),
92
+ timeout: int = Query(10, ge=1, le=60, description="مهلة الانتظار بالثواني")
93
+ ):
94
+ try:
95
+ # 1) استخراج جميع النصوص
96
+ all_texts = await extract_text_from_url(str(url), timeout)
97
+
98
+ # لا يوجد دعم للنطاقات في GET حالياً، يمكن إضافة لاحقاً إذا أردت
99
+
100
+ # 2) تحليل القانون إذا طلب
101
+ if return_parsed:
102
+ parsed_document = parse_law_from_texts(all_texts)
103
+ if save_to_supabase:
104
+ save_law_to_supabase(parsed_document["law"])
105
+ parsed_document["saved_to_db"] = True
106
+ else:
107
+ parsed_document["saved_to_db"] = False
108
+ return LegalDocumentResponse(parsed_document=parsed_document)
109
+
110
+ # 3) النصوص الخام
111
+ return LegalDocumentResponse(raw_texts=all_texts)
112
+
113
  except Exception as e:
114
  raise HTTPException(status_code=500, detail=f"خطأ في معالجة المحتوى: {str(e)}")