Package coprs :: Package views :: Package apiv3_ns :: Module apiv3_permissions
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.apiv3_ns.apiv3_permissions

  1  import flask 
  2   
  3  from coprs.views.apiv3_ns import apiv3_ns 
  4  from coprs.views.misc import api_login_required 
  5  from coprs.exceptions import ObjectNotFound, BadRequest 
  6  from coprs.helpers import PermissionEnum 
  7  from coprs.logic.coprs_logic import CoprPermissionsLogic 
  8  from coprs.mail import send_mail, PermissionRequestMessage, PermissionChangeMessage 
  9  from coprs import db_session_scope, models 
 10   
 11  from . import GET, PUT, editable_copr, get_copr 
12 13 14 @apiv3_ns.route("/project/permissions/get/<ownername>/<projectname>", methods=GET) 15 @api_login_required 16 @editable_copr 17 -def get_permissions(copr):
18 if not copr.copr_permissions: 19 raise ObjectNotFound( 20 "No permissions set on {0} project".format(copr.full_name)) 21 22 permissions = {} 23 for perm in copr.copr_permissions: 24 permissions[perm.user.name] = { 25 'admin': PermissionEnum(perm.copr_admin), 26 'builder': PermissionEnum(perm.copr_builder), 27 } 28 29 return flask.jsonify({'permissions': permissions})
30
31 32 @apiv3_ns.route("/project/permissions/set/<ownername>/<projectname>", methods=PUT) 33 @api_login_required 34 @editable_copr 35 -def set_permissions(copr):
36 permissions = flask.request.get_json() 37 if not isinstance(permissions, dict): 38 raise BadRequest( 39 "request is not a dictionary, expected format: " 40 "{'username': {'admin': 'nothing', 'builder': 'request'} ...}") 41 42 if not permissions: 43 raise BadRequest("no permission change requested") 44 45 updated = {} 46 messages = [] 47 with db_session_scope(): 48 for username, perm_set in permissions.items(): 49 user = models.User.query.filter_by(username=username).first() 50 if not user: 51 raise BadRequest("user '{0}' doesn't exist in database".format( 52 username)) 53 54 permission_dict = {} 55 for perm, state in perm_set.items(): 56 change = CoprPermissionsLogic.set_permissions( 57 flask.g.user, copr, user, perm, state) 58 if change: 59 updated[username] = True 60 permission_dict['old_'+perm] = change[0] 61 permission_dict['new_'+perm] = change[1] 62 63 if permission_dict: 64 msg = PermissionChangeMessage(copr, permission_dict) 65 messages.append({'address': user.mail, 'message': msg}) 66 67 # send emails only if transaction succeeded 68 for task in messages: 69 if flask.current_app.config.get("SEND_EMAILS", False): 70 send_mail(task['address'], task['message']) 71 72 return flask.jsonify({'updated': list(updated.keys())})
73
74 75 @apiv3_ns.route("/project/permissions/request/<ownername>/<projectname>", methods=PUT) 76 @api_login_required 77 -def request_permissions(ownername, projectname):
78 copr = get_copr(ownername, projectname) 79 roles = flask.request.get_json() 80 if not isinstance(roles, dict): 81 raise BadRequest("invalid 'roles' dict format, expected: " 82 "{'admin': True, 'builder': False}") 83 if not roles: 84 raise BadRequest("no permission requested") 85 86 permission_dict = {} 87 with db_session_scope(): 88 for permission, request_bool in roles.items(): 89 change = CoprPermissionsLogic.request_permission( 90 copr, flask.g.user, permission, request_bool) 91 if change: 92 permission_dict['old_'+permission] = change[0] 93 permission_dict['new_'+permission] = change[1] 94 95 if permission_dict: 96 msg = PermissionRequestMessage(copr, flask.g.user, permission_dict) 97 for address in copr.admin_mails: 98 if flask.current_app.config.get("SEND_EMAILS", False): 99 send_mail(address, msg) 100 101 return flask.jsonify({'updated': bool(permission_dict)})
102