Sin descripción

pickup_request.py 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from typing import Iterable, List, Optional
  4. from django.contrib.contenttypes.models import ContentType
  5. from django.utils import timezone
  6. from orgs.models import Organization
  7. from recycle_core.models import Document
  8. @dataclass
  9. class PickupRequestData:
  10. organization: Organization
  11. name: str
  12. email: str = ""
  13. phone: str = ""
  14. address: str = ""
  15. materials: str = ""
  16. preferred_at: Optional[timezone.datetime] = None
  17. files: Optional[Iterable] = None # iterable of UploadedFile
  18. @dataclass
  19. class PickupRequestResult:
  20. ok: bool
  21. lead_id: Optional[int] = None
  22. error: Optional[str] = None
  23. document_ids: List[int] = None
  24. class PickupRequestController:
  25. """Application layer controller for the fast-path pickup request.
  26. - Creates a Lead scoped to an Organization
  27. - Stores any uploaded photos/documents as Document records attached to the Lead
  28. """
  29. def submit(self, data: PickupRequestData) -> PickupRequestResult:
  30. from public_frontend.models import Lead # import locally to avoid circular imports
  31. try:
  32. # Prepare message body for staff
  33. message = (
  34. f"Pickup Request\n"
  35. f"Address: {data.address}\n"
  36. f"Preferred: {data.preferred_at or ''}\n"
  37. f"Materials: {data.materials or ''}"
  38. )
  39. lead = Lead.objects.create(
  40. organization=data.organization,
  41. name=data.name,
  42. email=data.email or "",
  43. phone=data.phone or "",
  44. subject="Pickup Request",
  45. message=message,
  46. source="pickup_request",
  47. )
  48. # Attach uploaded files as Documents linked to the Lead
  49. doc_ids: List[int] = []
  50. if data.files:
  51. ct = ContentType.objects.get_for_model(Lead)
  52. for idx, f in enumerate(data.files):
  53. doc = Document.objects.create(
  54. organization=data.organization,
  55. file=f,
  56. kind="pickup_request",
  57. content_type=ct,
  58. object_id=lead.id,
  59. uploaded_by=None,
  60. )
  61. doc_ids.append(doc.id)
  62. return PickupRequestResult(ok=True, lead_id=lead.id, document_ids=doc_ids)
  63. except Exception as e:
  64. return PickupRequestResult(ok=False, error=str(e), document_ids=[])