Set Up Your Environment
First, install the necessary libraries using pip
:
bashCopy codepip install flask flask-sqlalchemy flask-wtf flask-login matplotlib
- Flask-SQLAlchemy: For handling database interactions.
- Flask-WTF: For handling forms securely.
- Flask-Login: For user session management.
- Matplotlib: For visualizing user data related to sustainability.
Step 2: Design the Database Models
We’ll create three models:
- User: To store customer details.
- SustainabilityActivity: To store information about the customer’s sustainable activities.
- GreenInsurancePolicy: To store the customer’s eligibility for green insurance policies.
models.py
pythonCopy codefrom flask_sqlalchemy import SQLAlchemy
from datetime import datetime
db = SQLAlchemy()
# User Model
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
sustainability_activities = db.relationship('SustainabilityActivity', backref='user', lazy=True)
green_policy = db.relationship('GreenInsurancePolicy', backref='user', uselist=False)
def __repr__(self):
return f'<User {self.username}>'
# Sustainability Activity Model
class SustainabilityActivity(db.Model):
id = db.Column(db.Integer, primary_key=True)
activity_type = db.Column(db.String(100), nullable=False) # EV usage, renewable energy, etc.
activity_value = db.Column(db.Float, nullable=False) # e.g., KWh of renewable energy used
date = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f'<SustainabilityActivity {self.activity_type} - {self.activity_value}>'
# Green Insurance Policy Model
class GreenInsurancePolicy(db.Model):
id = db.Column(db.Integer, primary_key=True)
policy_type = db.Column(db.String(100), nullable=False) # E.g., EV Insurance, Home Solar Insurance
discount_percentage = db.Column(db.Float, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f'<GreenInsurancePolicy {self.policy_type}>'
Explanation:
- User: Contains the basic details of a customer.
- SustainabilityActivity: Tracks the customer’s sustainable activities, such as energy consumption from renewable sources or the number of miles driven with an electric vehicle.
- GreenInsurancePolicy: Stores the policy type (e.g., a discount for using an electric vehicle) and the discount percentage.
Step 3: Flask Application Setup
Now, let’s create the Flask app with routes for user registration, login, sustainability activity tracking, and displaying the green insurance policy.
app.py
pythonCopy codefrom flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, FloatField, SubmitField
from wtforms.validators import DataRequired, Email
from models import db, User, SustainabilityActivity, GreenInsurancePolicy
from datetime import datetime
import matplotlib.pyplot as plt
import io
import base64
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///green_insurance.db'
db.init_app(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
# User Loader for Flask-Login
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# Forms
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Register')
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
class ActivityForm(FlaskForm):
activity_type = StringField('Activity Type (e.g., EV Usage)', validators=[DataRequired()])
activity_value = FloatField('Activity Value (e.g., KWh or miles)', validators=[DataRequired()])
submit = SubmitField('Submit Activity')
# Routes
@app.route('/')
def index():
return render_template('index.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data, password_hash=form.password.data)
db.session.add(user)
db.session.commit()
flash('Your account has been created!', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and user.password_hash == form.password.data: # You should hash the password in production
login_user(user)
return redirect(url_for('dashboard'))
flash('Login failed. Check your email and/or password.', 'danger')
return render_template('login.html', form=form)
@app.route('/dashboard')
@login_required
def dashboard():
# Fetch user activities and calculate rewards
activities = SustainabilityActivity.query.filter_by(user_id=current_user.id).all()
green_policy = GreenInsurancePolicy.query.filter_by(user_id=current_user.id).first()
# Render activity tracking form
form = ActivityForm()
return render_template('dashboard.html', activities=activities, green_policy=green_policy, form=form)
@app.route('/add_activity', methods=['POST'])
@login_required
def add_activity():
form = ActivityForm()
if form.validate_on_submit():
activity = SustainabilityActivity(
activity_type=form.activity_type.data,
activity_value=form.activity_value.data,
user_id=current_user.id
)
db.session.add(activity)
db.session.commit()
# Check for Green Insurance Policy eligibility
if activity.activity_type.lower() == 'ev usage' and activity.activity_value > 500: # Example threshold
policy = GreenInsurancePolicy.query.filter_by(user_id=current_user.id).first()
if not policy:
policy = GreenInsurancePolicy(policy_type='EV Insurance', discount_percentage=10, user_id=current_user.id)
db.session.add(policy)
db.session.commit()
flash('You are eligible for a Green Insurance policy!', 'success')
flash('Activity recorded!', 'success')
return redirect(url_for('dashboard'))
@app.route('/visualize')
@login_required
def visualize_data():
# Example: Visualizing the user’s sustainability data
activities = SustainabilityActivity.query.filter_by(user_id=current_user.id).all()
labels = [activity.activity_type for activity in activities]
values = [activity.activity_value for activity in activities]
fig, ax = plt.subplots()
ax.bar(labels, values)
# Convert plot to base64 for embedding in HTML
img = io.BytesIO()
fig.savefig(img, format='png')
img.seek(0)
plot_url = base64.b64encode(img.getvalue()).decode()
return render_template('visualization.html', plot_url=plot_url)
if __name__ == '__main__':
app.run(debug=True)
Step 4: Frontend Templates
templates/index.html
– Homepage
htmlCopy code<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
Leave a Reply