Allow to disable/enable member via API (#301)

Disable was already (kind-of) possible via API via DELETE, but not re-enabling.

Kudos to @almet for helping me fixing that damn BooleanField :-)
This commit is contained in:
JocelynDelalande 2017-12-29 18:07:39 +01:00 committed by Alexis Metaireau
parent 40e5a833a1
commit c002cdbf94
2 changed files with 38 additions and 1 deletions

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from flask import Blueprint, request
from flask_rest import RESTResource, need_auth
from wtforms.fields.core import BooleanField
from ihatemoney.models import db, Project, Person, Bill
from ihatemoney.forms import (ProjectForm, EditProjectForm, MemberForm,
@ -58,6 +59,18 @@ class ProjectHandler(object):
return 400, form.errors
class APIMemberForm(MemberForm):
""" Member is not disablable via a Form.
But we want Member.enabled to be togglable via the API.
"""
activated = BooleanField(false_values=('false', '', 'False'))
def save(self, project, person):
person.activated = self.activated.data
return super(APIMemberForm, self).save(project, person)
class MemberHandler(object):
def get(self, project, member_id):
@ -79,7 +92,7 @@ class MemberHandler(object):
return 400, form.errors
def update(self, project, member_id):
form = MemberForm(project, meta={'csrf': False}, edit=True)
form = APIMemberForm(project, meta={'csrf': False}, edit=True)
if form.validate():
member = Person.query.get(member_id, project)
form.save(project, member)

View file

@ -1182,6 +1182,30 @@ class APITestCase(IhatemoneyTestCase):
self.assertStatus(200, req)
# de-activate the user
req = self.client.put("/api/projects/raclette/members/1", data={
"name": "Fred",
"activated": False,
}, headers=self.get_auth("raclette"))
self.assertStatus(200, req)
req = self.client.get("/api/projects/raclette/members/1",
headers=self.get_auth("raclette"))
self.assertStatus(200, req)
self.assertEqual(False, json.loads(req.data.decode('utf-8'))["activated"])
# re-activate the user
req = self.client.put("/api/projects/raclette/members/1", data={
"name": "Fred",
"activated": True,
}, headers=self.get_auth("raclette"))
req = self.client.get("/api/projects/raclette/members/1",
headers=self.get_auth("raclette"))
self.assertStatus(200, req)
self.assertEqual(True, json.loads(req.data.decode('utf-8'))["activated"])
# delete a member
req = self.client.delete("/api/projects/raclette/members/1",