diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py index d899c97b..ee8be07b 100644 --- a/ihatemoney/forms.py +++ b/ihatemoney/forms.py @@ -189,6 +189,15 @@ class BillForm(FlaskForm): bill.external_link = self.external_link.data bill.date = self.date.data bill.owers = [Person.query.get(ower, project) for ower in self.payed_for.data] + return bill + + def fake_form(self, bill, project): + bill.payer_id = self.payer + bill.amount = self.amount + bill.what = self.what + bill.external_link = u"" + bill.date = self.date + bill.owers = [Person.query.get(ower, project) for ower in self.payed_for] return bill diff --git a/ihatemoney/templates/forms.html b/ihatemoney/templates/forms.html index 48b55e96..75dacab8 100644 --- a/ihatemoney/templates/forms.html +++ b/ihatemoney/templates/forms.html @@ -91,7 +91,7 @@ {{ form.file }} {{ form.csrf_token() }}
- +
{% endmacro %} diff --git a/ihatemoney/templates/layout.html b/ihatemoney/templates/layout.html index 5af4ae23..664182ae 100644 --- a/ihatemoney/templates/layout.html +++ b/ihatemoney/templates/layout.html @@ -42,7 +42,7 @@ - + {% endblock %} {% endif %} diff --git a/ihatemoney/templates/upload_json.html b/ihatemoney/templates/upload_json.html index a391b7ac..64aca0fe 100644 --- a/ihatemoney/templates/upload_json.html +++ b/ihatemoney/templates/upload_json.html @@ -1,7 +1,7 @@ {% extends "layout.html" %} {% block content %} -

{{ _("Upload JSON") }}

+

{{ _("Import JSON") }}

{{ forms.upload_json(form) }} diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py index 80946ce7..5c19007f 100644 --- a/ihatemoney/utils.py +++ b/ihatemoney/utils.py @@ -255,3 +255,8 @@ def same_bill(bill1, bill2): if bill1[a] != bill2[a]: return False return True + + +def parse_date(string_date): + date = string_date.split("-") + return datetime(int(date[0]), int(date[1]), int(date[2]), 0, 0, 0) diff --git a/ihatemoney/web.py b/ihatemoney/web.py index 6d6e6762..673805c8 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -10,6 +10,9 @@ and `add_project_id` for a quick overview) """ import json import os +from functools import wraps +from smtplib import SMTPRecipientsRefused + from flask import ( abort, Blueprint, @@ -24,15 +27,12 @@ from flask import ( send_file, send_from_directory, ) -from flask_mail import Message from flask_babel import get_locale, gettext as _ -from werkzeug.security import check_password_hash, generate_password_hash -from smtplib import SMTPRecipientsRefused -from werkzeug.exceptions import NotFound +from flask_mail import Message from sqlalchemy import orm -from functools import wraps +from werkzeug.exceptions import NotFound +from werkzeug.security import check_password_hash, generate_password_hash -from ihatemoney.models import db, Project, Person, Bill from ihatemoney.forms import ( AdminAuthenticationForm, AuthenticationForm, @@ -45,6 +45,7 @@ from ihatemoney.forms import ( get_billform_for, UploadForm, ) +from ihatemoney.models import db, Project, Person, Bill from ihatemoney.utils import ( Redirect303, list_of_dicts2json, @@ -52,6 +53,7 @@ from ihatemoney.utils import ( LoginThrottler, get_members, same_bill, + parse_date, ) main = Blueprint("main", __name__) @@ -401,9 +403,13 @@ def upload_json(): if form.validate_on_submit(): filename = pid + "_uploaded_bills.json" form.file.data.save(filename) - import_project(filename) - os.remove(filename) - flash(_("Project successfully uploaded")) + try: + import_project(filename) + flash(_("Project successfully uploaded")) + except ValueError: + flash(_("Invalid JSON"), category="error") + finally: + os.remove(filename) return redirect(url_for("main.list_bills")) return render_template("upload_json.html", form=form) @@ -438,15 +444,35 @@ def import_project(file): if not same: bill_to_add.append(j) - # Add to DB + # Add users to DB for m in members_to_add: Person(name=m[0], project=g.project, weight=m[1]) - - bill = Bill( - what="TestBill", amount=12, date="2019-12-04", payer_id=9, owers=[7, 8, 9], id=7 - ) db.session.commit() + id_dict = {} + for i in g.project.members: + id_dict[i.name] = i.id + + # Create bills + for b in bill_to_add: + owers_id = list() + for ower in b["owers"]: + owers_id.append(id_dict[ower]) + + bill = Bill() + form = get_billform_for(g.project) + form.what = b["what"] + form.amount = b["amount"] + form.date = parse_date(b["date"]) + form.payer = id_dict[b["payer_name"]] + form.payed_for = owers_id + + db.session.add(form.fake_form(bill, g.project)) + + # Add bills to DB + db.session.commit() + + @main.route("//delete") def delete_project(): g.project.remove_project()