Нет описания

pickup_request.py 2.7KB

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