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):
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
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