templates.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from uuid import UUID
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from sqlalchemy import delete
  4. from sqlalchemy.orm import Session
  5. from app.api import deps
  6. from app.api.utils import update_object_from_payload, verify_id_list
  7. from app.models import (
  8. Project,
  9. SlotTag,
  10. SlotTemplate,
  11. User,
  12. association_table_template_tags,
  13. )
  14. from app.schemas.requests import TemplateCreateRequest, TemplateUpdateRequest
  15. from app.schemas.responses import TemplateResponse
  16. router = APIRouter()
  17. @router.get("/project/{project_id}/templates", response_model=list[TemplateResponse])
  18. async def list_project_templates(
  19. project_id: UUID,
  20. current_user: User = Depends(deps.get_current_user),
  21. session: Session = Depends(deps.get_session),
  22. ):
  23. """List slots from project"""
  24. p = session.get(Project, project_id)
  25. if p is None:
  26. raise HTTPException(status_code=404, detail="Project not found")
  27. return p.templates
  28. @router.post("/project/{project_id}/template", response_model=TemplateResponse)
  29. async def create_template(
  30. project_id: UUID,
  31. payload: TemplateCreateRequest,
  32. current_user: User = Depends(deps.get_current_user),
  33. session: Session = Depends(deps.get_session),
  34. ):
  35. """Create a new template to the project"""
  36. p = session.get(Project, project_id)
  37. if p is None:
  38. raise HTTPException(status_code=404, detail="Project not found")
  39. template = SlotTemplate(project_id=p.id, title=payload.title)
  40. session.add(template)
  41. session.commit()
  42. dic = payload.model_dump(exclude_unset=True)
  43. if payload.tags is not None:
  44. del dic["tags"]
  45. if len(payload.tags) > 0:
  46. await verify_id_list(
  47. session, payload.tags, project_id, SlotTag, "Invalid template list"
  48. )
  49. session.execute(
  50. association_table_template_tags.insert().values(
  51. [(template.id, t_id) for t_id in payload.tags]
  52. )
  53. )
  54. update_object_from_payload(template, dic)
  55. session.commit()
  56. return template
  57. @router.post(
  58. "/project/{project_id}/template/{template_id}", response_model=TemplateResponse
  59. )
  60. async def update_template(
  61. project_id: UUID,
  62. template_id: UUID,
  63. payload: TemplateUpdateRequest,
  64. current_user: User = Depends(deps.get_current_user),
  65. session: Session = Depends(deps.get_session),
  66. ):
  67. """Update a template"""
  68. template = session.get(SlotTemplate, template_id)
  69. if (template is None) or (template.project_id != str(project_id)):
  70. raise HTTPException(status_code=404, detail="Template not found")
  71. input_dict = payload.model_dump(exclude_unset=True)
  72. if payload.tags is not None:
  73. # Remove previous keys in association table
  74. session.execute(
  75. association_table_template_tags.delete().where(
  76. association_table_template_tags.c.description_id == template.id
  77. )
  78. )
  79. if len(payload.tags) > 0:
  80. await verify_id_list(
  81. session, payload.tags, project_id, SlotTag, "Invalid template list"
  82. )
  83. session.execute(
  84. association_table_template_tags.insert().values(
  85. [(template.id, t_id) for t_id in payload.tags]
  86. )
  87. )
  88. del input_dict["tags"]
  89. update_object_from_payload(template, input_dict)
  90. session.commit()
  91. session.refresh(template)
  92. return template
  93. @router.delete("/project/{project_id}/template/{template_id}")
  94. async def delete_template(
  95. project_id: UUID,
  96. template_id: UUID,
  97. current_user: User = Depends(deps.get_current_user),
  98. session: Session = Depends(deps.get_session),
  99. ):
  100. """Delete a slot from the project"""
  101. session.execute(
  102. delete(SlotTemplate).where(
  103. (SlotTemplate.id == template_id) & (SlotTemplate.project_id == project_id)
  104. )
  105. )
  106. session.commit()