Exemple #1
0
def graph_update(account_id=None, start_date=None, end_date=None):
    energy_account = EnergyAccount.query.filter_by(id=account_id).first()

    s_date = try_parsing_date(start_date).date()
    e_date = try_parsing_date(end_date).date()

    result = {
        'production_net_usage_graph':
        energy_account.serialize_charts('production_net_usage_graph', s_date,
                                        e_date),
        'net_usage_separated':
        energy_account.serialize_charts('pge_incoming_outgoing_combined_graph',
                                        s_date,
                                        e_date,
                                        separate=True),
        'cumulative':
        energy_account.serialize_charts('cumulative_usage_graph', s_date,
                                        e_date),
        'comparison_graph':
        energy_account.serialize_charts('comparison_graph', s_date, e_date),
        'comparison_graph_solar':
        energy_account.serialize_charts('comparison_graph_solar', s_date,
                                        e_date)
    }

    return jsonify(result)
Exemple #2
0
def events(page=1):
    """Admin Home Page."""
    breadcrumbs = [('Admin Dashboard', 'dashboard', url_for('admin.events'))]
    heading = 'Admin Dashboard'

    app_events = AppEvent.query.order_by(AppEvent.date_time.desc())

    form = DownloadDataForm()

    if form.validate_on_submit():
        if form.start_date.data:
            session['event_start_date'] = form.start_date.data
        if form.end_date.data:
            session['event_end_date'] = form.end_date.data
        return redirect(url_for('admin.events'))

    app_events = AppEvent.query.filter(
        (AppEvent.date_time <= try_parsing_date(
            session.get('event_end_date', (
                datetime.utcnow() + timedelta(days=1)).strftime('%m/%d/%Y'))))
        & (AppEvent.date_time >= try_parsing_date(
            session.get('event_start_date', (datetime.utcnow() - timedelta(
                days=365)).strftime('%m/%d/%Y'))))).order_by(
                    AppEvent.date_time.desc())

    form.start_date.data = session.get('event_start_date', None)
    form.end_date.data = session.get('event_end_date', None)

    return render_template('admin/events.html',
                           page=page,
                           breadcrumbs=breadcrumbs,
                           heading=heading,
                           app_events=app_events.paginate(page, 10, False),
                           form=form)
Exemple #3
0
def modify_energy_account(account_id=None):
    energy_account = EnergyAccount.query.filter_by(id=account_id).first()
    if request.form.get('nick_name', None):
        energy_account.nick_name = request.form['nick_name']
    if request.form.get('address_one', None):
        energy_account.address_one = request.form['address_one']
    if request.form.get('address_two', None):
        energy_account.address_two = request.form['address_two']
    if request.form.get('city', None):
        energy_account.city = request.form['city']
    if request.form.get('state', None):
        energy_account.state = request.form['state']
    if request.form.get('zip_code', None):
        energy_account.zip_code = request.form['zip_code']
    # energy_account.pge_bulk_id = request.form['pge_bulk_id'] TODO Removed temporarily
    if request.form.get('solar_edge_site_id', None):
        energy_account.solar_edge_site_id = request.form['solar_edge_site_id']
    if request.form.get('solar_edge_api_key', None):
        energy_account.solar_edge_api_key = request.form['solar_edge_api_key']
    if request.form.get('solar_install_date', None) is None:
        energy_account.solar_install_date = None
    else:
        try:
            energy_account.solar_install_date = try_parsing_date(
                request.form['solar_install_date'])
        except:
            flash('Date not a recognized format', 'info')
    db.session.commit()

    result = energy_account.serialize()

    return jsonify(result)
