From e2a8a812b82981d663605ffc0ad89eecbe472a7c Mon Sep 17 00:00:00 2001 From: Daniel Atwood Date: Sat, 9 May 2020 15:46:21 +0200 Subject: [PATCH] Populate the demo project with defaults. Fixes #609 --- ihatemoney/models.py | 45 +++++++++++++++++++++++++++++++++++++++ ihatemoney/tests/tests.py | 7 +++++- ihatemoney/web.py | 14 +++--------- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/ihatemoney/models.py b/ihatemoney/models.py index 9e474c60..27a8aff5 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -10,11 +10,13 @@ from itsdangerous import ( TimedJSONWebSignatureSerializer, URLSafeSerializer, ) + import sqlalchemy from sqlalchemy import orm from sqlalchemy.sql import func from sqlalchemy_continuum import make_versioned, version_class from sqlalchemy_continuum.plugins import FlaskPlugin +from werkzeug.security import generate_password_hash from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder from ihatemoney.versioning import ( @@ -330,6 +332,49 @@ class Project(db.Model): def __repr__(self): return f"" + @staticmethod + def create_demo_project(): + project = Project( + id="demo", + name="demonstration", + password=generate_password_hash("demo"), + contact_email="demo@notmyidea.org", + default_currency="EUR", + ) + db.session.add(project) + db.session.commit() + + members = {} + for name in ("Amina", "Georg", "Alice"): + person = Person() + person.name = name + person.project = project + person.weight = 1 + db.session.add(person) + + members[name] = person + + db.session.commit() + + operations = ( + ("Georg", 200, ("Amina", "Georg", "Alice"), "Food shopping"), + ("Alice", 20, ("Amina", "Alice"), "Beer !"), + ("Amina", 50, ("Amina", "Alice", "Georg"), "AMAP"), + ) + for (payer, amount, owers, subject) in operations: + bill = Bill() + bill.payer_id = members[payer].id + bill.what = subject + bill.owers = [members[name] for name in owers] + bill.amount = amount + bill.original_currency = "EUR" + bill.converted_amount = amount + + db.session.add(bill) + + db.session.commit() + return project + class Person(db.Model): class PersonQuery(BaseQuery): diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index b13c7c07..769f980e 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -493,7 +493,12 @@ class BudgetTestCase(IhatemoneyTestCase): # test that a demo project is created if none is defined self.assertEqual([], models.Project.query.all()) self.client.get("/demo") - self.assertTrue(models.Project.query.get("demo") is not None) + demo = models.Project.query.get("demo") + self.assertTrue(demo is not None) + + self.assertEqual(["Amina", "Georg", "Alice"], [m.name for m in demo.members]) + self.assertEqual(demo.get_bills().count(), 3) + def test_deactivated_demo(self): self.app.config["ACTIVATE_DEMO_PROJECT"] = False diff --git a/ihatemoney/web.py b/ihatemoney/web.py index ae124ac5..1af5f848 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -541,11 +541,11 @@ def exit(): @main.route("/demo") def demo(): """ - Authenticate the user for the demonstration project and redirect him to + Authenticate the user for the demonstration project and redirects to the bills list for this project. Create a demo project if it doesn't exists yet (or has been deleted) - If the demo project is deactivated, one is redirected to the create project form + If the demo project is deactivated, redirects to the create project form. """ is_demo_project_activated = current_app.config["ACTIVATE_DEMO_PROJECT"] project = Project.query.get("demo") @@ -553,15 +553,7 @@ def demo(): if not project and not is_demo_project_activated: raise Redirect303(url_for(".create_project", project_id="demo")) if not project and is_demo_project_activated: - project = Project( - id="demo", - name="demonstration", - password=generate_password_hash("demo"), - contact_email="demo@notmyidea.org", - default_currency="EUR", - ) - db.session.add(project) - db.session.commit() + project = Project.create_demo_project() session[project.id] = True return redirect(url_for(".list_bills", project_id=project.id))