v1_core.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. __package__ = 'archivebox.api'
  2. from uuid import UUID
  3. from typing import List, Optional
  4. from datetime import datetime
  5. from django.db.models import Q
  6. from django.shortcuts import get_object_or_404
  7. from ninja import Router, Schema, FilterSchema, Field, Query
  8. from ninja.pagination import paginate
  9. from core.models import Snapshot, ArchiveResult, Tag
  10. from abid_utils.abid import ABID
  11. router = Router(tags=['Core Models'])
  12. ### ArchiveResult #########################################################################
  13. class ArchiveResultSchema(Schema):
  14. abid: str
  15. uuid: UUID
  16. pk: str
  17. modified: datetime
  18. created: datetime
  19. created_by_id: str
  20. snapshot_abid: str
  21. snapshot_url: str
  22. snapshot_tags: str
  23. extractor: str
  24. cmd_version: Optional[str]
  25. cmd: List[str]
  26. pwd: str
  27. status: str
  28. output: str
  29. @staticmethod
  30. def resolve_created_by_id(obj):
  31. return str(obj.created_by_id)
  32. @staticmethod
  33. def resolve_pk(obj):
  34. return str(obj.pk)
  35. @staticmethod
  36. def resolve_uuid(obj):
  37. return str(obj.uuid)
  38. @staticmethod
  39. def resolve_abid(obj):
  40. return str(obj.ABID)
  41. @staticmethod
  42. def resolve_created(obj):
  43. return obj.start_ts
  44. @staticmethod
  45. def resolve_snapshot_url(obj):
  46. return obj.snapshot.url
  47. @staticmethod
  48. def resolve_snapshot_abid(obj):
  49. return str(obj.snapshot.ABID)
  50. @staticmethod
  51. def resolve_snapshot_tags(obj):
  52. return obj.snapshot.tags_str()
  53. class ArchiveResultFilterSchema(FilterSchema):
  54. uuid: Optional[UUID] = Field(None, q='uuid')
  55. # abid: Optional[str] = Field(None, q='abid')
  56. search: Optional[str] = Field(None, q=['snapshot__url__icontains', 'snapshot__title__icontains', 'snapshot__tags__name__icontains', 'extractor', 'output__icontains'])
  57. snapshot_uuid: Optional[UUID] = Field(None, q='snapshot_uuid__icontains')
  58. snapshot_url: Optional[str] = Field(None, q='snapshot__url__icontains')
  59. snapshot_tag: Optional[str] = Field(None, q='snapshot__tags__name__icontains')
  60. status: Optional[str] = Field(None, q='status')
  61. output: Optional[str] = Field(None, q='output__icontains')
  62. extractor: Optional[str] = Field(None, q='extractor__icontains')
  63. cmd: Optional[str] = Field(None, q='cmd__0__icontains')
  64. pwd: Optional[str] = Field(None, q='pwd__icontains')
  65. cmd_version: Optional[str] = Field(None, q='cmd_version')
  66. created: Optional[datetime] = Field(None, q='updated')
  67. created__gte: Optional[datetime] = Field(None, q='updated__gte')
  68. created__lt: Optional[datetime] = Field(None, q='updated__lt')
  69. @router.get("/archiveresults", response=List[ArchiveResultSchema], url_name="get_archiveresult")
  70. @paginate
  71. def get_archiveresults(request, filters: ArchiveResultFilterSchema = Query(...)):
  72. """List all ArchiveResult entries matching these filters."""
  73. qs = ArchiveResult.objects.all()
  74. results = filters.filter(qs)
  75. return results
  76. @router.get("/archiveresult/{archiveresult_id}", response=ArchiveResultSchema, url_name="get_archiveresult")
  77. def get_archiveresult(request, archiveresult_id: str):
  78. """Get a specific ArchiveResult by abid, uuid, or pk."""
  79. return ArchiveResult.objects.get(Q(pk__icontains=archiveresult_id) | Q(abid__icontains=archiveresult_id) | Q(uuid__icontains=archiveresult_id))
  80. # @router.post("/archiveresult", response=ArchiveResultSchema)
  81. # def create_archiveresult(request, payload: ArchiveResultSchema):
  82. # archiveresult = ArchiveResult.objects.create(**payload.dict())
  83. # return archiveresult
  84. #
  85. # @router.put("/archiveresult/{archiveresult_id}", response=ArchiveResultSchema)
  86. # def update_archiveresult(request, archiveresult_id: str, payload: ArchiveResultSchema):
  87. # archiveresult = get_object_or_404(ArchiveResult, id=archiveresult_id)
  88. #
  89. # for attr, value in payload.dict().items():
  90. # setattr(archiveresult, attr, value)
  91. # archiveresult.save()
  92. #
  93. # return archiveresult
  94. #
  95. # @router.delete("/archiveresult/{archiveresult_id}")
  96. # def delete_archiveresult(request, archiveresult_id: str):
  97. # archiveresult = get_object_or_404(ArchiveResult, id=archiveresult_id)
  98. # archiveresult.delete()
  99. # return {"success": True}
  100. ### Snapshot #########################################################################
  101. class SnapshotSchema(Schema):
  102. abid: str
  103. uuid: UUID
  104. pk: str
  105. modified: datetime
  106. created: datetime
  107. created_by_id: str
  108. url: str
  109. tags: str
  110. title: Optional[str]
  111. timestamp: str
  112. archive_path: str
  113. bookmarked: datetime
  114. added: datetime
  115. updated: Optional[datetime]
  116. num_archiveresults: int
  117. archiveresults: List[ArchiveResultSchema]
  118. @staticmethod
  119. def resolve_created_by_id(obj):
  120. return str(obj.created_by_id)
  121. @staticmethod
  122. def resolve_pk(obj):
  123. return str(obj.pk)
  124. @staticmethod
  125. def resolve_uuid(obj):
  126. return str(obj.uuid)
  127. @staticmethod
  128. def resolve_abid(obj):
  129. return str(obj.ABID)
  130. @staticmethod
  131. def resolve_tags(obj):
  132. return obj.tags_str()
  133. @staticmethod
  134. def resolve_num_archiveresults(obj, context):
  135. return obj.archiveresult_set.all().distinct().count()
  136. @staticmethod
  137. def resolve_archiveresults(obj, context):
  138. if context['request'].with_archiveresults:
  139. return obj.archiveresult_set.all().distinct()
  140. return ArchiveResult.objects.none()
  141. class SnapshotFilterSchema(FilterSchema):
  142. abid: Optional[str] = Field(None, q='abid__icontains')
  143. uuid: Optional[str] = Field(None, q='uuid__icontains')
  144. pk: Optional[str] = Field(None, q='pk__icontains')
  145. created_by_id: str = Field(None, q='created_by_id__icontains')
  146. created__gte: datetime = Field(None, q='created__gte')
  147. created__lt: datetime = Field(None, q='created__lt')
  148. created: datetime = Field(None, q='created')
  149. modified: datetime = Field(None, q='modified')
  150. modified__gte: datetime = Field(None, q='modified__gte')
  151. modified__lt: datetime = Field(None, q='modified__lt')
  152. search: Optional[str] = Field(None, q=['url__icontains', 'title__icontains', 'tags__name__icontains', 'abid__icontains', 'uuid__icontains'])
  153. url: Optional[str] = Field(None, q='url')
  154. tag: Optional[str] = Field(None, q='tags__name')
  155. title: Optional[str] = Field(None, q='title__icontains')
  156. timestamp: Optional[str] = Field(None, q='timestamp__startswith')
  157. added__gte: Optional[datetime] = Field(None, q='added__gte')
  158. added__lt: Optional[datetime] = Field(None, q='added__lt')
  159. @router.get("/snapshots", response=List[SnapshotSchema], url_name="get_snapshots")
  160. @paginate
  161. def get_snapshots(request, filters: SnapshotFilterSchema = Query(...), with_archiveresults: bool=True):
  162. """List all Snapshot entries matching these filters."""
  163. request.with_archiveresults = with_archiveresults
  164. qs = Snapshot.objects.all()
  165. results = filters.filter(qs)
  166. return results
  167. @router.get("/snapshot/{snapshot_id}", response=SnapshotSchema, url_name="get_snapshot")
  168. def get_snapshot(request, snapshot_id: str, with_archiveresults: bool=True):
  169. """Get a specific Snapshot by abid, uuid, or pk."""
  170. request.with_archiveresults = with_archiveresults
  171. snapshot = None
  172. try:
  173. snapshot = Snapshot.objects.get(Q(uuid__startswith=snapshot_id) | Q(abid__startswith=snapshot_id)| Q(pk__startswith=snapshot_id))
  174. except Snapshot.DoesNotExist:
  175. pass
  176. try:
  177. snapshot = snapshot or Snapshot.objects.get()
  178. except Snapshot.DoesNotExist:
  179. pass
  180. try:
  181. snapshot = snapshot or Snapshot.objects.get(Q(uuid__icontains=snapshot_id) | Q(abid__icontains=snapshot_id))
  182. except Snapshot.DoesNotExist:
  183. pass
  184. return snapshot
  185. # @router.post("/snapshot", response=SnapshotSchema)
  186. # def create_snapshot(request, payload: SnapshotSchema):
  187. # snapshot = Snapshot.objects.create(**payload.dict())
  188. # return snapshot
  189. #
  190. # @router.put("/snapshot/{snapshot_uuid}", response=SnapshotSchema)
  191. # def update_snapshot(request, snapshot_uuid: str, payload: SnapshotSchema):
  192. # snapshot = get_object_or_404(Snapshot, uuid=snapshot_uuid)
  193. #
  194. # for attr, value in payload.dict().items():
  195. # setattr(snapshot, attr, value)
  196. # snapshot.save()
  197. #
  198. # return snapshot
  199. #
  200. # @router.delete("/snapshot/{snapshot_uuid}")
  201. # def delete_snapshot(request, snapshot_uuid: str):
  202. # snapshot = get_object_or_404(Snapshot, uuid=snapshot_uuid)
  203. # snapshot.delete()
  204. # return {"success": True}
  205. ### Tag #########################################################################
  206. class TagSchema(Schema):
  207. abid: Optional[UUID] = Field(None, q='abid')
  208. uuid: Optional[UUID] = Field(None, q='uuid')
  209. pk: Optional[UUID] = Field(None, q='pk')
  210. modified: datetime
  211. created: datetime
  212. created_by_id: str
  213. name: str
  214. slug: str
  215. @staticmethod
  216. def resolve_created_by_id(obj):
  217. return str(obj.created_by_id)
  218. @router.get("/tags", response=List[TagSchema], url_name="get_tags")
  219. def get_tags(request):
  220. return Tag.objects.all()