Exemple #4
0
def taskstatus(task_id=None,
               change_status=None,
               start_date=None,
               end_date=None):
    if change_status == "mark_complete":
        celery_task = CeleryTask.query.filter_by(task_id=task_id).first()
        celery_task.task_status = 1
        db.session.commit()
        response = {'response': 'task {} completed'.format(task_id)}
        return jsonify(response)

    if task_id == 'events':
        return current_user.energy_accounts[0].energy_events(
            start_date=try_parsing_date(start_date),
            end_date=try_parsing_date(end_date),
            serialize=True)

    if task_id == "task_check":
        unfinished_tasks = CeleryTask.query.filter(
            (CeleryTask.task_status == 0)
            & (CeleryTask.energy_account_id ==
               current_user.energy_accounts[0].id)).all()

        pending_tasks = []
        for task in unfinished_tasks:
            celery_task = process_xml.AsyncResult(task.task_id)
            print celery_task, str(celery_task.info), celery_task.state
            if (celery_task.state == 'FAILURE') or (celery_task.state
                                                    == 'RETRY'):
                info = str(celery_task.info)
            else:
                info = celery_task.info
            task_dict = {
                'id': task.task_id,
                'info': info,
                'state': celery_task.state
            }
            pending_tasks.append(task_dict)
        print pending_tasks
        return jsonify(pending_tasks=pending_tasks)

    task = process_xml.AsyncResult(task_id)
    if task.state == 'PENDING':

        response = {
            'state': task.state,
            'current': task.info.get('current', 0),
            'total': task.info.get('total', 1),
            'status': 'Pending...'
        }
    elif task.state != 'FAILURE':
        response = {
            'state': task.state,
            'current': task.info.get('current', 0),
            'total': task.info.get('total', 1),
            'status': task.info.get('status', '')
        }
        if 'result' in task.info:
            response['result'] = task.info['result']
    else:
        # something went wrong in the background job
        response = {
            'state': task.state,
            'current': 1,
            'total': 1,
            'status': str(task.info),  # this is the exception raised
        }
    return jsonify(response)
Exemple #5
0
def home(modify=None, id=None):
    breadcrumbs = [('Dashboard', 'dashboard', url_for('dashboard.home'))]
    heading = 'Dashboard'

    start_date = datetime.today().date() - timedelta(days=8)
    end_date = datetime.today().date() - timedelta(days=1)
    """The data for each chart needs to be calculated here, otherwise the calculations
    Are performed for each occurrence of a data set. This also makes the template
    Code Neater"""
    # TODO assumes for now that we want only the first energy account.

    prod_net_usg = current_user.energy_accounts[0].serialize_charts(
        'production_net_usage_graph', start_date, end_date)

    prod_comb = current_user.energy_accounts[0].serialize_charts(
        'pge_incoming_outgoing_combined_graph',
        start_date,
        end_date,
        separate=True)

    financial = current_user.energy_accounts[0].serialize_charts(
        'pge_incoming_outgoing_combined_graph',
        start_date,
        end_date,
        financial=True)

    cumulative = current_user.energy_accounts[0].serialize_charts(
        'cumulative_usage_graph', start_date, end_date)

    comparison_graph = current_user.energy_accounts[0].serialize_charts(
        'comparison_graph', start_date, end_date)

    comparison_graph_solar = current_user.energy_accounts[0].serialize_charts(
        'comparison_graph_solar', start_date, end_date)

    print comparison_graph_solar
    if cumulative:
        financial_cumulative = [
            int(float(x) * 0.23627) for x in cumulative['net_usage']
        ]
        financial_min = round(financial_cumulative[0] * 2, -1) / 2
        financial_max = round(financial_cumulative[-1] * 2, -1) / 2
        financial_step_value = (financial_max - financial_min) / 10
    else:
        financial_min = 0
        financial_max = 100
        financial_step_value = 10

    events = current_user.energy_accounts[0].energy_events(
        start_date, end_date)

    if current_user.energy_accounts[0].solar_install_date:
        solar_install_date = current_user.energy_accounts[
            0].solar_install_date.strftime('%m/%d/%Y')
    else:
        solar_install_date = datetime(year=datetime.now().year, month=1,
                                      day=1).strftime('%m/%d/%Y')

    form = EventAddForm()

    if modify == 'del':
        event = EnergyEvent.query.filter_by(id=id).first()
        db.session.delete(event)
        db.session.commit()
        flash('Energy event deleted', 'info')
        current_user.log_event(info="Energy event deleted")
        return redirect(url_for('dashboard.home'))

    if form.validate_on_submit():
        energy_event = EnergyEvent(
            info=form.info.data,
            date=try_parsing_date(form.date.data),
            event_type=form.event_type.data,
            energy_account_id=current_user.energy_accounts[0].id)
        db.session.add(energy_event)
        db.session.commit()
        flash('New energy event added! ({})'.format(energy_event.info), 'info')
        current_user.log_event(info="Energy event added")
        return redirect(url_for('dashboard.home'))

    return render_template('users/dashboard/home.html',
                           prod_net_usg=prod_net_usg,
                           prod_comb=prod_comb,
                           comparison_graph=comparison_graph,
                           comparison_graph_solar=comparison_graph_solar,
                           financial=financial,
                           financial_min=financial_min,
                           financial_max=financial_max,
                           financial_step_value=financial_step_value,
                           cumulative=cumulative,
                           account_id=current_user.energy_accounts[0].id,
                           solar_install_date=solar_install_date,
                           breadcrumbs=breadcrumbs,
                           heading=heading,
                           events=events,
                           form=form)
