File size: 4,916 Bytes
7be6dc6
8f4d406
 
2ee470b
8f4d406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7be6dc6
8f4d406
 
 
 
7be6dc6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f4d406
 
 
 
 
 
 
 
 
 
 
 
 
033af54
8f4d406
 
 
 
 
 
7be6dc6
8f4d406
d38f151
033af54
d38f151
7be6dc6
 
8f4d406
 
 
 
 
 
 
 
 
 
 
7be6dc6
8f4d406
 
 
 
 
 
 
 
 
 
 
 
 
d38f151
 
 
8f4d406
 
 
 
 
 
 
 
 
 
 
 
 
 
7be6dc6
 
d38f151
e3d2211
 
 
7be6dc6
2ee470b
 
 
 
 
 
7be6dc6
 
2ee470b
ed946ba
8f4d406
7be6dc6
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
from flask import Flask, render_template, request, jsonify, Response
import requests
from bs4 import BeautifulSoup
from flask import stream_with_context

app = Flask(__name__)

# Internal mapping of crops to pests (for the form)
CROP_TO_PESTS = {
    "Sorgum": ["FallArmyWorm"],
    "Maize": ["FallArmyWorm"],
    "Rice": ["Blast", "GallMidge", "YSB", "PlantHopper", "BlueBeetle", "BacterialLeafBlight"],
    "Cotton": ["Thrips", "Whitefly", "PinkBollworm", "Jassid", "BollRot", "AmericanBollworm"],
    "Soybean": ["Girdlebeetle", "H.armigera", "Semilooper", "Spodoptera", "StemFLy"],
    "Tur": ["Wilt", "Webbed_Leaves", "Pod_damage"],
    "Sugarcane": ["FallArmyGrub", "WhiteGrub"],
    "Gram": ["H.armigera", "Wilt"]
}

# Fixed year options for the form
YEARS = ["2024-25", "2023-24", "2022-23", "2021-22"]

# Map our internal crop names to the external page's crop values.
CROP_MAPPING = {
    "Cotton": "1",
    "Gram": "4",
    "Maize": "7",
    "Rice": "3",
    "Sorghum": "6",
    "Soybean": "2",
    "Sugarcane": "8",
    "Tur": "5",
    "Sorgum": "6"  # Adjust if needed
}

# Map our internal pest names to external page values per crop.
PEST_MAPPING = {
    "Cotton": {
        "FallArmyWorm": "71"
    },
    "Gram": {
        "H.armigera": "72",
        "Wilt": "73"
    },
    "Maize": {
        "FallArmyWorm": "74"
    },
    "Rice": {
        "Blast": "75",
        "GallMidge": "76",
        "YSB": "77",
        "PlantHopper": "78",
        "BlueBeetle": "79",
        "BacterialLeafBlight": "80"
    },
    "Soybean": {
        "Girdlebeetle": "81",
        "H.armigera": "82",
        "Semilooper": "83",
        "Spodoptera": "84",
        "StemFLy": "85"
    },
    "Tur": {
        "Wilt": "86",
        "Webbed_Leaves": "87",
        "Pod_damage": "88"
    },
    "Sugarcane": {
        "FallArmyGrub": "89",
        "WhiteGrub": "90"
    },
    "Sorgum": {
        "FallArmyWorm": "91"
    }
}

# Parameter codes and labels for the final image URL
PARAMS = {
    "Mint": "Min Temperature",
    "Maxt": "Max Temperature",
    "RH": "Relative Humidity",
    "RF": "Rainfall",
    "PR": "Pest Report"
}

@app.route('/')
def index():
    # Read query parameters (if provided)
    crop = request.args.get('crop', '')
    pest = request.args.get('pest', '')
    year = request.args.get('year', '')
    week = request.args.get('week', '')
    param = request.args.get('param', '')

    image_url = ""
    if crop and pest and year and week and param:
        # Build the external image URL (using HTTP)
        base_url = f"http://www.icar-crida.res.in:8080/naip/gisimages/{crop}/{year}/{pest}_"
        external_image_url = f"{base_url}{param}{week}.jpg"
        # Instead of using the external HTTP URL directly, we build our proxy URL
        image_url = f"/proxy-image?url={external_image_url}"

    return render_template('index.html',
                           crops=list(CROP_TO_PESTS.keys()),
                           crop_to_pests=CROP_TO_PESTS,
                           years=YEARS,
                           params=PARAMS,
                           selected_crop=crop,
                           selected_pest=pest,
                           selected_year=year,
                           selected_week=week,
                           selected_param=param,
                           image_url=image_url)

@app.route('/fetch_weeks')
def fetch_weeks():
    crop = request.args.get('crop', '')
    pest = request.args.get('pest', '')
    year = request.args.get('year', '')

    ext_crop = CROP_MAPPING.get(crop, '')
    ext_pest = ""
    if crop in PEST_MAPPING and pest in PEST_MAPPING[crop]:
        ext_pest = PEST_MAPPING[crop][pest]

    payload = {
        "country": ext_crop,
        "city": ext_pest,
        "sowing": year
    }

    weeks = []
    try:
        response = requests.get("http://www.icar-crida.res.in:8080/naip/gismaps.jsp", params=payload, timeout=10)
        soup = BeautifulSoup(response.text, 'html.parser')
        week_options = soup.select('select[name="week"] option')
        weeks = [opt.get('value') for opt in week_options if opt.get('value') and "Select" not in opt.get('value')]
        if not weeks:
            weeks = [str(i) for i in range(1, 53)]
    except Exception as e:
        weeks = [str(i) for i in range(1, 53)]
    return jsonify({"weeks": weeks})

@app.route('/proxy-image')
def proxy_image():
    external_url = request.args.get('url')
    if not external_url:
        return "Missing URL", 400

    try:
        # Use streaming so that the response is sent in chunks
        resp = requests.get(external_url, timeout=10, stream=True)
        return Response(
            stream_with_context(resp.iter_content(chunk_size=1024)),
            mimetype=resp.headers.get('Content-Type', 'image/jpeg')
        )
    except Exception as e:
        return str(e), 500
        

if __name__ == '__main__':
    app.run(debug=True)