Lunching for groups.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
3.6 KiB

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""Group management."""
11 years ago
import logging
from flask import Blueprint
11 years ago
from flask import request
from flask import jsonify
11 years ago
from sqlalchemy.exc import IntegrityError
from luncho.helpers import ForceJSON
from luncho.helpers import user_from_token
from luncho.server import User
11 years ago
from luncho.server import Group
from luncho.server import db
from luncho.exceptions import LunchoException
from luncho.exceptions import ElementNotFoundException
class AccountNotVerifiedException(LunchoException):
"""The account isn't verified."""
def __init__(self):
super(AccountNotVerifiedException, self).__init__()
self.status = 412
self.message = 'Account not verified'
class NewMaintainerDoesNotExistException(LunchoException):
"""The account for the new maintainer does not exist."""
def __init__(self):
super(NewMaintainerDoesNotExistException, self).__init__()
self.status = 401
self.message = 'New maintainer not found'
class UserIsNotAdminException(LunchoException):
"""The user is not the admin of the group."""
def __init__(self):
super(UserIsNotAdminException, self).__init__()
self.status = 401
self.message = 'User is not admin'
groups = Blueprint('groups', __name__)
11 years ago
LOG = logging.getLogger('luncho.blueprints.groups')
@groups.route('<token>/', methods=['GET'])
def user_groups(token):
"""Return a list of the groups the user belongs or it's the owner."""
11 years ago
(user, error) = user_or_error(token)
if error:
return error
groups = {}
for group in user.groups:
groups[group.id] = {'id': group.id,
'name': group.name,
'admin': group.owner == user.username}
return jsonify(status='OK',
groups=groups.values())
11 years ago
11 years ago
@groups.route('<token>/', methods=['PUT'])
@ForceJSON(required=['name'])
def create_group(token):
"""Create a new group belonging to the user."""
user = user_from_token(token)
11 years ago
LOG.debug('User status: {verified}'.format(verified=user.verified))
if not user.verified:
raise AccountNotVerifiedException()
11 years ago
json = request.get_json(force=True)
11 years ago
new_group = Group(name=json['name'],
owner=user.username)
11 years ago
11 years ago
LOG.debug('Current user groups: {groups}'.format(groups=user.groups))
user.groups.append(new_group)
11 years ago
11 years ago
db.session.add(new_group)
db.session.commit()
11 years ago
return jsonify(status='OK',
id=new_group.id)
11 years ago
@groups.route('<token>/<groupId>/', methods=['POST'])
@ForceJSON()
def update_group(token, groupId):
"""Update group information."""
user = user_from_token(token)
11 years ago
group = Group.query.get(groupId)
if not group:
raise ElementNotFoundException('Group')
11 years ago
11 years ago
LOG.debug('Group = {group}'.format(group=group))
11 years ago
json = request.get_json(force=True)
if 'name' in json:
group.name = json['name']
if 'maintainer' in json:
new_maintainer = User.query.get(json['maintainer'])
if not new_maintainer:
raise NewMaintainerDoesNotExistException()
11 years ago
group.owner = new_maintainer.username
db.session.commit()
return jsonify(status='OK')
11 years ago
@groups.route('<token>/<groupId>/', methods=['DELETE'])
def delete_group(token, groupId):
"""Delete a group."""
user = user_from_token(token)
11 years ago
group = Group.query.get(groupId)
if not group:
raise ElementNotFoundException('Group')
11 years ago
if not group.owner == user.username:
raise UserIsNotAdminException()
11 years ago
db.session.delete(group)
db.session.commit()
return jsonify(status='OK')