Coverage for rfpy/vendor/api/workflow.py: 100%
31 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-24 10:52 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-24 10:52 +0000
1"""
2Team Workflow methods. Allocate and track responsibility for answering questions.
3"""
5from sqlalchemy.orm import Bundle, Session
7from rfpy.model import Section, QuestionInstance, QuestionResponseState, User
8from rfpy.suxint import http
9from rfpy.api import fetch
10from rfpy.web import serial
11from rfpy.auth import perms
12from rfpy.vendor.validation import validate
15QRB = QuestionResponseState
16QResBundle: Bundle = Bundle(
17 "qresponse_bundle",
18 QRB.status,
19 QRB.allocated_by,
20 QRB.allocated_to,
21 QRB.approved_by,
22 QRB.date_updated,
23 QRB.updated_by,
24 QuestionInstance.number,
25 QuestionInstance.id.label("question_instance_id"),
26 single_entity=True,
27)
30@http
31def get_issue_section_workflow(
32 session, effective_user, issue_id, section_id, pager
33) -> serial.WorkflowSection:
34 issue = fetch.issue(session, issue_id)
35 section = session.get(Section, section_id)
36 pager.pagesize = 20
38 # ownership of section should be checked in validate below
39 validate(effective_user, issue, section=section)
41 q = (
42 session.query(QResBundle)
43 .join(QuestionInstance)
44 .filter(
45 QuestionInstance.number.startswith(section.number),
46 QuestionResponseState.issue_id == issue_id,
47 )
48 )
50 qlist = []
52 for row in q.slice(pager.startfrom, pager.goto):
53 r_dict = row._asdict()
54 r_dict["number"] = row.number.dotted
55 qlist.append(r_dict)
57 return serial.WorkflowSection(
58 section=serial.Section(
59 title=section.title,
60 number=section.number.dotted,
61 id=section.id,
62 description=section.description,
63 parent_id=section.parent_id,
64 ),
65 questions=qlist,
66 count=q.count(),
67 )
70@http
71def post_issue_allocate(
72 session: Session,
73 effective_user: User,
74 issue_id: int,
75 allocation_doc: serial.AllocatedToList,
76) -> None:
77 issue = fetch.issue(session, issue_id)
78 validate(effective_user, issue, action=perms.ALLOCATE_QUESTIONS)
79 qlookup = {a.question_instance_id: a.allocated_to for a in allocation_doc}
80 q = (
81 session.query(QuestionResponseState)
82 .filter(QuestionResponseState.issue_id == issue_id)
83 .filter(QuestionResponseState.question_instance_id.in_(qlookup.keys()))
84 )
86 for qrs in q:
87 qrs.allocated_to = qlookup[qrs.question_instance_id]
88 qrs.allocated_by = effective_user.id