Skip to content

Instantly share code, notes, and snippets.

@johndiego
Created September 29, 2018 04:19
Show Gist options
  • Select an option

  • Save johndiego/1529bbffdb6860d9c97bb577ebc51213 to your computer and use it in GitHub Desktop.

Select an option

Save johndiego/1529bbffdb6860d9c97bb577ebc51213 to your computer and use it in GitHub Desktop.
import csv
import io
from datetime import datetime
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
from django.shortcuts import render
from django.template.loader import render_to_string
from django.utils import timezone
from weasyprint import HTML
from xlsxwriter import Workbook
from . import models
# VIEW DE PDF
def pdf(request):
pontos = models.NextelAssinantes.custom_sql()
assinantes = models.NextelAssinantes.usuarios_sql()
parceiros = models.NextelAssinantes.parceiros_cancelados_sql()
cancelados = models.NextelAssinantes.cancelados_sql()
def soma(pontos):
soma = 0
for i in pontos:
soma += pontos
return soma
contexto = {'pontos': pontos, 'assinantes': assinantes, 'parceiros': parceiros, 'soma':soma, 'cancelados': cancelados}
html_string = render_to_string('pdf.html', contexto)
filename = str(datetime.now())
html = HTML(string=html_string)
html.write_pdf(target='/tmp/{filename}.pdf')
fs = FileSystemStorage('/tmp')
with fs.open('{filename}.pdf') as pdf:
response = HttpResponse(pdf, content_type='application/pdf')
# response['Content-Disposition'] = f'attachment; filename="{filename}.pdf"'
return response
return render(request, contexto, "templates/pdf.html")
def pdf_periodos_view(request):
pontos = models.NextelAssinantes.periodo_sql()
html_string = render_to_string('pdf_periodos.html', {'pontos': pontos})
filename = str(datetime.now())
html = HTML(string=html_string)
html.write_pdf(target='/tmp/{filename}.pdf')
fs = FileSystemStorage('/tmp')
with fs.open('{filename}.pdf') as pdf:
response = HttpResponse(pdf, content_type='application/pdf')
# response['Content-Disposition'] = f'attachment; filename="{filename}.pdf"'
return response
return response
def index(request):
return render(request, 'index.html')
def login(request):
return render(request, 'login.html')
# CSV FILE
def pontos_view(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = (
'attachment; filename="{datetime.now()}.csv"'
)
# fieldnames = ['pontos', 'qtd_clientes']
writer = csv.writer(response)
writer.writerow(['pontos', 'qt_clientes'])
for ponto in models.NextelAssinantes.custom_sql():
writer.writerow(ponto.values())
return response
def pontos_cancelados_view(request):
# n = NextelAssinantes.objects.get_nextel_assinantes_pontos()
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = (
'attachment; filename="{datetime.now()}.csv"'
)
# fieldnames = ['pontos', 'qtd_clientes']
writer = csv.writer(response, delimiter=';')
writer.writerow(['pontos', 'qt_clientes'])
for ponto in models.NextelAssinantes.cancelados_sql():
writer.writerow(ponto.values())
return response
# XLS File
def pontos_xls(request):
datamodel = models.NextelAssinantes
# pega com .all(), se caso sua custom query ja faz isso pode pular o query set e capturar
queryset = datamodel.cancelados_sql()
fields = ['pontos', 'qtd_clientes']
output = io.BytesIO()
workbook = Workbook(output, {'in_memory': True})
worksheet = workbook.add_worksheet()
# seu "header"
worksheet.write_row('A1', [x for x in fields])
# pula uma linha
row = 1
print(type(queryset))
for reg in queryset:
col = 0
# por info em cada coluna de uma linha vamos acessar eles
for pos in range(len(fields)):
# verifica se a coluna eh nula. (nao consigo por acento wtf)?
if not reg[fields[pos]]:
value = 0
else:
# assume o valor quando nao e nulo.
value = reg[fields[pos]]
# grava a linha em memoria de acordo com a posicao da coluna ex: linha 1 coluna 1 grava quantidade da 1 linha
worksheet.write(row, col, str(value))
# vamos para proxima coluna.
col += 1
# Proxima linha
row += 1
workbook.close()
# reseta posicao da memoria pro comeco
output.seek(0)
# get it
content_type = (
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
response = HttpResponse(output.read(), content_type=content_type)
response['Content-Disposition'] = (
'attachment;filename={str(datetime.now())}.xlsx'
)
output.close()
return response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment