File size: 9,108 Bytes
49ee313
2cdce84
 
 
 
49ee313
2cdce84
 
440eaa6
2cdce84
 
 
 
 
 
 
 
5926d3f
 
 
 
 
2cdce84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49ee313
 
440eaa6
 
 
 
 
 
2cdce84
440eaa6
2cdce84
440eaa6
 
 
 
 
 
 
2cdce84
 
 
49ee313
 
 
 
 
2cdce84
 
49ee313
 
 
 
 
 
d0b5db9
 
440eaa6
2cdce84
 
440eaa6
 
 
 
 
 
 
 
 
2cdce84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440eaa6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd93023
 
440eaa6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2cdce84
a16e24c
2cdce84
 
 
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
163
164
165
166
167
168
169
170
171
172
# edit.py
import os
import utils
import streamlit as st
import geopandas as gpd
from streamlit_folium import folium_static
import folium
import time
import pandas as pd

def add_properties(df, col_name, value, field_name):
    if col_name not in df.columns:
        df[col_name] = None
    df.loc[df['name'] == field_name, col_name] = value
    return df

def select_field(gdf):
    st.markdown("""
            <style>
            .stSelectbox > div > div {cursor: pointer;}
            </style>
            """, unsafe_allow_html=True)
    names = gdf['name'].tolist()
    names.append("Select Field")
    field_name = st.selectbox("Select Field", options=names, key="field_name_edit", help="Select the field to edit", index=len(names)-1)
    return field_name

def read_crop_type():
    crop_type = st.text_input("Field Crop*", help="Enter the crop type", key="field_crop", value='')
    return crop_type

def read_irrigation_type():
    irrigation_type = st.selectbox("Field Type*", options=["Rainfed", "Irrigated", ""], key="field_type", help="Select the field type", index=2)
    return irrigation_type

def read_custom_property():
    custom_property_name = st.text_input("Custom Property Name*", help="Enter the custom property name", key="custom_property_name", value='')
    custom_property_value = st.text_input("Custom Property Value*", help="Enter the custom property value", key="custom_property_value", value='', disabled=custom_property_name == "" or custom_property_name == "")
    return custom_property_name, custom_property_value


