Sustainability and Green Insurance Projects

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:

  1. User: To store customer details.
  2. SustainabilityActivity: To store information about the customer’s sustainable activities.
  3. 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">

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *