Created
July 17, 2016 15:16
-
-
Save ondoheer/a20fc75a4c1382bc3937f62770c4f9e2 to your computer and use it in GitHub Desktop.
Pagination with parameters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% macro render_pagination(pagination, endpoint, per_page, order_by, direction) %} | |
<ul class="pagination"> | |
{% if pagination.has_prev %} | |
<li> | |
<a href="{{ url_for(endpoint, page=pagination.prev_num, per_page=per_page, order_by=order_by, direction=direction) }}" aria-label="Previous"> | |
<span aria-hidden="true">«</span> | |
</a> | |
</li> | |
{% endif %} | |
{% for p in pagination.iter_pages(left_edge=1, left_current=2, right_current=3, right_edge=1) %} | |
{% if p %} | |
{% if p != pagination.page %} | |
<li> | |
<a href="{{ url_for(endpoint, page=p, per_page=per_page, order_by=order_by, direction=direction) }}">{{ p }}</a> | |
</li> | |
{% else %} | |
<li class="active"> | |
<a href="{{ url_for(endpoint, page=p, per_page=per_page, order_by=order_by, direction=direction) }}"><strong>{{ p }}</strong></a> | |
</li> | |
{% endif %} | |
{% else %} | |
<li class="disabled"> | |
<span class="ellipsis">…</span> | |
</li> | |
{% endif %} | |
{% endfor %} | |
{% if pagination.has_next %} | |
<li> | |
<a href="{{ url_for(endpoint, page=pagination.next_num, per_page=per_page, order_by=order_by, direction=direction) }}" aria-label="Next"> | |
<span aria-hidden="true">»</span> | |
</a> | |
</li> | |
{% endif %} | |
</ul> | |
{% endmacro %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% extends "base.html" %} | |
{% import "macros/pagination.html" as pagination %} | |
{% block content %} | |
{{super()}} | |
<div class="row"> | |
<h3>Buscar gasto</h3> | |
<form action="{{url_for("expense")}}" method="POST" class="small-12 medium-4 columns"> | |
{{search_form.hidden_tag()}} | |
<div class="row"> | |
<div class="large-12 columns"> | |
<div class="row collapse"> | |
<div class="small-10 columns"> | |
{{search_form.search_term(placeholder="buscar")}} | |
</div> | |
<div class="small-2 columns"> | |
<input type="submit" value="🔎" class="button postfix"> | |
</div> | |
</div> | |
</div> | |
</div> | |
</form> | |
</div> | |
<div class="row"> | |
<section class="expenses__list small-12 medium-6 columns"> | |
{% if expenses %} | |
{% if direction == "desc" %} | |
{% set top_direction = "asc" %} | |
{% else%} | |
{% set top_direction = "desc" %} | |
{% endif %} | |
<h3>Lista de gastos</h3> | |
<table> | |
<th>acción</th> | |
<th><a href="{{url_for("expense", page=page, per_page=per_page, order_by="name", direction=top_direction, search_term=search_term)}}">gasto</a></th> | |
<th><a href="{{url_for("expense", page=page, per_page=per_page, order_by="amount", direction=top_direction, search_term=search_term)}}">monto</a></th> | |
<th>categoría</th> | |
<th><a href="{{url_for("expense", page=page, per_page=per_page, order_by="date", direction=top_direction, search_term=search_term)}}">fecha</a></th> | |
{% for expense in expenses %} | |
<tr> | |
<td> | |
<a href="{{url_for("expense", expense_id=expense.id)}}" title="editar"><i class="fi-pencil"></i></a> | |
<span class="delete-action" data-href="{{url_for("expense.delete", expense_id=expense.id)}}" ><i class="fi-x" style="color:red"></i></span> | |
</td> | |
<td>{{expense.name}}</td> | |
<td> S/.{{expense.amount}}</td> | |
<td>{{expense.category}}</td> | |
<td>{{expense.date | date_small}}</td> | |
<tr> | |
{% endfor %} | |
</table> | |
{% endif %} | |
{{pagination.render_pagination(expenses, "expense", per_page, order_by, direction)}} | |
</section> | |
<section class="monthly-report small-12 medium-6 columns"> | |
<h2>Reporte mesual</h2> | |
<p>Gastos del mes de {{month.name}}: S/. {{month.total_expenses}}</p> | |
</section> | |
</div> | |
{% endblock content %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
from flask.views import MethodView | |
from flask import ( | |
g, | |
flash, | |
redirect, | |
url_for, | |
render_template, | |
request, | |
abort | |
) | |
from flask_stormpath import login_required | |
from sqlalchemy.orm.exc import NoResultFound | |
import sqlalchemy | |
from .forms import ExpenseForm | |
from .controllers import validate_category_id | |
from app.models import db | |
from app.models.category import Category | |
from app.models.expense import Expense | |
from app.models.month import Month | |
from app.utils.forms import SearchForm | |
class ExpenseBaseView(MethodView): | |
decorators = [login_required] | |
def __init__(self): | |
self.user_id = g.current_user.id | |
self.search_form = SearchForm() | |
self.form = ExpenseForm() | |
self.categories = Category.get_user_categories(self.user_id) | |
self.form.category.choices = [ | |
(category.id, category.name) | |
for category in self.categories] | |
class ExpenseView(ExpenseBaseView): | |
def get(self, expense_id=None): | |
user_id = self.user_id | |
form = self.form | |
categories = self.categories | |
if len(categories) < 1: | |
flash("Debes crear alguna categoría antes \ | |
de poder agregar gastos", "alert") | |
return redirect(url_for("intro.first_categories")) | |
if expense_id: | |
expense = db.session.query(Expense)\ | |
.filter_by(id=expense_id)\ | |
.filter_by(user_id=user_id)\ | |
.first() | |
if not expense: | |
abort(400) | |
# Create New Expense | |
if "new" in request.path: | |
last_expense = Expense.get_last_user_expense(user_id) | |
if not last_expense: | |
last_expense = "Aún no has realizado ningún gasto" | |
return render_template( | |
"expense/expense_form.html", | |
form=form, | |
last_expense=last_expense | |
) | |
# delete | |
elif "delete" in request.path and expense_id: | |
db.session.delete(expense) | |
db.session.commit() | |
flash("Gasto eliminado", "alert") | |
return redirect(url_for("expense")) | |
# edit | |
elif expense_id: | |
last_expense = Expense.get_last_user_expense(user_id) | |
if not last_expense: | |
last_expense = "Aún no has realizado ningún gasto" | |
form.amount.data = expense.amount | |
form.name.data = expense.name | |
form.category.data = expense.category_id | |
return render_template( | |
"expense/expense_form.html", | |
form=form, | |
last_expense=last_expense, | |
expense_id=expense_id | |
) | |
# list and search | |
else: | |
search_form = SearchForm() | |
# Defaults | |
page = 1 | |
per_page = 10 | |
order_by = "date" | |
direction = "desc" | |
search_term = None | |
# URI query args | |
page = int(request.args.get("page", page)) | |
per_page = int(request.args.get("per_page", per_page)) | |
order_by = request.args.get("order_by", order_by) | |
order = getattr(Expense, order_by) | |
direction = request.args.get("direction", direction) | |
# Set sqlalchemy direction function | |
dir_func = getattr(sqlalchemy, direction) | |
if "search_term" in request.args: | |
search_term = request.args.get("search_term") | |
expenses = db.session.query(Expense)\ | |
.filter_by(user_id=user_id)\ | |
.order_by(dir_func(order))\ | |
.filter(Expense.name.ilike( | |
"%{}%".format(search_term)))\ | |
.paginate(page=page, per_page=per_page) | |
search_form.search_term.data = search_term | |
else: | |
# build query | |
expenses = db.session.query(Expense)\ | |
.filter_by(user_id=user_id)\ | |
.order_by(dir_func(order))\ | |
.paginate(page=page, per_page=per_page) | |
# Current month, need this for Expense classmethods in the template | |
month = db.session.query(Month)\ | |
.filter_by(user_id=user_id)\ | |
.order_by(Month.id.desc())\ | |
.first() | |
return render_template( | |
"expense/expenses.html", | |
expenses=expenses, | |
form=form, | |
per_page=per_page, | |
page=page, | |
order_by=order_by, | |
direction=direction, | |
month=month, | |
search_form=search_form, | |
search_term=search_term | |
) | |
def post(self, expense_id=None): | |
form = self.form | |
search_form = self.search_form | |
user_id = self.user_id | |
if search_form.validate_on_submit(): | |
search_term = search_form.search_term.data | |
return redirect(url_for("expense", search_term=search_term)) | |
if form.validate_on_submit(): | |
# this validates or generates a new category | |
category_id = validate_category_id(form, user_id) | |
# New Expense | |
if not expense_id: | |
expense = Expense( | |
amount=form.amount.data, | |
name=form.name.data, | |
category_id=category_id, | |
user_id=user_id | |
) | |
month_code = Month.build_user_month_code(self.user_id) | |
try: | |
month = db.session.query(Month).filter( | |
Month.year_month_usr == month_code | |
).one() | |
except NoResultFound: | |
month = Month(year_month_usr=month_code, user_id=user_id) | |
# new expense for the month | |
month.expenses.append(expense) | |
db.session.add(month) | |
# edited expense | |
else: | |
expense = db.session.query(Expense)\ | |
.filter_by(user_id=user_id)\ | |
.filter_by(id=expense_id)\ | |
.first() | |
if not expense: | |
abort(400) | |
expense.amount = form.amount.data, | |
expense.name = form.name.data, | |
expense.category_id = validate_category_id(form, user_id) | |
db.session.add(expense) | |
# save | |
db.session.commit() | |
flash("gasto guardado", "success") | |
# Expense Category limit check | |
if expense.category.monthly_limit: | |
# limit mailing system | |
from app.expense.controllers import process_expense_limit | |
process_expense_limit(expense, month) | |
return redirect(url_for("front.index")) | |
else: | |
flash( | |
"El formulario no ha validado: {}".format(form.errors), "alert") | |
last_expense = Expense.get_last_user_expense(user_id) | |
if not last_expense: | |
last_expense = "Aún no has realizado ningún gasto" | |
return render_template( | |
"expense/expense_form.html", | |
form=form, | |
last_expense=last_expense | |
) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment