fga-gpp-mds/2016.2-SME_UnB

View on GitHub
src/report/views.py

Summary

Maintainability
C
1 day
Test Coverage
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

from django.core.urlresolvers import reverse_lazy, reverse
from django.core import serializers
from cStringIO import StringIO
from reportlab.platypus.flowables import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

from django.http import HttpResponse
from django.utils.translation import ugettext as _

import datetime

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.dates import DateFormatter
import matplotlib.patches as mpatches

from transductor.models import EnergyMeasurements, EnergyTransductor
from transductor.models import TransductorModel
import json


def create_graphic(path, array_date, array_dateb,
                   array_datec, array_data, label):
    title = _('Monitoring') + ' ' + label

    fig = Figure()

    ax = fig.add_subplot(111)
    bx = fig.add_subplot(111)
    cx = fig.add_subplot(111)
    x = []
    y = []
    yb = []
    yc = []
    xb = []
    xc = []

    for i in range(len(array_data)):
        x.append(array_data[i])
        y.append(array_date[i])
        xb.append(array_data[i])
        xc.append(array_data[i])
        yb.append(array_dateb[i])
        yc.append(array_datec[i])

    ax.plot_date(x, y, '-')
    bx.plot_date(xb, yb, '-')
    cx.plot_date(xc, yc, '-')

    patch1 = mpatches.Patch(color='blue', label=_('Phase 1'))
    patch2 = mpatches.Patch(color='green', label=_('Phase 2'))
    patch3 = mpatches.Patch(color='red', label=_('Phase 3'))

    z = [patch1, patch2, patch3]

    cx.legend(handles=z, loc=1)

    ax.set_title(title)
    ax.set_xlabel(_('Date'))
    ax.set_ylabel(label)
    ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
    fig.autofmt_xdate()
    canvas = FigureCanvas(fig)

    fig.savefig(path)

    return path


def generatePdf(transductor_id):
    import time
    from reportlab.lib.enums import TA_JUSTIFY
    from reportlab.lib.pagesizes import letter
    from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
    from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
    from reportlab.lib.units import inch

    doc = SimpleDocTemplate("src/report/static/Relatorio"+transductor_id+".pdf",
                            pagesize=letter,
                            rightMargin=72, leftMargin=72,
                            topMargin=72, bottomMargin=18)
    Story = []
    logo = "src/report/static/currentGraphic"+transductor_id+".png"
    logo2 = "src/report/static/voltageGraphic"+transductor_id+".png"
    logo3 = "src/report/static/activePowerGraphic"+transductor_id+".png"
    logo4 = "src/report/static/reactivePowerGraphic"+transductor_id+".png"
    logo5 = "src/report/static/apparentPowerGraphic"+transductor_id+".png"

    magName = "Pythonista"
    issueNum = 12
    subPrice = "99.00"
    limitedDate = "03/05/2010"
    freeGift = "tin foil hat"

    formatted_time = time.ctime()
    full_name = "SME-UnB"
    address_parts = ["Campus Universitario UnB", "Brasilia-DF, 70910-900"]

    im = Image(logo, 8 * inch, 5 * inch)
    im2 = Image(logo2, 8 * inch, 5 * inch)
    im3 = Image(logo3, 8 * inch, 5 * inch)
    im4 = Image(logo4, 8 * inch, 5 * inch)
    im5 = Image(logo5, 8 * inch, 5 * inch)

    Story.append(im)
    Story.append(im2)
    Story.append(im3)
    Story.append(im4)
    Story.append(im5)

    styles = getSampleStyleSheet()
    styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
    ptext = '<font size=12>%s</font>' % formatted_time

    Story.append(Paragraph(ptext, styles["Normal"]))
    Story.append(Spacer(1, 12))

    ptext = '<font size=12>%s</font>' % full_name
    Story.append(Paragraph(ptext, styles["Normal"]))
    for part in address_parts:
        ptext = '<font size=12>%s</font>' % part.strip()
        Story.append(Paragraph(ptext, styles["Normal"]))

    Story.append(Spacer(1, 12))
    Story.append(Spacer(1, 12))
    ptext = '<font size=12>{ % trans Report Energy Monitoring % }</font>'
    Story.append(Paragraph(ptext, styles["Normal"]))

    doc.build(Story)
    return 1


def __minValue(arrayData):

    arrayData.sort()
    return arrayData[0]


def __maxValue(arrayData):

    arrayData.sort(reverse=True)

    return arrayData[0]


def __average(arrayData):
    total = 0
    for i in arrayData:
        total += i

    if(len(arrayData) != 0):
        return total / len(arrayData)
    else:
        return 0

