File size: 3,934 Bytes
22b3d17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# interface/utils.py
from typing import Tuple, List
import os
from PIL import Image

class InputValidator:
    # Constants for validation
    MAX_QUERY_LENGTH = 500
    MIN_IMAGES = 1
    MAX_IMAGES = 10
    ALLOWED_IMAGE_TYPES = ['.jpg', '.jpeg', '.png']
    MAX_IMAGE_SIZE_MB = 5
    MAX_IMAGE_RESOLUTION = (2048, 2048)
    ALLOWED_FORMATS = ['summary', 'detailed']
    
    @staticmethod
    def validate_inputs(
        query: str,
        constraints: str,
        images: List[str],
        top_k: int,
        report_format: str
    ) -> Tuple[bool, str]:
        """
        Validate all user inputs
        
        Args:
            query: User's query string
            constraints: User's constraints string
            images: List of image paths
            top_k: Number of top results to return
            report_format: Type of report to generate
            
        Returns:
            Tuple(is_valid: bool, error_message: str)
        """
        try:
            # Query validation
            if not query or query.isspace():
                return False, "Query is required"
            if len(query) > InputValidator.MAX_QUERY_LENGTH:
                return False, f"Query too long (max {InputValidator.MAX_QUERY_LENGTH} characters)"
            
            # Images validation
            if not images:
                return False, "At least one image is required"
            if len(images) > InputValidator.MAX_IMAGES:
                return False, f"Too many images. Maximum allowed: {InputValidator.MAX_IMAGES}"
            
            # Process each image
            for img_path in images:
                # File type check
                file_ext = os.path.splitext(img_path)[1].lower()
                if file_ext not in InputValidator.ALLOWED_IMAGE_TYPES:
                    return False, f"Invalid image type: {file_ext}. Allowed types: {', '.join(InputValidator.ALLOWED_IMAGE_TYPES)}"
                
                # File size check
                file_size_mb = os.path.getsize(img_path) / (1024 * 1024)
                if file_size_mb > InputValidator.MAX_IMAGE_SIZE_MB:
                    return False, f"Image too large: {file_size_mb:.1f}MB. Maximum size: {InputValidator.MAX_IMAGE_SIZE_MB}MB"
                
                # Image integrity and resolution check
                try:
                    with Image.open(img_path) as img:
                        img.verify()  # Verify image integrity
                        width, height = img.size
                        if width > InputValidator.MAX_IMAGE_RESOLUTION[0] or height > InputValidator.MAX_IMAGE_RESOLUTION[1]:
                            return False, f"Image resolution too high. Maximum: {InputValidator.MAX_IMAGE_RESOLUTION[0]}x{InputValidator.MAX_IMAGE_RESOLUTION[1]}"
                except Exception as e:
                    return False, f"Invalid or corrupted image: {os.path.basename(img_path)}"
            
            # Top-k validation
            if not isinstance(top_k, int) or top_k < 1:
                return False, "Top-k must be a positive integer"
            if top_k > len(images):
                return False, f"Top-k ({top_k}) cannot be larger than number of images ({len(images)})"
            
            # Report format validation
            if report_format not in InputValidator.ALLOWED_FORMATS:
                return False, f"Invalid report format. Allowed formats: {', '.join(InputValidator.ALLOWED_FORMATS)}"
            
            # Optional constraints validation
            if constraints and len(constraints) > InputValidator.MAX_QUERY_LENGTH:
                return False, f"Constraints too long (max {InputValidator.MAX_QUERY_LENGTH} characters)"
            
            return True, ""
            
        except Exception as e:
            return False, f"Validation error: {str(e)}"

validator = InputValidator()
validate_inputs = validator.validate_inputs