mirror of
https://github.com/YunoHost-Apps/ihatemoney_ynh.git
synced 2024-09-03 19:26:15 +02:00
Invite people after project creation.
Uses the flask-mail extension.
This commit is contained in:
parent
93818d9aba
commit
87ea045059
6 changed files with 72 additions and 5 deletions
|
@ -2,3 +2,5 @@ DEBUG = True
|
||||||
SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
|
SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
|
||||||
SQLACHEMY_ECHO = DEBUG
|
SQLACHEMY_ECHO = DEBUG
|
||||||
SECRET_KEY = "tralala"
|
SECRET_KEY = "tralala"
|
||||||
|
|
||||||
|
DEFAULT_MAIL_SENDER = ("Budget manager", "budget@notmyidea.org")
|
||||||
|
|
|
@ -47,3 +47,13 @@ class MemberForm(Form):
|
||||||
if Person.query.filter(Person.name == field.data)\
|
if Person.query.filter(Person.name == field.data)\
|
||||||
.filter(Person.project == form.project).all():
|
.filter(Person.project == form.project).all():
|
||||||
raise ValidationError("This project already have this member")
|
raise ValidationError("This project already have this member")
|
||||||
|
|
||||||
|
class InviteForm(Form):
|
||||||
|
emails = TextAreaField("People to notify")
|
||||||
|
submit = SubmitField("Send invites")
|
||||||
|
|
||||||
|
def validate_emails(form, field):
|
||||||
|
validator = Email()
|
||||||
|
for email in [email.strip() for email in form.emails.data.split(",")]:
|
||||||
|
if not validator.regex.match(email):
|
||||||
|
raise ValidationError("The email %s is not valid" % email)
|
||||||
|
|
5
budget/templates/display_errors.html
Normal file
5
budget/templates/display_errors.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{% for errors in form.errors.values() %}
|
||||||
|
{% for error in errors %}
|
||||||
|
<p class="error">{{error}}</p>
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
10
budget/templates/invitation_mail
Normal file
10
budget/templates/invitation_mail
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
Someone using the email adress {{ email }} invited you to share your expenses for {{ project.name }} on our application.
|
||||||
|
|
||||||
|
It's as simple as saying what did you paid for, for who, and how much did it cost you, we are caring about the rest.
|
||||||
|
|
||||||
|
You can access it here: {{ SITE_URL }}{{ url_for("list_bills", project_id=project.id) }}, the password is "{{ project.password }}".
|
||||||
|
|
||||||
|
Enjoy,
|
||||||
|
Some weird guys
|
14
budget/templates/send_invites.html
Normal file
14
budget/templates/send_invites.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<h2>Invite people to join this project</h2>
|
||||||
|
<p>Specify a (coma separated) list of email adresses you want to notify about the
|
||||||
|
creation of this budget management project and we will send them an email for you.</p>
|
||||||
|
<p>If you prefer, you can <a href="{{ url_for("list_bills", project_id=project.id) }}">skip this step</a> and notify them yourself</p>
|
||||||
|
|
||||||
|
{% include "display_errors.html" %}
|
||||||
|
<form method="post" accept-charset="utf-8">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<p>{{ form.emails.label }}<br /> {{ form.emails }}</p>
|
||||||
|
<p>{{ form.submit }} <a href="{{ url_for("list_bills", project_id=project.id) }}">No, thanks</a></p>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
|
@ -1,12 +1,15 @@
|
||||||
from flask import Flask, session, request, redirect, url_for, render_template
|
from flask import (Flask, session, request, redirect, url_for, render_template,
|
||||||
|
flash)
|
||||||
|
from flaskext.mail import Mail, Message
|
||||||
|
|
||||||
# local modules
|
# local modules
|
||||||
from models import db, Project, Person, Bill
|
from models import db, Project, Person, Bill
|
||||||
from forms import ProjectForm, AuthenticationForm, BillForm, MemberForm
|
from forms import ProjectForm, AuthenticationForm, BillForm, MemberForm, InviteForm
|
||||||
from utils import get_billform_for, requires_auth
|
from utils import get_billform_for, requires_auth
|
||||||
|
|
||||||
# create the application, initialize stuff
|
# create the application, initialize stuff
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
mail = Mail()
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def home():
|
def home():
|
||||||
|
@ -23,6 +26,7 @@ def authenticate(redirect_url=None):
|
||||||
redirect_url = redirect_url or url_for("list_bills", project_id=project_id)
|
redirect_url = redirect_url or url_for("list_bills", project_id=project_id)
|
||||||
project = Project.query.get(project_id)
|
project = Project.query.get(project_id)
|
||||||
if not project:
|
if not project:
|
||||||
|
flash("This project doesn't exist (yet). You can create it by filling this form")
|
||||||
return redirect(url_for("create_project", project_id=project_id))
|
return redirect(url_for("create_project", project_id=project_id))
|
||||||
|
|
||||||
# if credentials are already in session, redirect
|
# if credentials are already in session, redirect
|
||||||
|
@ -35,6 +39,8 @@ def authenticate(redirect_url=None):
|
||||||
if not form.password.data == project.password:
|
if not form.password.data == project.password:
|
||||||
form.errors['password'] = ["The password is not the right one"]
|
form.errors['password'] = ["The password is not the right one"]
|
||||||
else:
|
else:
|
||||||
|
# maintain a list of visited projects
|
||||||
|
session["projects"].append(project_id)
|
||||||
session[project_id] = form.password.data
|
session[project_id] = form.password.data
|
||||||
session.update()
|
session.update()
|
||||||
return redirect(redirect_url)
|
return redirect(redirect_url)
|
||||||
|
@ -69,11 +75,27 @@ def quit():
|
||||||
session.clear()
|
session.clear()
|
||||||
return redirect(url_for("home"))
|
return redirect(url_for("home"))
|
||||||
|
|
||||||
@app.route("/<string:project_id>/invite")
|
@app.route("/<string:project_id>/invite", methods=["GET", "POST"])
|
||||||
@requires_auth
|
@requires_auth
|
||||||
def invite(project):
|
def invite(project):
|
||||||
# FIXME create a real page: form + send emails
|
|
||||||
return "invite ppl"
|
form = InviteForm()
|
||||||
|
|
||||||
|
if request.method == "POST":
|
||||||
|
if form.validate():
|
||||||
|
# send the email
|
||||||
|
|
||||||
|
message_body = render_template("invitation_mail",
|
||||||
|
email=project.contact_email, project=project)
|
||||||
|
|
||||||
|
message_title = "You have been invited to share your expenses for %s" % project.name
|
||||||
|
msg = Message(message_title,
|
||||||
|
body=message_body,
|
||||||
|
recipients=[email.strip() for email in form.emails.data.split(",")])
|
||||||
|
mail.send(msg)
|
||||||
|
return redirect(url_for("list_bills", project_id=project.id))
|
||||||
|
|
||||||
|
return render_template("send_invites.html", form=form, project=project)
|
||||||
|
|
||||||
@app.route("/<string:project_id>/")
|
@app.route("/<string:project_id>/")
|
||||||
@requires_auth
|
@requires_auth
|
||||||
|
@ -173,10 +195,14 @@ def debug():
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app.config.from_object("default_settings")
|
app.config.from_object("default_settings")
|
||||||
|
# db
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
db.app = app
|
db.app = app
|
||||||
db.create_all()
|
db.create_all()
|
||||||
|
|
||||||
|
# mail
|
||||||
|
mail.init_app(app)
|
||||||
|
|
||||||
app.run(host="0.0.0.0", debug=True)
|
app.run(host="0.0.0.0", debug=True)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in a new issue