Skip to content
This repository has been archived by the owner on May 16, 2020. It is now read-only.

Moving to Py3 #45

Merged
merged 1 commit into from
Jan 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
408 changes: 204 additions & 204 deletions kharcha/forms/expenses.py

Large diffs are not rendered by default.

30 changes: 15 additions & 15 deletions kharcha/forms/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,31 @@ class NewWorkspaceForm(Form):
"""
Create a workspace.
"""
workspace = wtforms.RadioField(u"Organization", validators=[wtforms.validators.Required("Select an organization")],
description=u"Select the organization you’d like to create a workspace for")
currency = wtforms.SelectField(u"Currency", validators=[wtforms.validators.Required("Select a currency")], choices=CURRENCIES,
description=u"The standard currency for your organization’s accounts. This cannot be changed later")
workspace = wtforms.RadioField("Organization", validators=[wtforms.validators.Required("Select an organization")],
description="Select the organization you’d like to create a workspace for")
currency = wtforms.SelectField("Currency", validators=[wtforms.validators.Required("Select a currency")], choices=CURRENCIES,
description="The standard currency for your organization’s accounts. This cannot be changed later")


class WorkspaceForm(Form):
"""
Manage workspace settings.
"""
description = RichTextField(u"Usage notes",
description=u"Notes for your organization members on how to use this expense reporting tool")
timezone = wtforms.SelectField(u"Timezone", validators=[wtforms.validators.Required("Select a timezone")],
description = RichTextField("Usage notes",
description="Notes for your organization members on how to use this expense reporting tool")
timezone = wtforms.SelectField("Timezone", validators=[wtforms.validators.Required("Select a timezone")],
choices=[(tz, tz) for tz in common_timezones],
description=u"The primary timezone in which your organization is based")
access_teams = QuerySelectMultipleField(u"Access Teams",
description="The primary timezone in which your organization is based")
access_teams = QuerySelectMultipleField("Access Teams",
validators=[wtforms.validators.Required("You need to select at least one team")], get_label='title',
description=u"Teams that can submit expense reports")
review_teams = QuerySelectMultipleField(u"Review Teams",
description="Teams that can submit expense reports")
review_teams = QuerySelectMultipleField("Review Teams",
validators=[wtforms.validators.Required("You need to select at least one team")], get_label='title',
description=u"Teams that can review and act on expense reports")
admin_teams = QuerySelectMultipleField(u"Admin Teams",
description="Teams that can review and act on expense reports")
admin_teams = QuerySelectMultipleField("Admin Teams",
validators=[wtforms.validators.Required("You need to select at least one team")], get_label='title',
description=u"Teams with administrative access to this workspace. "
u"Admin access is required to create or edit budgets and categories")
description="Teams with administrative access to this workspace. "
"Admin access is required to create or edit budgets and categories")

def validate_admin_teams(self, field):
if self.edit_obj.owners not in field.data:
Expand Down
8 changes: 4 additions & 4 deletions kharcha/models/expenses.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Budget(BaseScopedNameMixin, db.Model):
workspace = db.relation(Workspace, backref=db.backref('budgets', cascade='all, delete-orphan'))
parent = db.synonym('workspace')
#: Description of the budget. HTML field.
description = db.Column(db.Text, nullable=False, default=u'')
description = db.Column(db.Text, nullable=False, default='')
__table_args__ = (db.UniqueConstraint('name', 'workspace_id'),)


Expand Down Expand Up @@ -65,9 +65,9 @@ class ExpenseReport(BaseScopedIdNameMixin, db.Model):
budget_id = db.Column(db.Integer, db.ForeignKey('budget.id'), nullable=True)
budget = db.relationship(Budget, primaryjoin=budget_id == Budget.id)
#: Currency for expenses in this report
currency = db.Column(db.Unicode(3), nullable=False, default=u'INR')
currency = db.Column(db.Unicode(3), nullable=False, default='INR')
#: Optional description of expenses
description = db.Column(db.Text, nullable=False, default=u'')
description = db.Column(db.Text, nullable=False, default='')
#: Total value in the report's currency
total_value = db.Column(db.Numeric(10, 2), nullable=False, default=Decimal('0.0'))
#: Total value in the organization's preferred currency
Expand All @@ -77,7 +77,7 @@ class ExpenseReport(BaseScopedIdNameMixin, db.Model):
reviewer = db.relationship(User, primaryjoin=reviewer_id == User.id,
backref=db.backref('reviewed_reports', cascade='all')) # No delete-orphan
#: Reviewer notes
notes = db.Column(db.Text, nullable=False, default=u'') # HTML notes
notes = db.Column(db.Text, nullable=False, default='') # HTML notes
#: Status
status = db.Column(db.Integer, nullable=False, default=REPORT_STATUS.DRAFT)

