""" Location evaluation_value に基づく処理ロジック evaluation_value の値に応じた処理を定義: - 0: 通常ポイント (通常のチェックイン) - 1: 写真撮影 + 買い物ポイント - 2: QRコードスキャン + クイズ回答 """ from django.utils.translation import gettext_lazy as _ class LocationInteractionType: """ロケーションインタラクションタイプの定数""" NORMAL_CHECKIN = "0" PHOTO_SHOPPING = "1" QR_QUIZ = "2" CHOICES = [ (NORMAL_CHECKIN, _("通常ポイント")), (PHOTO_SHOPPING, _("写真撮影 + 買い物ポイント")), (QR_QUIZ, _("QRコードスキャン + クイズ回答")), ] def get_interaction_type(location): """ Locationオブジェクトから適切なインタラクションタイプを取得 Args: location: Locationモデルのインスタンス Returns: dict: インタラクション情報 """ evaluation_value = location.evaluation_value or "0" interaction_info = { 'type': evaluation_value, 'requires_photo': False, 'requires_qr_code': False, 'point_type': 'checkin', 'description': '', 'instructions': '', } if evaluation_value == LocationInteractionType.NORMAL_CHECKIN: interaction_info.update({ 'point_type': 'checkin', 'description': '通常のチェックイン', 'instructions': 'この場所でチェックインしてポイントを獲得してください', }) elif evaluation_value == LocationInteractionType.PHOTO_SHOPPING: interaction_info.update({ 'requires_photo': True, 'point_type': 'buy', 'description': '写真撮影 + 買い物ポイント', 'instructions': '商品の写真を撮影してください。買い物をすることでポイントを獲得できます', }) elif evaluation_value == LocationInteractionType.QR_QUIZ: interaction_info.update({ 'requires_qr_code': True, 'point_type': 'quiz', 'description': 'QRコードスキャン + クイズ回答', 'instructions': 'QRコードをスキャンしてクイズに答えてください', }) else: # 未知の値の場合はデフォルト処理 interaction_info.update({ 'point_type': 'checkin', 'description': '通常のチェックイン', 'instructions': 'この場所でチェックインしてポイントを獲得してください', }) return interaction_info def should_use_qr_code(location): """ ロケーションでQRコードを使用すべきかを判定 Args: location: Locationモデルのインスタンス Returns: bool: QRコード使用フラグ """ # use_qr_codeフラグが設定されている場合、またはevaluation_value=2の場合 return (getattr(location, 'use_qr_code', False) or location.evaluation_value == LocationInteractionType.QR_QUIZ) def get_point_calculation(location, interaction_result=None): """ ロケーションでのポイント計算 Args: location: Locationモデルのインスタンス interaction_result: インタラクション結果 (写真、クイズ回答など) Returns: dict: ポイント情報 """ evaluation_value = location.evaluation_value or "0" base_checkin_point = location.checkin_point or 10 buy_point = location.buy_point or 0 point_info = { 'points_awarded': 0, 'point_type': 'checkin', 'bonus_applied': False, 'message': '', } if evaluation_value == LocationInteractionType.NORMAL_CHECKIN: # 通常ポイント point_info.update({ 'points_awarded': base_checkin_point, 'point_type': 'checkin', 'message': f'チェックインポイント {base_checkin_point}pt を獲得しました!', }) elif evaluation_value == LocationInteractionType.PHOTO_SHOPPING: # 写真撮影 + 買い物ポイント total_points = base_checkin_point + buy_point point_info.update({ 'points_awarded': total_points, 'point_type': 'buy', 'bonus_applied': True, 'message': f'写真撮影ボーナス込みで {total_points}pt を獲得しました! (基本: {base_checkin_point}pt + ボーナス: {buy_point}pt)', }) elif evaluation_value == LocationInteractionType.QR_QUIZ: # QRクイズの場合、正答によってポイントが変わる if interaction_result and interaction_result.get('quiz_correct', False): bonus_points = 20 # クイズ正答ボーナス total_points = base_checkin_point + bonus_points point_info.update({ 'points_awarded': total_points, 'point_type': 'quiz', 'bonus_applied': True, 'message': f'クイズ正答ボーナス込みで {total_points}pt を獲得しました! (基本: {base_checkin_point}pt + ボーナス: {bonus_points}pt)', }) else: # 不正解またはクイズ未実施 point_info.update({ 'points_awarded': base_checkin_point, 'point_type': 'checkin', 'message': f'基本ポイント {base_checkin_point}pt を獲得しました', }) return point_info def validate_interaction_requirements(location, request_data): """ インタラクション要件の検証 Args: location: Locationモデルのインスタンス request_data: リクエストデータ Returns: dict: 検証結果 """ evaluation_value = location.evaluation_value or "0" validation_result = { 'valid': True, 'errors': [], 'warnings': [], } if evaluation_value == LocationInteractionType.PHOTO_SHOPPING: # 写真が必要 if not request_data.get('photo'): validation_result['valid'] = False validation_result['errors'].append('写真の撮影が必要です') elif evaluation_value == LocationInteractionType.QR_QUIZ: # QRコードスキャンとクイズ回答が必要 if not request_data.get('qr_code_data'): validation_result['valid'] = False validation_result['errors'].append('QRコードのスキャンが必要です') if not request_data.get('quiz_answer'): validation_result['valid'] = False validation_result['errors'].append('クイズの回答が必要です') return validation_result