diff --git a/docs/contributing.rst b/docs/contributing.rst
index a810d121..b053f8b6 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -1,14 +1,14 @@
Contributing
############
-Setup a dev environment
+Set up a dev environment
=======================
-You must develop on top of the git master branch::
+You must develop on top of the Git master branch::
git clone https://github.com/spiral-project/ihatemoney.git
-Then you need to build your dev environments. Choose your way…
+Then you need to build your dev environment. Choose your way…
The quick way
-------------
@@ -43,7 +43,7 @@ It's as simple as that!
Updating
--------
-In case you want to update to newer versions (from git), you can just run the "update" command::
+In case you want to update to newer versions (from Git), you can just run the "update" command::
make update
@@ -57,7 +57,7 @@ database revision file::
make create-database-revision
If your changes are simple enough, the generated script will be populated with
-the necessary migrations steps. You can edit the generated script. eg: to add
+the necessary migrations steps. You can edit the generated script. e.g: To add
data migrations.
For complex migrations, it is recommended to start from an empty revision file
@@ -101,7 +101,7 @@ To do so::
make test
We are using the `black `_ formatter
-for all the python files in this project. Be sure to run it locally on your
+for all the Python files in this project. Be sure to run it locally on your
files. To do so, just run::
black ihatemoney
@@ -112,16 +112,16 @@ hook, for instance).
As a designer / Front-end developer
-----------------------------------
-Feel free to provide us mockups or to involve yourself into the discussions
-hapenning on the github issue tracker. All ideas are welcome. Of course, if you
+Feel free to provide mockups, or to involve yourself in the discussions
+happening on the GitHub issue tracker. All ideas are welcome. Of course, if you
know how to implement them, feel free to fork and make a pull request.
As a translator
---------------
If you're able to translate Ihatemoney in your own language,
-head over to `the website we use for translations `_
-and start translating!
+head over to `the website we use for translations `_
+and start translating.
All the heavy lifting will be done automatically, and your strings will
eventually be integrated.
@@ -134,7 +134,7 @@ End-user
You are using the application and found a bug? You have some ideas about how to
improve the project? Please tell us `by filling a new issue `_.
-Or, if you prefer, you can send me an email to `alexis@notmyidea.org` and I
+Or, if you prefer, you can send me an e-mail to `alexis@notmyidea.org` and I
will update the issue tracker with your feedback.
Thanks again!
@@ -150,7 +150,7 @@ Install doc dependencies (within the virtualenv, if any)::
pip install -r docs/requirements.txt
-And to produce html doc in `docs/_output` folder::
+And to produce a HTML doc in the `docs/_output` folder::
cd docs/
make html
diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py
index 89e7b919..79ab38bf 100644
--- a/ihatemoney/forms.py
+++ b/ihatemoney/forms.py
@@ -127,8 +127,11 @@ class EditProjectForm(FlaskForm):
class UploadForm(FlaskForm):
file = FileField(
- "JSON", validators=[FileRequired(), FileAllowed(["json", "JSON"], "JSON only!")]
+ "JSON",
+ validators=[FileRequired(), FileAllowed(["json", "JSON"], "JSON only!")],
+ description=_("Import previously exported JSON file"),
)
+ submit = SubmitField(_("Import"))
class ProjectForm(EditProjectForm):
diff --git a/ihatemoney/static/css/main.css b/ihatemoney/static/css/main.css
index aa266e10..cf47fdde 100644
--- a/ihatemoney/static/css/main.css
+++ b/ihatemoney/static/css/main.css
@@ -150,6 +150,11 @@ body {
margin-bottom: 20px;
margin-left: 25px;
}
+@media (max-width: 400px) {
+ .home .card {
+ min-width: unset;
+ }
+}
/* Other */
#bills {
@@ -180,7 +185,7 @@ footer {
padding: 45px 50px;
}
-@media (min-width: 768px) {
+@media (min-width: 1024px) {
footer {
padding-left: calc(25% + 50px);
}
@@ -320,13 +325,16 @@ footer .footer-left {
background: url("../images/see.png") no-repeat right;
}
-#bill_table, #monthly_stats, #history_table {
+#bill_table,
+#monthly_stats,
+#history_table {
margin-top: 30px;
margin-bottom: 30px;
}
@media (min-width: 768px) {
- .split_bills, #table_overflow.statistics {
+ .split_bills,
+ #table_overflow.statistics {
/* The table is shifted to left, so add the spacer width on the right to match */
width: calc(100% + 15px);
}
@@ -550,3 +558,13 @@ footer .icon svg {
#history_warnings {
margin-top: 30px;
}
+
+/* edit settings */
+
+.edit-project form {
+ margin-top: 1em;
+ margin-bottom: 3em;
+}
+.edit-project .custom-file {
+ margin-bottom: 2em;
+}
diff --git a/ihatemoney/templates/edit_project.html b/ihatemoney/templates/edit_project.html
index dcbbbc86..b7861c51 100644
--- a/ihatemoney/templates/edit_project.html
+++ b/ihatemoney/templates/edit_project.html
@@ -5,18 +5,43 @@
{
$(this).html("{{_("you sure?")}}");
});
+
+ $('.custom-file-input').on('change', function(event) {
+ var filename = [].slice.call(this.files).map(function (file) { return file.name}).join(',')
+ var $labelElement = $(this).parents('.custom-file').find('.custom-file-label')
+ $labelElement.text(filename)
+ })
{% endblock %}
{% block content %}
-{{ _("Edit project") }}
-
-
-
+
-
{{ _("Download project's data") }}
-
+
{{ _("Edit project") }}
+
+
+
+
{{ _("Import JSON") }}
+
+
+
{{ _("Download project's data") }}
@@ -51,5 +76,5 @@
{{ _('Download the list of transactions needed to settle the current bills.') }}
-
+
{% endblock %}
diff --git a/ihatemoney/templates/layout.html b/ihatemoney/templates/layout.html
index 449ab350..68119cec 100644
--- a/ihatemoney/templates/layout.html
+++ b/ihatemoney/templates/layout.html
@@ -48,7 +48,6 @@
{{ _("Statistics") }}
{{ _("History") }}
{{ _("Settings") }}
- {{ _("Import") }}
{% endblock %}
{% endif %}
diff --git a/ihatemoney/templates/upload_json.html b/ihatemoney/templates/upload_json.html
deleted file mode 100644
index 64aca0fe..00000000
--- a/ihatemoney/templates/upload_json.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% extends "layout.html" %}
-
-{% block content %}
- {{ _("Import JSON") }}
-
-
-
-{% endblock %}
diff --git a/ihatemoney/web.py b/ihatemoney/web.py
index 60cb8454..5bb6c54a 100644
--- a/ihatemoney/web.py
+++ b/ihatemoney/web.py
@@ -237,6 +237,8 @@ def authenticate(project_id=None):
# add the project on the top of the list
session["projects"].insert(0, (project_id, project.name))
session[project_id] = True
+ # Set session to permanent to make language choice persist
+ session.permanent = True
session.update()
setattr(g, "project", project)
return redirect(url_for(".list_bills"))
@@ -384,37 +386,37 @@ def reset_password():
@main.route("//edit", methods=["GET", "POST"])
def edit_project():
edit_form = EditProjectForm()
- if request.method == "POST":
- if edit_form.validate():
- project = edit_form.update(g.project)
- db.session.add(project)
- db.session.commit()
+ import_form = UploadForm()
+ # Import form
+ if import_form.validate_on_submit():
+ try:
+ import_project(import_form.file.data.stream, g.project)
+ flash(_("Project successfully uploaded"))
- return redirect(url_for(".list_bills"))
+ return redirect(url_for("main.list_bills"))
+ except ValueError:
+ flash(_("Invalid JSON"), category="error")
+
+ # Edit form
+ if edit_form.validate_on_submit():
+ project = edit_form.update(g.project)
+ db.session.add(project)
+ db.session.commit()
+
+ return redirect(url_for("main.list_bills"))
else:
edit_form.name.data = g.project.name
edit_form.logging_preferences.data = g.project.logging_preference
edit_form.contact_email.data = g.project.contact_email
return render_template(
- "edit_project.html", edit_form=edit_form, current_view="edit_project"
+ "edit_project.html",
+ edit_form=edit_form,
+ import_form=import_form,
+ current_view="edit_project",
)
-@main.route("//upload_json", methods=["GET", "POST"])
-def upload_json():
- form = UploadForm()
- if form.validate_on_submit():
- try:
- import_project(form.file.data.stream, g.project)
- flash(_("Project successfully uploaded"))
- except ValueError:
- flash(_("Invalid JSON"), category="error")
- return redirect(url_for("main.list_bills"))
-
- return render_template("upload_json.html", form=form)
-
-
def import_project(file, project):
json_file = json.load(file)