Exemple #6
0
def solar_edge(modify=None):
    """Solar Edge API"""
    breadcrumbs = [('Dashboard', 'dashboard', url_for('dashboard.home')),
                   ('Solar Edge', 'bar-chart-o',
                    url_for('dashboard.solar_edge'))]
    heading = 'Solar Electricity Production'
    users = User.query.all()
    users = [(user.id, user.full_name) for user in users]

    if session.get('select_user', None):
        current_user = User.query.filter_by(id=session['select_user']).first()
        energy_account = current_user.energy_accounts[0]
    else:
        energy_account = current_user.energy_accounts[0]

    date_select_form = DateSelectForm(prefix="date_select_form")
    download_data_form = DownloadDataForm(prefix="download_data_form")

    if modify == 'clear':
        session.pop('start_date_se', None)
        session.pop('end_date_se', None)
        session.pop('data_time_unit_se', None)
        session.pop('se_energy_data', None)
        session.pop('se_energy_labels', None)
        return redirect(url_for('dashboard.solar_edge'))

    if modify == 'delete-data':
        session.pop('start_date_se', None)
        energy_account.solar_first_date = None
        energy_account.solar_last_date = None
        session.pop('end_date_se', None)
        session.pop('data_time_unit_se', None)
        session.pop('se_energy_data', None)
        session.pop('se_energy_labels', None)
        SolarEdgeUsagePoint.query.filter_by(
            energy_account_id=energy_account.id).delete()
        db.session.commit()
        return redirect(url_for('dashboard.solar_edge'))
    """Set some default dates if nothing has been entered in the form."""
    if 'start_date_se' in session:
        start_date_se = try_parsing_date(session['start_date_se'])
    else:
        start_date_se = datetime.now() - timedelta(days=1)

    if 'end_date_se' in session:
        end_date_se = try_parsing_date(session['end_date_se'])
    else:
        end_date_se = datetime.now()

    solar_edge_production_graph = energy_account.serialize_charts(
        'solar_edge_production_graph', start_date_se.date(),
        end_date_se.date())

    session['se_energy_data'] = solar_edge_production_graph['se_energy_data']
    session['se_energy_labels'] = solar_edge_production_graph['labels']
    """Load the form data into the session to save user selection"""
    if date_select_form.validate_on_submit():
        session['data_time_unit_se'] = date_select_form.data_time_unit.data
        session['start_date_se'] = date_select_form.start_date.data
        session['end_date_se'] = date_select_form.end_date.data

        try:
            start_date_se = try_parsing_date(session['start_date_se'])
            end_date_se = try_parsing_date(session['end_date_se'])
        except:
            flash('Date entered, not in correct format.', 'info')
            return redirect(url_for('dashboard.solar_edge'))

        return redirect(url_for('dashboard.solar_edge'))

    if download_data_form.validate_on_submit():
        session['start_date_se'] = download_data_form.start_date.data
        session['end_date_se'] = download_data_form.end_date.data

        try:
            start_date_se = try_parsing_date(session['start_date_se'])
            end_date_se = try_parsing_date(session['end_date_se'])
            if end_date_se > datetime.now():
                end_date_se = datetime.now()
        except:
            flash('Date entered, not in correct format.', 'info')
            return redirect(url_for('dashboard.solar_edge'))

        pull_solar_chunks(start_date_se, end_date_se, current_user)

        return redirect(url_for('dashboard.solar_edge'))

    date_select_form.start_date.data = start_date_se.strftime('%m/%d/%Y')
    date_select_form.end_date.data = end_date_se.strftime('%m/%d/%Y')

    return render_template('users/dashboard/solar_edge.html',
                           date_select_form=date_select_form,
                           download_data_form=download_data_form,
                           breadcrumbs=breadcrumbs,
                           heading=heading,
                           users=users)
