diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py index 79ab38bf..aed0c97a 100644 --- a/ihatemoney/forms.py +++ b/ihatemoney/forms.py @@ -1,7 +1,7 @@ from flask_wtf.form import FlaskForm from wtforms.fields.core import SelectField, SelectMultipleField from wtforms.fields.html5 import DateField, DecimalField, URLField -from wtforms.fields.simple import PasswordField, SubmitField, StringField +from wtforms.fields.simple import PasswordField, SubmitField, StringField, BooleanField from wtforms.validators import ( Email, DataRequired, @@ -89,25 +89,28 @@ class EditProjectForm(FlaskForm): name = StringField(_("Project name"), validators=[DataRequired()]) password = StringField(_("Private code"), validators=[DataRequired()]) contact_email = StringField(_("Email"), validators=[DataRequired(), Email()]) - logging_preferences = SelectField( - _("Logging Preferences"), - choices=LoggingMode.choices(), - coerce=LoggingMode.coerce, - default=LoggingMode.default(), - validators=[DataRequired()], - ) + project_history = BooleanField(_("Enable project history")) + ip_recording = BooleanField(_("Use IP tracking for project history")) def save(self): """Create a new project with the information given by this form. Returns the created instance """ + if not self.project_history.data: + new_logging_preference = LoggingMode.DISABLED + else: + if self.ip_recording.data: + new_logging_preference = LoggingMode.RECORD_IP + else: + new_logging_preference = LoggingMode.ENABLED + project = Project( name=self.name.data, id=self.id.data, password=generate_password_hash(self.password.data), contact_email=self.contact_email.data, - logging_preference=self.logging_preferences.data, + logging_preference=new_logging_preference, ) return project @@ -120,7 +123,16 @@ class EditProjectForm(FlaskForm): project.password = generate_password_hash(self.password.data) project.contact_email = self.contact_email.data - project.logging_preference = self.logging_preferences.data + + if not self.project_history.data: + new_logging_preference = LoggingMode.DISABLED + else: + if self.ip_recording.data: + new_logging_preference = LoggingMode.RECORD_IP + else: + new_logging_preference = LoggingMode.ENABLED + + project.logging_preference = new_logging_preference return project @@ -139,6 +151,14 @@ class ProjectForm(EditProjectForm): password = PasswordField(_("Private code"), validators=[DataRequired()]) submit = SubmitField(_("Create the project")) + def save(self): + # WTForms Boolean Fields don't insert the default value when the + # request doesn't include any value the way that other fields do, + # so we'll manually do it here + self.project_history.data = LoggingMode.default() != LoggingMode.DISABLED + self.ip_recording.data = LoggingMode.default() == LoggingMode.RECORD_IP + return super().save() + def validate_id(form, field): form.id.data = slugify(field.data) if (form.id.data == "dashboard") or Project.query.get(form.id.data): diff --git a/ihatemoney/static/js/ihatemoney.js b/ihatemoney/static/js/ihatemoney.js index 8a7145df..036545e8 100644 --- a/ihatemoney/static/js/ihatemoney.js +++ b/ihatemoney/static/js/ihatemoney.js @@ -4,47 +4,4 @@ function selectCheckboxes(value){ for(var i = 0; i < els.length; i++){ els[i].checked = value; } -} - -function updateCheckBoxesFromPrivacySelect() { - var history_checkbox = document.getElementById('logging_enabled'); - var record_ip_checkbox = document.getElementById('record_ip'); - var record_ip_checkbox_text = document.getElementById("record_ip_label"); - var select_input = document.getElementById("logging_preferences"); - - if (select_input.selectedIndex === 0) { - history_checkbox.checked = false; - record_ip_checkbox.checked = false; - record_ip_checkbox.disabled = true; - record_ip_checkbox_text.classList.add("text-muted"); - } else if (select_input.selectedIndex === 1 || select_input.selectedIndex === 2) { - history_checkbox.checked = true; - record_ip_checkbox.disabled = false; - record_ip_checkbox_text.classList.remove("text-muted"); - if (select_input.selectedIndex === 2) { - record_ip_checkbox.checked = true - } - } -} - -function updatePrivacySelectFromCheckBoxes() { - var history_checkbox = document.getElementById('logging_enabled'); - var record_ip_checkbox = document.getElementById('record_ip'); - var record_ip_checkbox_text = document.getElementById("record_ip_label"); - var select_input = document.getElementById("logging_preferences"); - - if (!history_checkbox.checked) { - record_ip_checkbox.checked = false; - record_ip_checkbox.disabled = true; - record_ip_checkbox_text.classList.add("text-muted"); - select_input.selectedIndex = 0 - } else { - record_ip_checkbox.disabled = false; - record_ip_checkbox_text.classList.remove("text-muted"); - if (record_ip_checkbox.checked){ - select_input.selectedIndex = 2 - } else { - select_input.selectedIndex = 1 - } - } } \ No newline at end of file diff --git a/ihatemoney/templates/forms.html b/ihatemoney/templates/forms.html index 7401a80b..33a283f2 100644 --- a/ihatemoney/templates/forms.html +++ b/ihatemoney/templates/forms.html @@ -20,6 +20,16 @@ {% endmacro %} +{% macro checkbox(field) %} +
+ {{ field(id=field.name) }} + + {% if field.description %} + {{ field.description }} + {% endif %} +
+{% endmacro %} + {% macro submit(field, cancel=False, home=False) -%}
@@ -81,20 +91,8 @@
-
- - -
-
-
- - -
-
-
-
- {{ form.logging_preferences }} - + {{ checkbox(form.project_history) }} + {{ checkbox(form.ip_recording) }}
diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index 84b212a2..897045ee 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -2276,9 +2276,13 @@ class HistoryTestCase(IhatemoneyTestCase): "name": "demo", "contact_email": "demo@notmyidea.org", "password": "demo", - "logging_preferences": logging_preference.value, } + if logging_preference != LoggingMode.DISABLED: + new_data["project_history"] = "y" + if logging_preference == LoggingMode.RECORD_IP: + new_data["ip_recording"] = "y" + # Disable History resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True) self.assertEqual(resp.status_code, 200) @@ -2286,11 +2290,17 @@ class HistoryTestCase(IhatemoneyTestCase): resp = self.client.get("/demo/edit") self.assertEqual(resp.status_code, 200) - self.assertIn( - '' - % (logging_preference.value, logging_preference.name), - resp.data.decode("utf-8"), - ) + if logging_preference == LoggingMode.DISABLED: + self.assertIn('ENABLED', resp.data.decode("utf-8") + '', + resp.data.decode("utf-8"), ) self.change_privacy_to(LoggingMode.DISABLED) @@ -2415,10 +2427,14 @@ class HistoryTestCase(IhatemoneyTestCase): "name": "demo2", "contact_email": "demo2@notmyidea.org", "password": "123456", - "logging_preferences": logging_mode.value, - # Keep privacy settings where they were } + # Keep privacy settings where they were + if logging_mode != LoggingMode.DISABLED: + new_data["project_history"] = "y" + if logging_mode == LoggingMode.RECORD_IP: + new_data["ip_recording"] = "y" + resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True) self.assertEqual(resp.status_code, 200) diff --git a/ihatemoney/web.py b/ihatemoney/web.py index e1e0eb8b..744d1bfa 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -406,7 +406,12 @@ def edit_project(): return redirect(url_for("main.list_bills")) else: edit_form.name.data = g.project.name - edit_form.logging_preferences.data = g.project.logging_preference + + if g.project.logging_preference != LoggingMode.DISABLED: + edit_form.project_history.data = True + if g.project.logging_preference == LoggingMode.RECORD_IP: + edit_form.ip_recording.data = True + edit_form.contact_email.data = g.project.contact_email return render_template(