Expand Down
2 changes: 1 addition & 1 deletion kharcha/models/settlements.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ class Payment(BaseMixin, db.Model):
#: User-reported date when payment was made
date = db.Column(db.Date, nullable=False)
#: Currency for payment
currency = db.Column(db.Unicode(3), nullable=False, default=u'INR')
currency = db.Column(db.Unicode(3), nullable=False, default='INR')
#: Amount of payment
amount = db.Column(db.Numeric(10, 2), default=0, nullable=False)
2 changes: 1 addition & 1 deletion kharcha/models/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Workspace(ProfileMixin, BaseNameMixin, db.Model):
userid = db.Column(db.Unicode(22), nullable=False, unique=True)
currency = db.Column(db.Unicode(3), nullable=False)
timezone = db.Column(db.Unicode(32), nullable=False)
description = db.Column(db.UnicodeText, nullable=False, default=u'')
description = db.Column(db.UnicodeText, nullable=False, default='')

admin_teams = db.relationship('Team', secondary=workspace_admin_teams, backref='workspaces_admin')
review_teams = db.relationship('Team', secondary=workspace_review_teams, backref='workspaces_reviewer')
Expand Down
40 changes: 20 additions & 20 deletions kharcha/views/expenses.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"""

import csv
import StringIO
import io
from flask import g, flash, url_for, render_template, request, redirect, Response
from werkzeug.datastructures import MultiDict
from coaster.utils import format_currency as coaster_format_currency
Expand Down Expand Up @@ -158,7 +158,7 @@ def report_expensetable(workspace, report):
permission='view'
)
def report_csv(workspace, report):
outfile = StringIO.StringIO()
outfile = io.StringIO()
out = csv.writer(outfile)
out.writerow(['Date', 'Category', 'Description', 'Amount'])
for expense in report.expenses:
Expand Down Expand Up @@ -192,8 +192,8 @@ def report_edit(workspace, report):
db.session.commit()
flash("Edited report '%s'." % report.title, 'success')
return render_redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)
return render_form(form=form, title=u"Edit expense report",
formid="report_edit", submit=u"Save",
return render_form(form=form, title="Edit expense report",
formid="report_edit", submit="Save",
cancel_url=url_for('report', workspace=workspace.name, report=report.url_name))


Expand All @@ -206,9 +206,9 @@ def report_edit(workspace, report):
)
def report_delete(workspace, report):
# Confirm delete
return render_delete_sqla(report, db, title=u"Confirm delete",
message=u"Delete expense report '%s'?" % report.title,
success=u"You have deleted report '%s'." % report.title,
return render_delete_sqla(report, db, title="Confirm delete",
message="Delete expense report '%s'?" % report.title,
success="You have deleted report '%s'." % report.title,
next=url_for('reports', workspace=workspace.name))


Expand All @@ -230,8 +230,8 @@ def expense_delete(workspace, report, expense):
report.update_sequence_numbers()
db.session.commit()
return redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)
return render_template('baseframe/delete.html.jinja2', form=form, title=u"Confirm delete",
message=u"Delete expense item '%s' for %s %s?" % (
return render_template('baseframe/delete.html.jinja2', form=form, title="Confirm delete",
message="Delete expense item '%s' for %s %s?" % (
expense.description, report.currency, format_currency(expense.amount)))


Expand All @@ -245,11 +245,11 @@ def expense_delete(workspace, report, expense):
def report_submit(workspace, report):
wf = report.workflow()
if wf.document.expenses == []:
flash(u"This expense report does not list any expenses.", 'error')
flash("This expense report does not list any expenses.", 'error')
return redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)
wf.submit()
db.session.commit()
flash(u"Your expense report has been submitted.", 'success')
flash("Your expense report has been submitted.", 'success')
return redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)


Expand All @@ -263,11 +263,11 @@ def report_submit(workspace, report):
def report_resubmit(workspace, report):
wf = report.workflow()
if wf.document.expenses == []:
flash(u"This expense report does not list any expenses.", 'error')
flash("This expense report does not list any expenses.", 'error')
return redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)
wf.resubmit()
db.session.commit()
flash(u"Your expense report has been submitted.", 'success')
flash("Your expense report has been submitted.", 'success')
return redirect(url_for('report', workspace=workspace.name, report=report.url_name), code=303)


Expand All @@ -282,7 +282,7 @@ def report_accept(workspace, report):
wf = report.workflow()
wf.accept(reviewer=g.user)
db.session.commit()
flash(u"Expense report '%s' has been accepted." % report.title, 'success')
flash("Expense report '%s' has been accepted." % report.title, 'success')
return redirect(url_for('reports_all', workspace=workspace.name), code=303)


Expand All @@ -295,9 +295,9 @@ def report_accept(workspace, report):
)
def report_return(workspace, report):
wf = report.workflow()
wf.return_for_review(reviewer=g.user, notes=u'') # TODO: Form for notes
wf.return_for_review(reviewer=g.user, notes='') # TODO: Form for notes
db.session.commit()
flash(u"Expense report '%s' has been returned for review." % report.title,
flash("Expense report '%s' has been returned for review." % report.title,
'success')
return redirect(url_for('reports_all', workspace=workspace.name), code=303)

Expand All @@ -311,9 +311,9 @@ def report_return(workspace, report):
)
def report_reject(workspace, report):
wf = report.workflow()
wf.reject(reviewer=g.user, notes=u'') # TODO: Form for notes
wf.reject(reviewer=g.user, notes='') # TODO: Form for notes
db.session.commit()
flash(u"Expense report '%s' has been rejected." % report.title, 'success')
flash("Expense report '%s' has been rejected." % report.title, 'success')
return redirect(url_for('reports_all', workspace=workspace.name), code=303)


Expand All @@ -328,7 +328,7 @@ def report_withdraw(workspace, report):
wf = report.workflow()
wf.withdraw()
db.session.commit()
flash(u"Expense report '%s' has been withdrawn." % report.title, 'success')
flash("Expense report '%s' has been withdrawn." % report.title, 'success')
return redirect(url_for('reports', workspace=workspace.name), code=303)


Expand All @@ -343,5 +343,5 @@ def report_close(workspace, report):
wf = report.workflow()
wf.close()
db.session.commit()
flash(u"Expense report '%s' has been closed." % report.title, 'success')
flash("Expense report '%s' has been closed." % report.title, 'success')
return redirect(url_for('reports_all', workspace=workspace.name), code=303)
8 changes: 4 additions & 4 deletions kharcha/views/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def login():
@app.route('/logout')
@lastuser.logout_handler
def logout():
flash(u"You are now logged out", category='info')
flash("You are now logged out", category='info')
return get_next_url()


Expand All @@ -40,7 +40,7 @@ def lastuser_error(error, error_description=None, error_uri=None):
if error == 'access_denied':
flash("You denied the request to login", category='error')
return redirect(get_next_url())
return Response(u"Error: %s\n"
u"Description: %s\n"
u"URI: %s" % (error, error_description, error_uri),
return Response("Error: %s\n"
"Description: %s\n"
"URI: %s" % (error, error_description, error_uri),
mimetype="text/plain")
58 changes: 29 additions & 29 deletions kharcha/views/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,20 @@ def workspace_new():
new_workspaces.append((org['userid'], org['title']))
if not new_workspaces:
return render_message(
title=u"No organizations found",
message=Markup(u"You do not have any organizations that do not already have a workspace. "
u'Would you like to <a href="%s">create a new organization</a>?' %
title="No organizations found",
message=Markup("You do not have any organizations that do not already have a workspace. "
'Would you like to <a href="%s">create a new organization</a>?' %
lastuser.endpoint_url('/organizations/new')))
eligible_workspaces = []
for orgid, title in new_workspaces:
if Team.query.filter_by(orgid=orgid).first() is not None:
eligible_workspaces.append((orgid, title))
if not eligible_workspaces:
return render_message(
title=u"No organizations available",
message=Markup(u"To create a workspace for an organization, you must first allow this app to "
u"access the list of teams in your organization. "
u'<a href="%s">Do that here</a>.' % lastuser.endpoint_url('/apps/' + lastuser.client_id)))
title="No organizations available",
message=Markup("To create a workspace for an organization, you must first allow this app to "
"access the list of teams in your organization. "
'<a href="%s">Do that here</a>.' % lastuser.endpoint_url('/apps/' + lastuser.client_id)))

# Step 3: Ask user to select organization
form = NewWorkspaceForm()
Expand All @@ -53,7 +53,7 @@ def workspace_new():
currency=form.currency.data, timezone=app.config.get('TIMEZONE', ''))
db.session.add(workspace)
db.session.commit()
flash(u"Created a workspace for %s" % workspace.title, "success")
flash("Created a workspace for %s" % workspace.title, "success")
return render_redirect(url_for('workspace_edit', workspace=workspace.name), code=303)
return render_form(form=form, title="Create a workspace for your organization...", submit="Next",
formid="workspace_new", cancel_url=url_for('index'), ajax=False)
Expand All @@ -70,10 +70,10 @@ def workspace_edit(workspace):
if form.validate_on_submit():
form.populate_obj(workspace)
db.session.commit()
flash(u"Edited workspace settings.", 'success')
flash("Edited workspace settings.", 'success')
return render_redirect(url_for('workspace_view', workspace=workspace.name), code=303)

return render_form(form=form, title=u"Edit workspace settings", submit="Save",
return render_form(form=form, title="Edit workspace settings", submit="Save",
formid="workspace_edit", cancel_url=url_for('workspace_view', workspace=workspace.name), ajax=True)


Expand All @@ -84,11 +84,11 @@ def workspace_delete(workspace):
# Only allow workspaces to be deleted if they have no expense reports
if workspace.reports:
return render_message(
title=u"Cannot delete this workspace",
message=u"This workspace cannot be deleted because it contains expense reports.")
return render_delete_sqla(workspace, db, title=u"Confirm delete",
message=u"Delete workspace '%s'?" % workspace.title,
success=u"You have deleted workspace '%s'." % workspace.title,
title="Cannot delete this workspace",
message="This workspace cannot be deleted because it contains expense reports.")
return render_delete_sqla(workspace, db, title="Confirm delete",
message="Delete workspace '%s'?" % workspace.title,
success="You have deleted workspace '%s'." % workspace.title,
next=url_for('index'))


Expand All @@ -112,8 +112,8 @@ def budget_new(workspace):
db.session.commit()
flash("Created new budget '%s'." % budget.title, "success")
return render_redirect(url_for('budget', workspace=workspace.name, budget=budget.name), code=303)
return render_form(form=form, title=u"Create new budget",
formid="budget_new", submit=u"Create",
return render_form(form=form, title="Create new budget",
formid="budget_new", submit="Create",
cancel_url=url_for('budget_list', workspace=workspace.name), ajax=True)


Expand All @@ -132,8 +132,8 @@ def budget_edit(workspace, budget):
db.session.commit()
flash("Edited budget '%s'" % budget.title, "success")
return render_redirect(url_for('budget', workspace=workspace.name, budget=budget.name), code=303)
return render_form(form=form, title=u"Edit budget",
formid='budget_edit', submit=u"Save",
return render_form(form=form, title="Edit budget",
formid='budget_edit', submit="Save",
cancel_url=url_for('budget', workspace=workspace.name, budget=budget.name), ajax=True)


Expand All @@ -145,9 +145,9 @@ def budget_edit(workspace, budget):
permission='delete'
)
def budget_delete(workspace, budget):
return render_delete_sqla(budget, db, title=u"Confirm delete",
message=u"Delete budget '%s'?" % budget.title,
success=u"You have deleted budget '%s'." % budget.title,
return render_delete_sqla(budget, db, title="Confirm delete",
message="Delete budget '%s'?" % budget.title,
success="You have deleted budget '%s'." % budget.title,
next=url_for('budget_list', workspace=workspace.name))


Expand All @@ -171,8 +171,8 @@ def category_new(workspace):
db.session.commit()
flash("Created new category '%s'." % category.title, "success")
return render_redirect(url_for('category', workspace=workspace.name, category=category.name), code=303)
return render_form(form=form, title=u"Create new category",
formid="category_new", submit=u"Create",
return render_form(form=form, title="Create new category",
formid="category_new", submit="Create",
cancel_url=url_for('category_list', workspace=workspace.name), ajax=True)


Expand Down Expand Up @@ -202,8 +202,8 @@ def category_edit(workspace, category):
db.session.commit()
flash("Edited category '%s'" % category.title, "success")
return render_redirect(url_for('category', workspace=workspace.name, category=category.name), code=303)
return render_form(form=form, title=u"Edit category",
formid='category_edit', submit=u"Save",
return render_form(form=form, title="Edit category",
formid='category_edit', submit="Save",
cancel_url=url_for('category', workspace=workspace.name, category=category.name), ajax=True)


Expand All @@ -215,7 +215,7 @@ def category_edit(workspace, category):
permission='delete'
)
def category_delete(workspace, category):
return render_delete_sqla(category, db, title=u"Confirm delete",
message=u"Delete category '%s'?" % category.title,
success=u"You have deleted category '%s'." % category.title,
return render_delete_sqla(category, db, title="Confirm delete",
message="Delete category '%s'?" % category.title,
success="You have deleted category '%s'." % category.title,
next=url_for('category_list', workspace=workspace.name))
Loading