def edit_fields(current_user):
    # current_user = greeting("Manage your fields")
    fields_file_path = f"fields_{current_user}.parquet"
    history_file_path = f"history_{current_user}.csv"
    
    # Load or initialize the GeoDataFrame for fields
    if os.path.exists(fields_file_path):
        gdf = gpd.read_parquet(fields_file_path)
    else:
        st.info("No fields added yet!")
        return
    
    # Load or initialize the DataFrame for field usage history
    if os.path.exists(history_file_path):
        history_df = pd.read_csv(history_file_path)
    else:
        history_df = pd.DataFrame(columns=['field_name', 'start_date', 'end_date', 'crop', 'irrigation_method'])

    st.info("Hover over the field to show the properties or check the Existing Fields List below")
    field_name = select_field(gdf)
    if field_name == "Select Field":
        fields_map = gdf.explore()
        sat_basemap = utils.basemaps['Google Satellite']
        sat_basemap.add_to(fields_map)
        folium.LayerControl().add_to(fields_map)
        folium_static(fields_map, height=300, width=400)
        st.info("No Field Selected Yet!")
    else:
        fields_map = gdf[gdf['name'] == field_name].explore()
        sat_basemap = utils.basemaps['Google Satellite']
        sat_basemap.add_to(fields_map)
        folium.LayerControl().add_to(fields_map)
        folium_static(fields_map, height=300, width=400)
        st.subheader(f":green[{field_name}]")
        # option_menu = st.radio(f"Please add your {field_name} field information, historical data will help train our AI model", options=["View Field Info", "Add Field Information","Add Field Cultivation History", "Delete"], key="option_menu", help="Select the operation to perform")
        option_menu = st.radio(f"Please add your {field_name} field information, historical data will help refine our AI model recommendations", options=["View Field Info","Add Field Cultivation History", "Delete"], key="option_menu", help="Select the operation to perform")
        if option_menu == "View Field Info":
            field = gdf[gdf['name'] == field_name]
            st.write(field)
            # Deserialize the usage history for display
            if len(history_df)>0:
                st.write("Previous cultivation History:", history_df)
            else:
                st.subheader("No cultivation history added for this field.")

        elif option_menu == "Add Field Information":
         

            no_input = True
            crop_type = read_crop_type()
            irrigation_type = read_irrigation_type()
            custom_property_name, custom_property_value = read_custom_property()
            if crop_type != "" or irrigation_type != "" or custom_property_value != "":
                no_input = False

            submit = st.button("Submit", key="submitProperties", help="Click to Submit Field Information", type="primary",
                                use_container_width=True, disabled=no_input)
            if submit:
                if crop_type != "":
                    gdf = add_properties(gdf, "crop", crop_type, field_name)
                if irrigation_type != "":
                    gdf = add_properties(gdf, "irrigation", irrigation_type, field_name)
                if custom_property_name != "" and custom_property_value != "":
                    gdf = add_properties(gdf, custom_property_name, custom_property_value, field_name)
                gdf.to_parquet(f"fields_{current_user}.parquet")
                st.success("Field Information Updated Successfully!")
                st.info("Please Select View above to see the updated field information")

        elif option_menu == "Add Field Cultivation History":
            with st.form(key='history_form', clear_on_submit=True):
                start_date = st.date_input("Cultivation Start Date", key=f'start_date')
                end_date = st.date_input("Cultivation End Date", key=f'end_date')
                crop_planted = st.selectbox("Type of Crop Planted", [' ', 'Wheat', 'Corn', 'Rice',"other"], index=0)
               
                irrigation_method = st.selectbox("Irrigation Method Used", ['Rainfed', 'Irrigated', " "], index=2)
                submit_history = st.form_submit_button("Submit Crop Cycle")
                if submit_history:
                    # Check that the start date is before the end date
                    if start_date < end_date:
                        # Append new usage entry
                        new_history = {
                            'field_name': field_name,
                            'start_date': str(start_date),
                            'end_date': str(end_date),
                            'crop': crop_planted,
                            'irrigation_method': irrigation_method
                        }
                        # Use concat instead of append
                        history_df = pd.concat([history_df, pd.DataFrame([new_history])], ignore_index=True)
                        history_df.to_csv(history_file_path, index=False)
                        st.success("Field usage history updated successfully!, fill the form again to add another cultivation history" )

                    else:
                        st.write("check the entered dates")

        elif option_menu == "Delete":
            option = st.selectbox("What do you want to delete", options=[f'Delete {field_name} Field', 'Delete a historical entry from the field'])
        
            if option == f"Delete {field_name} Field" :
                delete = st.button("Delete Entire Field", key="delete_field", help="Click to Delete Field", type="primary", use_container_width=True)
                if delete:
                    if len(gdf) == 1 and (gdf['name'] == field_name).all():  # Check if this is the only field left
                        os.remove(fields_file_path)  # Delete the .parquet file if it's the last field
                        if os.path.exists(history_file_path):
                            os.remove(history_file_path)
                        st.success("All fields deleted. The data file has been removed.")
                        time.sleep(0.3)
                        st.rerun()
                    else:
                        gdf = gdf[gdf['name'] != field_name]
                        history_df = history_df[history_df["field_name"] != field_name ]
                        gdf.to_parquet(fields_file_path)
                        history_df.to_csv(history_file_path, index=False)
                        st.success("Field Deleted Successfully!")
                        time.sleep(0.3)
                        st.rerun()
            elif option == "Delete a historical entry from the field":
            # Allow the user to select which historical entry to delete
                idx_history_to_delete = st.selectbox("Select a history to delete, select the index of the entry that you want to delete", options=history_df[history_df['field_name'] == field_name].index)
                if st.button("Confirm Delete Historical Entry", key="delete_history", help="Click to Delete Entry", type="primary", use_container_width=True):
                    history_df.drop(labels=0, axis=0, index=None, columns=None, level=None, inplace=True, errors='raise')
                    history_df.to_csv(history_file_path, index=False)

                    st.success("Entry Deleted Successfully!")
                    time.sleep(0.3)
                    st.rerun()


if __name__ == '__main__':

    edit_fields()