Skip to content
This repository was archived by the owner on Sep 3, 2025. It is now read-only.

Commit 57c7640

Browse files
authored
fix(feedback): store service id rather than schedule id (#5374)
1 parent 6b96299 commit 57c7640

File tree

4 files changed

+52
-24
lines changed

4 files changed

+52
-24
lines changed

src/dispatch/feedback/service/messaging.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def send_oncall_shift_feedback_message(
2222
*,
2323
project: Project,
2424
individual: IndividualContact,
25-
schedule_id: str,
25+
service_id: str,
2626
shift_end_at: str,
2727
schedule_name: str,
2828
reminder: Optional[ServiceFeedbackReminder] = None,
@@ -64,7 +64,7 @@ def send_oncall_shift_feedback_message(
6464
reminder_at=datetime.utcnow() + timedelta(hours=23),
6565
individual_contact_id=individual.id,
6666
project_id=project.id,
67-
schedule_id=schedule_id,
67+
schedule_id=service_id,
6868
schedule_name=schedule_name,
6969
shift_end_at=shift_end_at,
7070
details=[] if details is None else details,
@@ -75,7 +75,7 @@ def send_oncall_shift_feedback_message(
7575
items = [
7676
{
7777
"individual_name": individual.name,
78-
"oncall_schedule_id": schedule_id,
78+
"oncall_schedule_id": service_id,
7979
"oncall_service_name": schedule_name,
8080
"organization_slug": project.organization.slug,
8181
"project_id": project.id,

src/dispatch/feedback/service/scheduled.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
import logging
33
from datetime import datetime
44

5-
from dispatch.database.core import SessionLocal
5+
from sqlalchemy.orm import Session
6+
67
from dispatch.decorators import scheduled_project_task, timer
78
from dispatch.individual import service as individual_service
89
from dispatch.plugin import service as plugin_service
@@ -30,20 +31,20 @@
3031
@scheduler.add(every(1).day.at("16:00"), name="oncall-shift-feedback-ucan")
3132
@timer
3233
@scheduled_project_task
33-
def oncall_shift_feedback_ucan(db_session: SessionLocal, project: Project):
34+
def oncall_shift_feedback_ucan(db_session: Session, project: Project):
3435
oncall_shift_feedback(db_session=db_session, project=project, hour=16)
3536
find_expired_reminders_and_send(db_session=db_session, project=project)
3637

3738

3839
@scheduler.add(every(1).day.at("06:00"), name="oncall-shift-feedback-emea")
3940
@timer
4041
@scheduled_project_task
41-
def oncall_shift_feedback_emea(db_session: SessionLocal, project: Project):
42+
def oncall_shift_feedback_emea(db_session: Session, project: Project):
4243
oncall_shift_feedback(db_session=db_session, project=project, hour=6)
4344
find_expired_reminders_and_send(db_session=db_session, project=project)
4445

4546

46-
def find_expired_reminders_and_send(*, db_session: SessionLocal, project: Project):
47+
def find_expired_reminders_and_send(*, db_session: Session, project: Project):
4748
reminders = reminder_service.get_all_expired_reminders_by_project_id(
4849
db_session=db_session, project_id=project.id
4950
)
@@ -54,7 +55,7 @@ def find_expired_reminders_and_send(*, db_session: SessionLocal, project: Projec
5455
send_oncall_shift_feedback_message(
5556
project=project,
5657
individual=individual,
57-
schedule_id=reminder.schedule_id,
58+
service_id=reminder.schedule_id,
5859
shift_end_at=str(reminder.shift_end_at),
5960
schedule_name=reminder.schedule_name,
6061
reminder=reminder,
@@ -65,10 +66,11 @@ def find_expired_reminders_and_send(*, db_session: SessionLocal, project: Projec
6566

6667
def find_schedule_and_send(
6768
*,
68-
db_session: SessionLocal,
69+
db_session: Session,
6970
project: Project,
7071
oncall_plugin: PluginInstance,
7172
schedule_id: str,
73+
service_id: str,
7274
hour: int,
7375
):
7476
"""
@@ -133,15 +135,15 @@ def count_active_participants(participants):
133135
send_oncall_shift_feedback_message(
134136
project=project,
135137
individual=individual,
136-
schedule_id=schedule_id,
138+
service_id=service_id,
137139
shift_end_at=current_oncall["shift_end"],
138140
schedule_name=current_oncall["schedule_name"],
139141
details=details,
140142
db_session=db_session,
141143
)
142144

143145

144-
def oncall_shift_feedback(db_session: SessionLocal, project: Project, hour: int):
146+
def oncall_shift_feedback(db_session: Session, project: Project, hour: int):
145147
"""
146148
Experimental: collects feedback from individuals participating in an oncall service that has health metrics enabled
147149
when their oncall shift ends. For now, only for one project and schedule.
@@ -174,5 +176,6 @@ def oncall_shift_feedback(db_session: SessionLocal, project: Project, hour: int)
174176
project=project,
175177
oncall_plugin=oncall_plugin,
176178
schedule_id=schedule_id,
179+
service_id=external_id,
177180
hour=hour,
178181
)

src/dispatch/static/dispatch/src/feedback/service/TableFilterDialog.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414
<project-combobox v-model="local_project" label="Projects" />
1515
</v-list-item>
1616
<v-list-item>
17-
<service-select v-model="local_service" label="Oncall service" />
17+
<service-select
18+
v-model="local_service"
19+
:health-metrics="true"
20+
:project="local_project"
21+
label="Oncall service"
22+
/>
1823
</v-list-item>
1924
</v-list>
2025
<v-card-actions>

src/dispatch/static/dispatch/src/service/ServiceSelect.vue

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616
chips
1717
multiple
1818
closable-chips
19-
/>
19+
><template #append-item>
20+
<v-list-item v-if="more" @click="loadMore">
21+
<v-list-item-subtitle>Load More</v-list-item-subtitle>
22+
</v-list-item>
23+
</template>
24+
</v-combobox>
2025
</template>
2126

2227
<script>
2328
import { cloneDeep } from "lodash"
24-
29+
import { debounce } from "lodash"
2530
import SearchUtils from "@/search/utils"
2631
import ServiceApi from "@/service/api"
2732
@@ -48,9 +53,13 @@ export default {
4853
},
4954
},
5055
project: {
51-
type: [Object],
56+
type: Object,
5257
default: null,
5358
},
59+
healthMetrics: {
60+
type: Boolean,
61+
default: false,
62+
},
5463
},
5564
5665
data() {
@@ -59,6 +68,9 @@ export default {
5968
search: null,
6069
select: null,
6170
items: [],
71+
more: false,
72+
numItems: 5,
73+
total: 0,
6274
}
6375
},
6476
@@ -84,30 +96,38 @@ export default {
8496
},
8597
8698
methods: {
87-
fetchData() {
99+
loadMore() {
100+
this.numItems += 5
101+
this.fetchData()
102+
},
103+
fetchData: debounce(function () {
88104
this.error = null
89105
this.loading = "error"
90106
let filterOptions = {
91107
q: this.search,
92108
sortBy: ["name"],
93109
descending: [false],
110+
itemsPerPage: this.numItems,
111+
filters: { is_active: ["true"] },
94112
}
95113
96114
if (this.project) {
97-
filterOptions = {
98-
...filterOptions,
99-
filters: {
100-
project: [this.project],
101-
},
102-
}
103-
filterOptions = SearchUtils.createParametersFromTableOptions({ ...filterOptions })
115+
filterOptions.filters.project_id = this.project.map((p) => p.id)
104116
}
105117
118+
if (this.healthMetrics) {
119+
filterOptions.filters.health_metrics = ["true"]
120+
}
121+
122+
filterOptions = SearchUtils.createParametersFromTableOptions({ ...filterOptions })
123+
106124
ServiceApi.getAll(filterOptions).then((response) => {
107125
this.items = response.data.items
126+
this.total = response.data.total
127+
this.more = this.items.length < this.total
108128
this.loading = false
109129
})
110-
},
130+
}, 300),
111131
},
112132
created() {
113133
this.fetchData()

0 commit comments

Comments
 (0)