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") }}

-

-

- {{ forms.edit_project(edit_form) }} -
-

+
-

{{ _("Download project's data") }}

-

+

{{ _("Edit project") }}

+
+ {{ forms.edit_project(edit_form) }} +
+ + +

{{ _("Import JSON") }}

+
+ {{ import_form.hidden_tag() }} + +
+
+ {{ import_form.file(class="custom-file-input") }} + + {{ import_form.file.description }} + +
+ +
+ +
+ {{ import_form.submit(class="btn btn-primary") }} +
+
+ +

{{ _("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 @@ - {% 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") }}

-

-

- {{ forms.upload_json(form) }} -
-

-{% 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)