You've already forked oncall
mirror of
https://github.com/linkedin/oncall.git
synced 2025-11-28 23:20:23 +02:00
filter oncall calendar by roles (#316)
* filter oncall calendar by roles 1. added role filtering to user/team calendar events 2. pass along roles from url parameters * abstract get_roles_ids into another function
This commit is contained in:
@@ -16,18 +16,19 @@ def on_get(req, resp, key):
|
|||||||
information. Key can be requested at /api/v0/ical_key.
|
information. Key can be requested at /api/v0/ical_key.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
roles = req.get_param_as_list('roles')
|
||||||
|
|
||||||
name_and_type = get_name_and_type_from_key(key)
|
name_and_type = get_name_and_type_from_key(key)
|
||||||
if name_and_type is None:
|
if name_and_type is None:
|
||||||
raise HTTPNotFound()
|
raise HTTPNotFound()
|
||||||
|
|
||||||
name, type = name_and_type
|
name, type = name_and_type
|
||||||
start = int(time.time())
|
start = int(time.time())
|
||||||
|
events = []
|
||||||
if type == 'user':
|
if type == 'user':
|
||||||
events = get_user_events(name, start)
|
events = get_user_events(name, start, roles=roles)
|
||||||
elif type == 'team':
|
elif type == 'team':
|
||||||
events = get_team_events(name, start, include_subscribed=True)
|
events = get_team_events(name, start, roles=roles, include_subscribed=True)
|
||||||
else: # should not happen
|
|
||||||
events = []
|
|
||||||
|
|
||||||
resp.body = ical.events_to_ical(events, name, contact=False)
|
resp.body = ical.events_to_ical(events, name, contact=False)
|
||||||
resp.set_header('Content-Type', 'text/calendar')
|
resp.set_header('Content-Type', 'text/calendar')
|
||||||
|
|||||||
@@ -31,6 +31,17 @@ constraints = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_role_ids(cursor, roles):
|
||||||
|
if not roles:
|
||||||
|
return []
|
||||||
|
|
||||||
|
role_query = 'SELECT DISTINCT `id` FROM `role` WHERE `name` IN ({0})'.format(
|
||||||
|
','.join(['%s'] * len(roles)))
|
||||||
|
# we need prepared statements here because roles come from user input
|
||||||
|
cursor.execute(role_query, roles)
|
||||||
|
return [row['id'] for row in cursor]
|
||||||
|
|
||||||
|
|
||||||
def on_get(req, resp):
|
def on_get(req, resp):
|
||||||
"""
|
"""
|
||||||
Role search.
|
Role search.
|
||||||
|
|||||||
@@ -3,14 +3,20 @@
|
|||||||
|
|
||||||
import time
|
import time
|
||||||
from . import ical
|
from . import ical
|
||||||
|
from .roles import get_role_ids
|
||||||
from ... import db
|
from ... import db
|
||||||
|
|
||||||
|
|
||||||
def get_team_events(team, start, include_subscribed=False):
|
def get_team_events(team, start, roles=None, include_subscribed=False):
|
||||||
connection = db.connect()
|
connection = db.connect()
|
||||||
cursor = connection.cursor(db.DictCursor)
|
cursor = connection.cursor(db.DictCursor)
|
||||||
|
|
||||||
|
role_condition = ''
|
||||||
|
role_ids = get_role_ids(cursor, roles)
|
||||||
|
if role_ids:
|
||||||
|
role_condition = ' AND `event`.`role_id` IN ({0})'.format(
|
||||||
|
','.join(map(str, role_ids)))
|
||||||
|
|
||||||
team_condition = "`team`.`name` = %s"
|
team_condition = "`team`.`name` = %s"
|
||||||
if include_subscribed:
|
if include_subscribed:
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
@@ -40,10 +46,9 @@ def get_team_events(team, start, include_subscribed=False):
|
|||||||
JOIN `role` ON `event`.`role_id` = `role`.`id`
|
JOIN `role` ON `event`.`role_id` = `role`.`id`
|
||||||
WHERE
|
WHERE
|
||||||
`event`.`end` > %s AND
|
`event`.`end` > %s AND
|
||||||
''' + team_condition
|
''' + team_condition + role_condition
|
||||||
|
|
||||||
cursor.execute(
|
cursor.execute(query, (start, team))
|
||||||
query, (start, team))
|
|
||||||
|
|
||||||
events = cursor.fetchall()
|
events = cursor.fetchall()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
@@ -73,10 +78,11 @@ def on_get(req, resp, team):
|
|||||||
contact = req.get_param_as_bool('contact')
|
contact = req.get_param_as_bool('contact')
|
||||||
if contact is None:
|
if contact is None:
|
||||||
contact = True
|
contact = True
|
||||||
|
roles = req.get_param_as_list('roles')
|
||||||
include_sub = req.get_param_as_bool('include_subscribed')
|
include_sub = req.get_param_as_bool('include_subscribed')
|
||||||
if include_sub is None:
|
if include_sub is None:
|
||||||
include_sub = True
|
include_sub = True
|
||||||
|
|
||||||
events = get_team_events(team, start, include_subscribed=include_sub)
|
events = get_team_events(team, start, roles=roles, include_subscribed=include_sub)
|
||||||
resp.body = ical.events_to_ical(events, team, contact)
|
resp.body = ical.events_to_ical(events, team, contact)
|
||||||
resp.set_header('Content-Type', 'text/calendar')
|
resp.set_header('Content-Type', 'text/calendar')
|
||||||
|
|||||||
@@ -3,15 +3,21 @@
|
|||||||
|
|
||||||
import time
|
import time
|
||||||
from . import ical
|
from . import ical
|
||||||
|
from .roles import get_role_ids
|
||||||
from ... import db
|
from ... import db
|
||||||
|
|
||||||
|
|
||||||
def get_user_events(user_name, start):
|
def get_user_events(user_name, start, roles=None):
|
||||||
connection = db.connect()
|
connection = db.connect()
|
||||||
cursor = connection.cursor(db.DictCursor)
|
cursor = connection.cursor(db.DictCursor)
|
||||||
|
|
||||||
cursor.execute(
|
role_condition = ''
|
||||||
'''
|
role_ids = get_role_ids(cursor, roles)
|
||||||
|
if role_ids:
|
||||||
|
role_condition = ' AND `event`.`role_id` IN ({0})'.format(
|
||||||
|
','.join(map(str, role_ids)))
|
||||||
|
|
||||||
|
query = '''
|
||||||
SELECT
|
SELECT
|
||||||
`event`.`id`,
|
`event`.`id`,
|
||||||
`team`.`name` AS team,
|
`team`.`name` AS team,
|
||||||
@@ -26,8 +32,9 @@ def get_user_events(user_name, start):
|
|||||||
WHERE
|
WHERE
|
||||||
`event`.`end` > %s AND
|
`event`.`end` > %s AND
|
||||||
`user`.`name` = %s
|
`user`.`name` = %s
|
||||||
''',
|
''' + role_condition
|
||||||
(start, user_name))
|
|
||||||
|
cursor.execute(query, (start, user_name))
|
||||||
|
|
||||||
events = cursor.fetchall()
|
events = cursor.fetchall()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
@@ -58,7 +65,8 @@ def on_get(req, resp, user_name):
|
|||||||
contact = req.get_param_as_bool('contact')
|
contact = req.get_param_as_bool('contact')
|
||||||
if contact is None:
|
if contact is None:
|
||||||
contact = True
|
contact = True
|
||||||
|
roles = req.get_param_as_list('roles')
|
||||||
|
|
||||||
events = get_user_events(user_name, start)
|
events = get_user_events(user_name, start, roles=roles)
|
||||||
resp.body = ical.events_to_ical(events, user_name, contact)
|
resp.body = ical.events_to_ical(events, user_name, contact)
|
||||||
resp.set_header('Content-Type', 'text/calendar')
|
resp.set_header('Content-Type', 'text/calendar')
|
||||||
|
|||||||
Reference in New Issue
Block a user