@login_required
def report(request, transductor_id):
    now = datetime.datetime.now()
    delta = datetime.timedelta(days=1)

    date = []
    data = []

    voltage_a = []
    voltage_b = []
    voltage_c = []
    current_a = []
    current_b = []
    current_c = []
    active_power_a = []
    active_power_b = []
    active_power_c = []
    reactive_power_a = []
    reactive_power_b = []
    reactive_power_c = []
    apparent_power_a = []
    apparent_power_b = []
    apparent_power_c = []

    for i in EnergyMeasurements.objects.all().filter(transductor=EnergyTransductor.objects.get(id=transductor_id)):

        date.append(i.collection_date)
        voltage_a.append(i.voltage_a)
        voltage_b.append(i.voltage_b)
        voltage_c.append(i.voltage_c)
        current_a.append(i.current_a)
        current_b.append(i.current_b)
        current_c.append(i.current_c)
        active_power_a.append(i.active_power_a)
        active_power_b.append(i.active_power_b)
        active_power_c.append(i.active_power_c)
        reactive_power_a.append(i.reactive_power_a)
        reactive_power_b.append(i.reactive_power_b)
        reactive_power_c.append(i.reactive_power_c)
        apparent_power_a.append(i.apparent_power_a)
        apparent_power_b.append(i.apparent_power_b)
        apparent_power_c.append(i.apparent_power_c)


    create_graphic(
        'src/report/static/currentGraphic' + transductor_id + '.png',
        current_a,
        current_b,
        current_c,
        date,
        _('Current'))

    create_graphic(
        'src/report/static/voltageGraphic' + transductor_id + '.png',
        voltage_a,
        voltage_b,
        voltage_c,
        date,
        _('Voltage'))

    create_graphic(
        'src/report/static/activePowerGraphic' + transductor_id + '.png',
        active_power_a,
        active_power_b,
        active_power_c,
        date,
        _('Active Power'))

    create_graphic(
        'src/report/static/reactivePowerGraphic' + transductor_id + '.png',
        reactive_power_a,
        reactive_power_b,
        reactive_power_c,
        date,
        _('Reactive Power'))

    create_graphic(
        'src/report/static/apparentPowerGraphic' + transductor_id + '.png',
        apparent_power_a,
        apparent_power_b,
        apparent_power_c,
        date,
        _('Apparent Power'))

    generatePdf(transductor_id)

    maxVoltage = [__maxValue(voltage_a),
                  __maxValue(voltage_b),
                  __maxValue(voltage_c)]

    minVoltage = [__minValue(voltage_a),
                  __minValue(voltage_b),
                  __minValue(voltage_c)]

    averageVoltage = [__average(voltage_a),
                      __average(voltage_b),
                      __average(voltage_c)]

    maxCurrent = [__maxValue(current_a),
                  __maxValue(current_b),
                  __maxValue(current_c)]

    minCurrent = [__minValue(current_a),
                  __minValue(current_b),
                  __minValue(current_c)]

    averageCurrent = [__average(current_a),
                      __average(current_b),
                      __average(current_c)]

    maxActivePower = [__maxValue(active_power_a),
                      __maxValue(active_power_b),
                      __maxValue(active_power_c)]

    minActivePower = [__minValue(active_power_a),
                      __minValue(active_power_b),
                      __minValue(active_power_c)]

    averageActivePower = [__average(active_power_a),
                          __average(active_power_b),
                          __average(active_power_c)]

    maxReactivePower = [__maxValue(reactive_power_a),
                        __maxValue(reactive_power_b),
                        __maxValue(reactive_power_c)]

    minReactivePower = [__minValue(reactive_power_a),
                        __minValue(reactive_power_b),
                        __minValue(reactive_power_c)]

    averageReactivePower = [__average(reactive_power_a),
                            __average(reactive_power_b),
                            __average(reactive_power_c)]

    maxApparentPower = [__maxValue(apparent_power_a),
                        __maxValue(apparent_power_b),
                        __maxValue(apparent_power_c)]

    minApparentPower = [__minValue(apparent_power_a),
                        __minValue(apparent_power_b),
                        __minValue(apparent_power_c)]

    averageApparentPower = [__average(apparent_power_a),
                            __average(apparent_power_b),
                            __average(apparent_power_c)]

    VoltageInformation = {'max': maxVoltage, 'min': minVoltage,
                          'average': averageVoltage}

    currentInformation = {'max': maxCurrent, 'min': minCurrent,
                          'average': averageCurrent}

    activePowerInformation = {'max': maxActivePower, 'min': minActivePower,
                              'average': averageActivePower}

    reactivePowerInformation = {'max': maxReactivePower,
                                'min': minReactivePower,
                                'average': averageReactivePower}

    apparentPowerInformation = {'max': maxApparentPower,
                                'min': minApparentPower,
                                'average': averageApparentPower}

    information = {'voltage': VoltageInformation,
                   'Current': currentInformation,
                   'activePower': activePowerInformation,
                   'reactivePower': reactivePowerInformation,
                   'apparentPower': apparentPowerInformation,
                   'transductor_id': transductor_id}

    return render(request, 'graphics/report.html', information)


@login_required
def transductors_filter(request):
    return render(request, 'graphics/transductors_filter.html',
                  {'transductors': EnergyTransductor.objects.all()})

@login_required
def transductor_list(request):
    return render(request,'invoice/transductor_list.html',{'transductors': EnergyTransductor.objects.all()});

def open_pdf(request,transductor_id):
    with open('src/report/static/Relatorio'+transductor_id+'.pdf', 'r') as pdf:
        response = HttpResponse(pdf.read(), content_type='application/pdf')
        response['Content-Disposition'] = 'filename=Relatorio' + \
        transductor_id+'.pdf'
        return response
    pdf.closed

@login_required
def invoice(request, transductor_id):
    context = {
    'transductor_id': transductor_id
    }
    return render(request, 'invoice/invoice.html', context)


def get_measurements_filter_transductor(request, transductor_id):
    measurements = EnergyMeasurements.objects.all().filter(transductor = EnergyTransductor.objects.get(id = transductor_id))
    return HttpResponse(serializers.serialize('json',measurements),'application/json')

def list_transductors(request):
    return HttpResponse(serializers.serialize('json',EnergyTransductor.objects.all()))

@login_required
def return_chart(request):
    return render(request,'graphics/chart.html', {'all_transductors' : EnergyTransductor.objects.all()})