templates.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. update_object_from_payload(template, payload.dict(exclude_unset=True))
  41. session.add(template)
  42. session.commit()
  43. return template
  44. @router.post("/project/{project_id}/template/{template_id}", response_model=TemplateResponse)
  45. async def update_template(
  46. project_id: UUID,
  47. template_id: UUID,
  48. payload: TemplateUpdateRequest,
  49. current_user: User = Depends(deps.get_current_user),
  50. session: Session = Depends(deps.get_session),
  51. ):
  52. """Update a template"""
  53. template = session.get(SlotTemplate, template_id)
  54. if (template is None) or (template.project_id != str(project_id)):
  55. raise HTTPException(status_code=404, detail="Template not found")
  56. if payload.title is not None:
  57. template.title = payload.title
  58. if payload.description is not None:
  59. template.description = payload.description
  60. if payload.responsible_contact is not None:
  61. template.responsible_contact = payload.responsible_contact
  62. if payload.place is not None:
  63. template.place = payload.place
  64. if payload.tags is not None:
  65. # Remove previous keys in association table
  66. session.execute(
  67. association_table_template_tags.delete().where(
  68. association_table_template_tags.c.description_id == template.id
  69. )
  70. )
  71. if len(payload.tags) > 0:
  72. await verify_id_list(
  73. session, payload.tags, project_id, SlotTag, "Invalid template list"
  74. )
  75. session.execute(
  76. association_table_template_tags.insert().values(
  77. [(template.id, t_id) for t_id in payload.tags]
  78. )
  79. )
  80. session.commit()
  81. session.refresh(template)
  82. return template
  83. @router.delete("/project/{project_id}/template/{template_id}")
  84. async def delete_template(
  85. project_id: UUID,
  86. template_id: UUID,
  87. current_user: User = Depends(deps.get_current_user),
  88. session: Session = Depends(deps.get_session),
  89. ):
  90. """Delete a slot from the project"""
  91. session.execute(
  92. delete(SlotTemplate).where(
  93. (SlotTemplate.id == template_id) & (SlotTemplate.project_id == project_id)
  94. )
  95. )
  96. session.commit()