Snippets

David Macias sqlalchemy average

Created by David Macias
from app import db
from sqlalchemy.sql import func
from datetime import datetime
import redis
import rq

...

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sid = db.Column(db.String(120))
    status = db.Column(db.String(32))
    sequence = db.Column(db.Integer)
    recording = db.Column(db.String(120))
    recordingDuration = db.Column(db.Integer)
    created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    job_id = db.Column(db.Integer, db.ForeignKey('job.id'))

    def __repr__(self):
        return '<Event {}>'.format(self.status)

    def longestCall():
        longestCall = db.session.query(func.max(Event.recordingDuration)).first()
        return longestCall

    def shortestCall():
        shortestCall = db.session.query(func.min(Event.recordingDuration)).first()
        return shortestCall

    def avgCall():
        avgCall = db.session.query(func.avg(Event.recordingDuration))
        print(avgCall)
        # avgCall = int(avgCall)
        return avgCall

    def initiateCount():
        initiateCount = db.session.query(func.count(Event.id)).filter_by(status='initiated').first()
        return initiateCount

    def ringingCount():
        ringingCount = db.session.query(func.count(Event.id)).filter_by(status='ringing').first()
        return ringingCount

    def inProgressCount():
        inProgressCount = db.session.query(func.count(Event.id)).filter_by(status='in-progress').first()
        return inProgressCount

    def completedCount():
        completedCount = db.session.query(func.count(Event.id)).filter_by(status='completed').first()
        return completedCount
        
...
1
2
3
SELECT avg(event."recordingDuration") AS avg_1 
FROM event
127.0.0.1 - - [27/Jun/2022 16:01:19] "GET /events HTTP/1.1" 200 -
from crypt import methods
from http import client
from app import app, db
from flask import render_template, flash, redirect, url_for, request
from app.forms import createJobForm, addCredentialsForm, editJobForm
from app.models import Credentials, Job, Event
import os

from twilio.rest import Client

...

@app.route('/events')
def viewEvents():
    events = Event.query.all()
    longest = Event.longestCall()
    shortest = Event.shortestCall()
    avg = Event.avgCall()
    initiateCount = Event.initiateCount()
    ringingCount = Event.ringingCount()
    inProgressCount = Event.inProgressCount()
    completedCount = Event.completedCount()
    return render_template('events.html', title='Events', events=events, longest=longest[0], shortest=shortest[0], avg=avg, \
        initiateCount=initiateCount[0], ringingCount=ringingCount[0], inProgressCount=inProgressCount[0], completedCount=completedCount[0])

...
{% extends "base.html" %}

{% block app_content %}
<h1>Events Summary</h1>
<ul>
<li>Initiated Calls: {{ initiateCount }}</li>
<li>Ringing Calls: {{ ringingCount }}</li>
<li>In-Progress Calls: {{ inProgressCount }}</li>
<li>Completed Calls: {{ completedCount }}</li>
<br>
<li>Average Time of Calls: {{ avg }}</li>
<li>Longest Call: {{ longest }}</li>
<li>Shortest Call: {{ shortest }}</li>
</ul>

<h1>View Jobs</h1>
<table id="data" class="table table-striped">
    <thead>
        <td>SID</td>
        <td>Status</td>
        <td>Sequence</td>
        <td>Recording</td>
        <td>Duration (s)</td>
        <td>Job</td>
        <td>Created</td>
    </thead>
    <tbody>
        {% for event in events %}
        <tr>
            <td>{{ event.sid }}</td>
            <td>{{ event.status}}</td>
            <td>{{ event.sequence}}</td>
            {% if event.recording %}
            <td><a href={{ event.recording}}>Link</a></td>
            <td>{{ event.recordingDuration}}</td>
            {% else %}
            <td>None</td>
            <td>None</td>
            {% endif %}
            <td>{{ event.job_id}}</td>
            <td>{{ moment(event.created).format('LLL') }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.