Skip to content

Instantly share code, notes, and snippets.

@ondoheer
Created July 17, 2016 15:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ondoheer/a20fc75a4c1382bc3937f62770c4f9e2 to your computer and use it in GitHub Desktop.
Save ondoheer/a20fc75a4c1382bc3937f62770c4f9e2 to your computer and use it in GitHub Desktop.
Pagination with parameters
{% 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">&laquo;</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">&hellip;</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">&raquo;</span>
</a>
</li>
{% endif %}
</ul>
{% endmacro %}
{% 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="&#128270;" 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 %}
# 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