🏡 index : github.com/compromyse/enfold.git

from flask import request, flash, send_from_directory
from flask import Blueprint, render_template, redirect, url_for
from flask_login import login_required, logout_user, current_user
from tinydb import TinyDB
from .models import User

import json
import time
import os

from .modules.interface import Interface
from .job_manager import JobManager

states = Interface().get_states()
act_list = json.loads(open('app/acts.json').read())

job_manager = JobManager()
main = Blueprint('main', __name__)

@main.route('/')
@login_required
def home():
    jobs = job_manager.get_jobs()
    completed_jobs = TinyDB('app/jobs.json').all()
    return render_template('home.html', user=current_user, states=states, acts=act_list, completed_jobs=completed_jobs, jobs=jobs)

@main.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('auth.login'))


@main.route('/create_user', methods=['POST'])
@login_required
def create_user():
    username = request.form.get('username')
    password = request.form.get('password')
    admin = request.form.get('admin')

    if current_user.admin != True:
        flash('Only admin can create new users.', 'error')
        return redirect(url_for('main.home'))

    if not username or not password:
        flash('Username and password required.', 'error')
        return redirect(url_for('main.home'))

    user = User.create(username, password, admin == 'on')
    if user:
        flash(f'User {username} created successfully.', 'success')
    else:
        flash(f'User {username} already exists.', 'error')

    return redirect(url_for('main.home'))

@main.route('/enqueue_job', methods=['POST'])
@login_required
def enqueue_job():
    acts = request.form.getlist('act')
    sections = request.form.get('section', '').split(',')
    state_code = request.form.get('state_code')
    name = request.form.get('name')

    if not sections:
        sections = ''

    job_manager.enqueue_scrape(f'{name} - {time.time_ns()}', acts, sections, state_code)

    flash('Job created.', 'info')
    return redirect(url_for('main.home'))

@main.route('/download/<filename>')
@login_required
def download_output(filename):
    output_dir = os.path.join(os.getcwd(), 'app/outputs')
    return send_from_directory(output_dir, f'{filename}.csv', as_attachment=True)