Update app.py
#13
by deacher - opened
app.py
CHANGED
|
@@ -5,7 +5,7 @@ import numpy as np
|
|
| 5 |
import pandas as pd
|
| 6 |
import tensorflow as tf
|
| 7 |
from fastapi import FastAPI, HTTPException, Request
|
| 8 |
-
from pydantic import BaseModel, Field,
|
| 9 |
from typing import List, Optional, Dict
|
| 10 |
from sklearn.preprocessing import LabelEncoder
|
| 11 |
import traceback
|
|
@@ -544,26 +544,32 @@ class RecommendationRequest(BaseModel):
|
|
| 544 |
preferred_categories: Optional[List[str]] = Field(default_factory=list, description="Daftar kategori yang disukai (untuk pengguna baru).")
|
| 545 |
n: int = Field(10, gt=0, le=50, description="Jumlah rekomendasi yang diinginkan.")
|
| 546 |
refresh: bool = Field(False, description="Jika True, paksa buat rekomendasi baru.")
|
| 547 |
-
|
| 548 |
-
#
|
| 549 |
rating_item_ids: Optional[List[str]] = Field(None, description="[Opsional] Daftar ID tempat wisata yang ingin diberi rating.")
|
| 550 |
rating_values: Optional[List[float]] = Field(None, description="[Opsional] Daftar rating yang diberikan (dari 1.0 hingga 5.0).")
|
| 551 |
|
| 552 |
-
#
|
| 553 |
-
@
|
| 554 |
-
def check_ratings_length_match(
|
| 555 |
-
"""
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
|
| 559 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 560 |
if len(item_ids) != len(ratings):
|
| 561 |
raise ValueError('Jumlah item ID rating harus sama dengan jumlah nilai rating.')
|
| 562 |
-
elif
|
| 563 |
-
|
| 564 |
raise ValueError('Harap sediakan rating_item_ids dan rating_values secara bersamaan.')
|
| 565 |
-
|
| 566 |
-
|
|
|
|
| 567 |
|
| 568 |
class Config:
|
| 569 |
schema_extra = {
|
|
@@ -576,7 +582,6 @@ class RecommendationRequest(BaseModel):
|
|
| 576 |
"rating_values": [4.5, 4.3, 5.0]
|
| 577 |
}
|
| 578 |
},
|
| 579 |
-
# Contoh lainnya tetap bisa digunakan
|
| 580 |
}
|
| 581 |
|
| 582 |
# Model Baru untuk Rating dari User
|
|
|
|
| 5 |
import pandas as pd
|
| 6 |
import tensorflow as tf
|
| 7 |
from fastapi import FastAPI, HTTPException, Request
|
| 8 |
+
from pydantic import BaseModel, Field, model_validator
|
| 9 |
from typing import List, Optional, Dict
|
| 10 |
from sklearn.preprocessing import LabelEncoder
|
| 11 |
import traceback
|
|
|
|
| 544 |
preferred_categories: Optional[List[str]] = Field(default_factory=list, description="Daftar kategori yang disukai (untuk pengguna baru).")
|
| 545 |
n: int = Field(10, gt=0, le=50, description="Jumlah rekomendasi yang diinginkan.")
|
| 546 |
refresh: bool = Field(False, description="Jika True, paksa buat rekomendasi baru.")
|
| 547 |
+
|
| 548 |
+
# Field untuk multi-rating
|
| 549 |
rating_item_ids: Optional[List[str]] = Field(None, description="[Opsional] Daftar ID tempat wisata yang ingin diberi rating.")
|
| 550 |
rating_values: Optional[List[float]] = Field(None, description="[Opsional] Daftar rating yang diberikan (dari 1.0 hingga 5.0).")
|
| 551 |
|
| 552 |
+
# PERBAIKAN: Mengganti @root_validator dengan @model_validator
|
| 553 |
+
@model_validator(mode='after')
|
| 554 |
+
def check_ratings_length_match(self) -> 'RecommendationRequest':
|
| 555 |
+
"""
|
| 556 |
+
Memastikan jika rating_item_ids ada, rating_values juga ada dan panjangnya sama.
|
| 557 |
+
Validator ini berjalan setelah validasi field individu selesai.
|
| 558 |
+
"""
|
| 559 |
+
# Akses field langsung dari 'self' bukan dari dictionary 'values'
|
| 560 |
+
item_ids = self.rating_item_ids
|
| 561 |
+
ratings = self.rating_values
|
| 562 |
+
|
| 563 |
+
if item_ids and ratings:
|
| 564 |
+
# Jika keduanya ada, panjangnya harus sama
|
| 565 |
if len(item_ids) != len(ratings):
|
| 566 |
raise ValueError('Jumlah item ID rating harus sama dengan jumlah nilai rating.')
|
| 567 |
+
elif item_ids or ratings:
|
| 568 |
+
# Jika hanya salah satu yang ada (XOR), lempar error
|
| 569 |
raise ValueError('Harap sediakan rating_item_ids dan rating_values secara bersamaan.')
|
| 570 |
+
|
| 571 |
+
# Kembalikan instance model 'self'
|
| 572 |
+
return self
|
| 573 |
|
| 574 |
class Config:
|
| 575 |
schema_extra = {
|
|
|
|
| 582 |
"rating_values": [4.5, 4.3, 5.0]
|
| 583 |
}
|
| 584 |
},
|
|
|
|
| 585 |
}
|
| 586 |
|
| 587 |
# Model Baru untuk Rating dari User
|