Files changed (1) hide show
  1. app.py +21 -16
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, root_validator
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
- # PERUBAHAN: Mengubah dari nilai tunggal menjadi List untuk mendukung 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
- # PERUBAHAN: Menambahkan validator untuk memastikan panjang list sama
553
- @root_validator
554
- def check_ratings_length_match(cls, values):
555
- """Memastikan jika rating_item_ids ada, rating_values juga ada dan panjangnya sama."""
556
- item_ids = values.get('rating_item_ids')
557
- ratings = values.get('rating_values')
558
-
559
- if item_ids is not None and ratings is not None:
 
 
 
 
 
560
  if len(item_ids) != len(ratings):
561
  raise ValueError('Jumlah item ID rating harus sama dengan jumlah nilai rating.')
562
- elif (item_ids is not None and ratings is None) or \
563
- (item_ids is None and ratings is not None):
564
  raise ValueError('Harap sediakan rating_item_ids dan rating_values secara bersamaan.')
565
-
566
- return values
 
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