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 -*- # -*- coding: utf-8 -*-
from flask import Blueprint, request from flask import Blueprint, request
from flask_rest import RESTResource, need_auth from flask_rest import RESTResource, need_auth
from wtforms.fields.core import BooleanField
from ihatemoney.models import db, Project, Person, Bill from ihatemoney.models import db, Project, Person, Bill
from ihatemoney.forms import (ProjectForm, EditProjectForm, MemberForm, from ihatemoney.forms import (ProjectForm, EditProjectForm, MemberForm,
@ -58,6 +59,18 @@ class ProjectHandler(object):
return 400, form.errors 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): class MemberHandler(object):
def get(self, project, member_id): def get(self, project, member_id):
@ -79,7 +92,7 @@ class MemberHandler(object):
return 400, form.errors return 400, form.errors
def update(self, project, member_id): 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(): if form.validate():
member = Person.query.get(member_id, project) member = Person.query.get(member_id, project)
form.save(project, member) form.save(project, member)

View file

@ -1182,6 +1182,30 @@ class APITestCase(IhatemoneyTestCase):
self.assertStatus(200, req) 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 # delete a member
req = self.client.delete("/api/projects/raclette/members/1", req = self.client.delete("/api/projects/raclette/members/1",