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

Commit

Permalink
Merge pull request #45 from hasgeek/py3
Browse files Browse the repository at this point in the history
Moving to Py3
  • Loading branch information
iambibhas authored Jan 2, 2020
2 parents 341f2e7 + 2e69a73 commit f803ab9
Show file tree
Hide file tree
Showing 10 changed files with 303 additions and 303 deletions.
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

0 comments on commit f803ab9

Please sign in to comment.