templates.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. if payload.title is not None:
  72. template.title = payload.title
  73. if payload.description is not None:
  74. template.description = payload.description
  75. if payload.responsible_contact is not None:
  76. template.responsible_contact = payload.responsible_contact
  77. if payload.place is not None:
  78. template.place = payload.place
  79. if payload.tags is not None:
  80. # Remove previous keys in association table
  81. session.execute(
  82. association_table_template_tags.delete().where(
  83. association_table_template_tags.c.description_id == template.id
  84. )
  85. )
  86. if len(payload.tags) > 0:
  87. await verify_id_list(
  88. session, payload.tags, project_id, SlotTag, "Invalid template list"
  89. )
  90. session.execute(
  91. association_table_template_tags.insert().values(
  92. [(template.id, t_id) for t_id in payload.tags]
  93. )
  94. )
  95. session.commit()
  96. session.refresh(template)
  97. return template
  98. @router.delete("/project/{project_id}/template/{template_id}")
  99. async def delete_template(
  100. project_id: UUID,
  101. template_id: UUID,
  102. current_user: User = Depends(deps.get_current_user),
  103. session: Session = Depends(deps.get_session),
  104. ):
  105. """Delete a slot from the project"""
  106. session.execute(
  107. delete(SlotTemplate).where(
  108. (SlotTemplate.id == template_id) & (SlotTemplate.project_id == project_id)
  109. )
  110. )
  111. session.commit()