Exemple #7
0
def charts(modify=None):
    """PGE Electricity Usage Chart"""
    breadcrumbs = [('Dashboard', 'dashboard', url_for('dashboard.home')),
                   ('PGE', 'bar-chart-o', url_for('dashboard.charts'))]
    heading = 'PGE Electricity'

    date_select_form = DateSelectForm(prefix="date_select_form")
    download_data_form = DownloadDataForm(prefix="download_data_form")

    if session.get('select_user', None):
        user = User.query.filter_by(id=session['select_user']).first()
        energy_account = user.energy_accounts[0]
    else:
        energy_account = current_user.energy_accounts[0]

    if modify == 'clear':
        session.pop('start_date_pge', None)
        session.pop('end_date_pge', None)
        session.pop('data_time_unit', None)
        return redirect(url_for('dashboard.charts'))

    if modify == 'delete-data':
        PGEUsagePoint.query.filter_by(
            energy_account_id=current_user.energy_accounts[0].id).delete()
        energy_account.pge_first_date = None
        energy_account.pge_last_date = None
        db.session.commit()
        return redirect(url_for('dashboard.charts'))

    if 'start_date_pge' in session:
        start_date_pge = try_parsing_date(session['start_date_pge'])
    else:
        start_date_pge = datetime.now() - timedelta(days=1)

    if 'end_date_pge' in session:
        end_date_pge = try_parsing_date(session['end_date_pge'])
    else:
        end_date_pge = datetime.now()

    if date_select_form.validate_on_submit():
        session['data_time_unit'] = date_select_form.data_time_unit.data
        session['start_date_pge'] = date_select_form.start_date.data
        session['end_date_pge'] = date_select_form.end_date.data
        start_date_pge = try_parsing_date(session['start_date_pge'])
        end_date_pge = try_parsing_date(session['end_date_pge'])
        return redirect(url_for('dashboard.charts'))

    if download_data_form.validate_on_submit():

        session['start_date_pge'] = download_data_form.start_date.data
        session['end_date_pge'] = download_data_form.end_date.data

        start_date_pge = try_parsing_date(session['start_date_pge'])
        end_date_pge = try_parsing_date(session['end_date_pge'])

        # process_xml.delay(
        #                     energy_account,
        #                     start_date_pge,
        #                     end_date_pge,
        #                     user_id=current_user.id
        #                 )

        pull_chunks(start_date_pge, end_date_pge, current_user)

        flash('Data processing', 'info')
        return redirect(url_for('dashboard.charts'))

    pge_inc_outg_grph = energy_account.serialize_charts(
        'pge_incoming_outgoing_graph', start_date_pge,
        (end_date_pge + timedelta(days=1)))

    pge_inc_outg_grph_combnd = energy_account.serialize_charts(
        'pge_incoming_outgoing_combined_graph', start_date_pge,
        (end_date_pge + timedelta(days=1)))

    date_select_form.start_date.data = start_date_pge.strftime('%m/%d/%Y')
    date_select_form.end_date.data = end_date_pge.strftime('%m/%d/%Y')

    users = User.query.all()
    users = [(user.id, user.full_name) for user in users]

    return render_template('users/dashboard/data_chart.html',
                           breadcrumbs=breadcrumbs,
                           heading=heading,
                           date_select_form=date_select_form,
                           download_data_form=download_data_form,
                           pge_inc_outg_grph=pge_inc_outg_grph,
                           pge_inc_outg_grph_combnd=pge_inc_outg_grph_combnd,
                           start_date=start_date_pge,
                           end_date=end_date_pge,
                           users=users)