django-restit 4.1.34__tar.gz → 4.1.40__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. {django_restit-4.1.34 → django_restit-4.1.40}/PKG-INFO +1 -1
  2. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/group.py +1 -1
  3. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/member.py +13 -1
  4. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/membership.py +15 -2
  5. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/plain/invite.html +4 -2
  6. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/simple/invite.html +4 -3
  7. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/models.py +1 -1
  8. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/models.py +11 -2
  9. {django_restit-4.1.34 → django_restit-4.1.40}/pyproject.toml +1 -1
  10. {django_restit-4.1.34 → django_restit-4.1.40}/rest/__init__.py +1 -1
  11. {django_restit-4.1.34 → django_restit-4.1.40}/rest/helpers.py +39 -1
  12. {django_restit-4.1.34 → django_restit-4.1.40}/rest/mail.py +1 -1
  13. {django_restit-4.1.34 → django_restit-4.1.40}/rest/models/base.py +53 -29
  14. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/csv.py +29 -25
  15. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/legacy.py +1 -0
  16. {django_restit-4.1.34 → django_restit-4.1.40}/LICENSE.md +0 -0
  17. {django_restit-4.1.34 → django_restit-4.1.40}/README.md +0 -0
  18. {django_restit-4.1.34 → django_restit-4.1.40}/account/__init__.py +0 -0
  19. {django_restit-4.1.34 → django_restit-4.1.40}/account/admin.py +0 -0
  20. {django_restit-4.1.34 → django_restit-4.1.40}/account/fcm/__init__.py +0 -0
  21. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0001_initial.py +0 -0
  22. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0003_member_phone_number.py +0 -0
  23. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
  24. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0005_member_auth_code_expires.py +0 -0
  25. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0006_member_security_token.py +0 -0
  26. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
  27. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
  28. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0009_alter_member_phone_number.py +0 -0
  29. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0010_delete_authtoken.py +0 -0
  30. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0011_authtoken.py +0 -0
  31. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0012_settings_settingsmetadata.py +0 -0
  32. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/0013_memberdevice_ip.py +0 -0
  33. {django_restit-4.1.34 → django_restit-4.1.40}/account/migrations/__init__.py +0 -0
  34. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/__init__.py +0 -0
  35. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/device.py +0 -0
  36. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/feeds.py +0 -0
  37. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/legacy.py +0 -0
  38. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/notify.py +0 -0
  39. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/session.py +0 -0
  40. {django_restit-4.1.34 → django_restit-4.1.40}/account/models/settings.py +0 -0
  41. {django_restit-4.1.34 → django_restit-4.1.40}/account/oauth/__init__.py +0 -0
  42. {django_restit-4.1.34 → django_restit-4.1.40}/account/oauth/google.py +0 -0
  43. {django_restit-4.1.34 → django_restit-4.1.40}/account/periodic.py +0 -0
  44. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/__init__.py +0 -0
  45. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/auth.py +0 -0
  46. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/device.py +0 -0
  47. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/group.py +0 -0
  48. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/member.py +0 -0
  49. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/notify.py +0 -0
  50. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/oauth.py +0 -0
  51. {django_restit-4.1.34 → django_restit-4.1.40}/account/rpc/settings.py +0 -0
  52. {django_restit-4.1.34 → django_restit-4.1.40}/account/settings.py +0 -0
  53. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/base.html +0 -0
  54. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/invite.html +0 -0
  55. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/plain/reset_code.html +0 -0
  56. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/reset_code.html +0 -0
  57. {django_restit-4.1.34 → django_restit-4.1.40}/account/templates/email/simple/reset_code.html +0 -0
  58. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/README +0 -0
  59. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/__init__.py +0 -0
  60. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/admin.py +0 -0
  61. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/decorators.py +0 -0
  62. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/middleware.py +0 -0
  63. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/migrations/0001_initial.py +0 -0
  64. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/migrations/__init__.py +0 -0
  65. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/models.py +0 -0
  66. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/periodic.py +0 -0
  67. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/rpc.py +0 -0
  68. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/tq.py +0 -0
  69. {django_restit-4.1.34 → django_restit-4.1.40}/auditlog/urls.py +0 -0
  70. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/README.md +0 -0
  71. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/__init__.py +0 -0
  72. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/admin.py +0 -0
  73. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/handlers.py +0 -0
  74. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/migrations/0001_initial.py +0 -0
  75. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/migrations/0002_alter_message_cc.py +0 -0
  76. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/migrations/0003_attachment_content_type.py +0 -0
  77. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/migrations/0004_mailtemplate.py +0 -0
  78. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/migrations/__init__.py +0 -0
  79. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/models/__init__.py +0 -0
  80. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/models/bounce.py +0 -0
  81. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/models/complaint.py +0 -0
  82. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/models/message.py +0 -0
  83. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/models/template.py +0 -0
  84. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/rpc.py +0 -0
  85. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/utils/__init__.py +0 -0
  86. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/utils/parsing.py +0 -0
  87. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/utils/render.py +0 -0
  88. {django_restit-4.1.34 → django_restit-4.1.40}/inbox/utils/sending.py +0 -0
  89. {django_restit-4.1.34 → django_restit-4.1.40}/incident/README.md +0 -0
  90. {django_restit-4.1.34 → django_restit-4.1.40}/incident/__init__.py +0 -0
  91. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0001_initial.py +0 -0
  92. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0002_event_component_event_component_id.py +0 -0
  93. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0003_rule_action.py +0 -0
  94. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
  95. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
  96. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0006_delete_eventmetadata.py +0 -0
  97. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0007_event_metadata.py +0 -0
  98. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
  99. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/0009_incident_reporter_ip.py +0 -0
  100. {django_restit-4.1.34 → django_restit-4.1.40}/incident/migrations/__init__.py +0 -0
  101. {django_restit-4.1.34 → django_restit-4.1.40}/incident/models/__init__.py +0 -0
  102. {django_restit-4.1.34 → django_restit-4.1.40}/incident/models/event.py +0 -0
  103. {django_restit-4.1.34 → django_restit-4.1.40}/incident/models/incident.py +0 -0
  104. {django_restit-4.1.34 → django_restit-4.1.40}/incident/models/ossec.py +0 -0
  105. {django_restit-4.1.34 → django_restit-4.1.40}/incident/models/rules.py +0 -0
  106. {django_restit-4.1.34 → django_restit-4.1.40}/incident/parsers/__init__.py +0 -0
  107. {django_restit-4.1.34 → django_restit-4.1.40}/incident/parsers/ossec.py +0 -0
  108. {django_restit-4.1.34 → django_restit-4.1.40}/incident/periodic.py +0 -0
  109. {django_restit-4.1.34 → django_restit-4.1.40}/incident/rpc.py +0 -0
  110. {django_restit-4.1.34 → django_restit-4.1.40}/incident/templates/email/incident_change.html +0 -0
  111. {django_restit-4.1.34 → django_restit-4.1.40}/incident/templates/email/incident_new.html +0 -0
  112. {django_restit-4.1.34 → django_restit-4.1.40}/incident/templates/email/incident_plain.html +0 -0
  113. {django_restit-4.1.34 → django_restit-4.1.40}/incident/tq.py +0 -0
  114. {django_restit-4.1.34 → django_restit-4.1.40}/location/__init__.py +0 -0
  115. {django_restit-4.1.34 → django_restit-4.1.40}/location/admin.py +0 -0
  116. {django_restit-4.1.34 → django_restit-4.1.40}/location/geolocate.py +0 -0
  117. {django_restit-4.1.34 → django_restit-4.1.40}/location/migrations/0001_initial.py +0 -0
  118. {django_restit-4.1.34 → django_restit-4.1.40}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
  119. {django_restit-4.1.34 → django_restit-4.1.40}/location/migrations/__init__.py +0 -0
  120. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/__init__.py +0 -0
  121. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/address.py +0 -0
  122. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/ip.py +0 -0
  123. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/legacy.py +0 -0
  124. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/location.py +0 -0
  125. {django_restit-4.1.34 → django_restit-4.1.40}/location/models/track.py +0 -0
  126. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/__init__.py +0 -0
  127. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/__init__.py +0 -0
  128. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/abstractapi.py +0 -0
  129. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/extremeip.py +0 -0
  130. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/geoplugin.py +0 -0
  131. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/ipapi.py +0 -0
  132. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/ipinfo.py +0 -0
  133. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/iplookup/restit.py +0 -0
  134. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/location/__init__.py +0 -0
  135. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/location/google.py +0 -0
  136. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/timezones/__init__.py +0 -0
  137. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/timezones/google.py +0 -0
  138. {django_restit-4.1.34 → django_restit-4.1.40}/location/providers/zillow.py +0 -0
  139. {django_restit-4.1.34 → django_restit-4.1.40}/location/rpc/__init__.py +0 -0
  140. {django_restit-4.1.34 → django_restit-4.1.40}/location/rpc/ip.py +0 -0
  141. {django_restit-4.1.34 → django_restit-4.1.40}/location/rpc/location.py +0 -0
  142. {django_restit-4.1.34 → django_restit-4.1.40}/location/rpc/track.py +0 -0
  143. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/__init__.py +0 -0
  144. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/admin.py +0 -0
  145. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/cvutil/__init__.py +0 -0
  146. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/cvutil/contours.py +0 -0
  147. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/cvutil/images.py +0 -0
  148. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/cvutil/misc.py +0 -0
  149. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/cvutil/text.py +0 -0
  150. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/fixtures/initial_data.json +0 -0
  151. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/fixtures/medialib.json +0 -0
  152. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/fixtures/medialib_test_fixture.json +0 -0
  153. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/forms.py +0 -0
  154. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/migrations/0001_initial.py +0 -0
  155. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/migrations/__init__.py +0 -0
  156. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/ocr.py +0 -0
  157. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/pdf.py +0 -0
  158. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/qrcode.py +0 -0
  159. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/__init__.py +0 -0
  160. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/__init__.py +0 -0
  161. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/anigif.py +0 -0
  162. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/ffmpeg.py +0 -0
  163. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/gifsicle.py +0 -0
  164. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/hls.py +0 -0
  165. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/mp4box.py +0 -0
  166. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/rtmp/Makefile +0 -0
  167. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/rtmp/__init__.py +0 -0
  168. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/rtmp/rtmp.i +0 -0
  169. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/rtmpdump.py +0 -0
  170. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/rtmpsink.py +0 -0
  171. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/video_getinfo.py +0 -0
  172. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/engines/websnap.py +0 -0
  173. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/exceptions.py +0 -0
  174. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/__init__.py +0 -0
  175. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/akamai.py +0 -0
  176. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/animated_thumbnail.py +0 -0
  177. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/ffmpeg.py +0 -0
  178. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/flv.py +0 -0
  179. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/hls.py +0 -0
  180. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/image_transcode.py +0 -0
  181. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/image_validate.py +0 -0
  182. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/mp4.py +0 -0
  183. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/video_still.py +0 -0
  184. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/video_validate.py +0 -0
  185. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/websnap.py +0 -0
  186. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/presets/youtube.py +0 -0
  187. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/render_utils.py +0 -0
  188. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/render/schedule.py +0 -0
  189. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/rpc/__init__.py +0 -0
  190. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/rpc/legacy.py +0 -0
  191. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/rpc/media.py +0 -0
  192. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/rpc/tools.py +0 -0
  193. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/scripts/init_config +0 -0
  194. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/css/base_medialibui.css +0 -0
  195. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/css/base_widgets.css +0 -0
  196. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/css/jquery.jcrop.css +0 -0
  197. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/arrow-down-white.png +0 -0
  198. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/bg-body.gif +0 -0
  199. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/cancel.gif +0 -0
  200. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/icon-generic.gif +0 -0
  201. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/icon-image.gif +0 -0
  202. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/icon-media.gif +0 -0
  203. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/icon-zip.gif +0 -0
  204. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/loading.gif +0 -0
  205. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/noimage.gif +0 -0
  206. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/render_err.gif +0 -0
  207. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/rendering.gif +0 -0
  208. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/star_off.png +0 -0
  209. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/star_on.png +0 -0
  210. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/img/unknown.gif +0 -0
  211. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/caman.full.js +0 -0
  212. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/hammer.min.js +0 -0
  213. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/jquery.Jcrop.js +0 -0
  214. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/jquery.hammer.js +0 -0
  215. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/load-image.min.js +0 -0
  216. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/swiper.js +0 -0
  217. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
  218. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
  219. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
  220. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
  221. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/__init__.py +0 -0
  222. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/__init__.py +0 -0
  223. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/channel.py +0 -0
  224. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/discovery.py +0 -0
  225. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/errors.py +0 -0
  226. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/http.py +0 -0
  227. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/mimeparse.py +0 -0
  228. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/model.py +0 -0
  229. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/sample_tools.py +0 -0
  230. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/apiclient/schema.py +0 -0
  231. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/filestore.py +0 -0
  232. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/httplib2/__init__.py +0 -0
  233. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/httplib2/cacerts.txt +0 -0
  234. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/httplib2/iri2uri.py +0 -0
  235. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/httplib2/socks.py +0 -0
  236. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/httpstore.py +0 -0
  237. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/nullstore.py +0 -0
  238. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/__init__.py +0 -0
  239. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/anyjson.py +0 -0
  240. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/appengine.py +0 -0
  241. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/client.py +0 -0
  242. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/clientsecrets.py +0 -0
  243. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/crypt.py +0 -0
  244. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/django_orm.py +0 -0
  245. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/file.py +0 -0
  246. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/gce.py +0 -0
  247. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/keyring_storage.py +0 -0
  248. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/locked_file.py +0 -0
  249. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/multistore_file.py +0 -0
  250. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/old_run.py +0 -0
  251. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/tools.py +0 -0
  252. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/util.py +0 -0
  253. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/oauth2client/xsrfutil.py +0 -0
  254. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/rtmpstore.py +0 -0
  255. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/s3store.py +0 -0
  256. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/uritemplate/__init__.py +0 -0
  257. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/stores/youtubestore.py +0 -0
  258. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/base.html +0 -0
  259. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/instances.html +0 -0
  260. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/items.html +0 -0
  261. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/library.html +0 -0
  262. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_error.subject +0 -0
  263. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_error.to +0 -0
  264. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_error.txt +0 -0
  265. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_ready.subject +0 -0
  266. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_ready.to +0 -0
  267. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_ready.txt +0 -0
  268. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_render_error.subject +0 -0
  269. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_render_error.to +0 -0
  270. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_render_error.txt +0 -0
  271. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_validate_error.subject +0 -0
  272. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_validate_error.to +0 -0
  273. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/notify_validate_error.txt +0 -0
  274. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/smil +0 -0
  275. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/test.html +0 -0
  276. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/templates/medialib/testpicker.html +0 -0
  277. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/tests.py +0 -0
  278. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/tq.py +0 -0
  279. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/urls.py +0 -0
  280. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/utils.py +0 -0
  281. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/views.py +0 -0
  282. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/__init__.py +0 -0
  283. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/__init__.py +0 -0
  284. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/channel.py +0 -0
  285. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/discovery.py +0 -0
  286. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/errors.py +0 -0
  287. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/http.py +0 -0
  288. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/mimeparse.py +0 -0
  289. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/model.py +0 -0
  290. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/sample_tools.py +0 -0
  291. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/apiclient/schema.py +0 -0
  292. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/httplib2/__init__.py +0 -0
  293. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/httplib2/cacerts.txt +0 -0
  294. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/httplib2/iri2uri.py +0 -0
  295. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/httplib2/socks.py +0 -0
  296. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/__init__.py +0 -0
  297. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/anyjson.py +0 -0
  298. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/appengine.py +0 -0
  299. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/client.py +0 -0
  300. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
  301. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/crypt.py +0 -0
  302. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/django_orm.py +0 -0
  303. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/file.py +0 -0
  304. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/gce.py +0 -0
  305. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
  306. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/locked_file.py +0 -0
  307. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/multistore_file.py +0 -0
  308. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/old_run.py +0 -0
  309. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/tools.py +0 -0
  310. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/util.py +0 -0
  311. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
  312. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/upload.py +0 -0
  313. {django_restit-4.1.34 → django_restit-4.1.40}/medialib/youtube/uritemplate/__init__.py +0 -0
  314. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/README.md +0 -0
  315. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/__init__.py +0 -0
  316. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/client.py +0 -0
  317. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/eod.py +0 -0
  318. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/examples/eod_example.py +0 -0
  319. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/__init__.py +0 -0
  320. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/__init__.py +0 -0
  321. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/delete_gauge.py +0 -0
  322. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/delete_metric.py +0 -0
  323. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
  324. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/generate_test_metrics.py +0 -0
  325. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
  326. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/reset_weekly_metrics.py +0 -0
  327. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/management/commands/system_metric.py +0 -0
  328. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/0001_initial.py +0 -0
  329. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
  330. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/0003_metrics_expires.py +0 -0
  331. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/0004_eodmetrics.py +0 -0
  332. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
  333. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/migrations/__init__.py +0 -0
  334. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/periodic.py +0 -0
  335. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/providers/__init__.py +0 -0
  336. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/providers/aws.py +0 -0
  337. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/rpc.py +0 -0
  338. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/settings.py +0 -0
  339. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/tq.py +0 -0
  340. {django_restit-4.1.34 → django_restit-4.1.40}/metrics/utils.py +0 -0
  341. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/__init__.py +0 -0
  342. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/admin.py +0 -0
  343. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/migrations/0001_initial.py +0 -0
  344. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/migrations/__init__.py +0 -0
  345. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/models.py +0 -0
  346. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/rpc/__init__.py +0 -0
  347. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/rpc/githooks.py +0 -0
  348. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/rpc/legacy.py +0 -0
  349. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/rpc/products.py +0 -0
  350. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/static/js/models_pushit.js +0 -0
  351. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/tq.py +0 -0
  352. {django_restit-4.1.34 → django_restit-4.1.40}/pushit/utils.py +0 -0
  353. {django_restit-4.1.34 → django_restit-4.1.40}/rest/.gitignore +0 -0
  354. {django_restit-4.1.34 → django_restit-4.1.40}/rest/README.md +0 -0
  355. {django_restit-4.1.34 → django_restit-4.1.40}/rest/RemoteEvents.py +0 -0
  356. {django_restit-4.1.34 → django_restit-4.1.40}/rest/arc4.py +0 -0
  357. {django_restit-4.1.34 → django_restit-4.1.40}/rest/cache.py +0 -0
  358. {django_restit-4.1.34 → django_restit-4.1.40}/rest/crypto/__init__.py +0 -0
  359. {django_restit-4.1.34 → django_restit-4.1.40}/rest/crypto/aes.py +0 -0
  360. {django_restit-4.1.34 → django_restit-4.1.40}/rest/crypto/privpub.py +0 -0
  361. {django_restit-4.1.34 → django_restit-4.1.40}/rest/crypto/util.py +0 -0
  362. {django_restit-4.1.34 → django_restit-4.1.40}/rest/datem.py +0 -0
  363. {django_restit-4.1.34 → django_restit-4.1.40}/rest/decorators.py +0 -0
  364. {django_restit-4.1.34 → django_restit-4.1.40}/rest/encryption.py +0 -0
  365. {django_restit-4.1.34 → django_restit-4.1.40}/rest/errors.py +0 -0
  366. {django_restit-4.1.34 → django_restit-4.1.40}/rest/extra/__init__.py +0 -0
  367. {django_restit-4.1.34 → django_restit-4.1.40}/rest/extra/json_metadata.py +0 -0
  368. {django_restit-4.1.34 → django_restit-4.1.40}/rest/fields.py +0 -0
  369. {django_restit-4.1.34 → django_restit-4.1.40}/rest/forms.py +0 -0
  370. {django_restit-4.1.34 → django_restit-4.1.40}/rest/joke.py +0 -0
  371. {django_restit-4.1.34 → django_restit-4.1.40}/rest/jwtoken.py +0 -0
  372. {django_restit-4.1.34 → django_restit-4.1.40}/rest/log.py +0 -0
  373. {django_restit-4.1.34 → django_restit-4.1.40}/rest/mailman.py +0 -0
  374. {django_restit-4.1.34 → django_restit-4.1.40}/rest/management/__init__.py +0 -0
  375. {django_restit-4.1.34 → django_restit-4.1.40}/rest/management/commands/__init__.py +0 -0
  376. {django_restit-4.1.34 → django_restit-4.1.40}/rest/management/commands/rpc.py +0 -0
  377. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/__init__.py +0 -0
  378. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/cors.py +0 -0
  379. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/db_router.py +0 -0
  380. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/jwt.py +0 -0
  381. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/request.py +0 -0
  382. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/session.py +0 -0
  383. {django_restit-4.1.34 → django_restit-4.1.40}/rest/middleware/session_store.py +0 -0
  384. {django_restit-4.1.34 → django_restit-4.1.40}/rest/models/__init__.py +0 -0
  385. {django_restit-4.1.34 → django_restit-4.1.40}/rest/models/cacher.py +0 -0
  386. {django_restit-4.1.34 → django_restit-4.1.40}/rest/models/metadata.py +0 -0
  387. {django_restit-4.1.34 → django_restit-4.1.40}/rest/net.py +0 -0
  388. {django_restit-4.1.34 → django_restit-4.1.40}/rest/regexes.yaml +0 -0
  389. {django_restit-4.1.34 → django_restit-4.1.40}/rest/requestex.py +0 -0
  390. {django_restit-4.1.34 → django_restit-4.1.40}/rest/rpc.py +0 -0
  391. {django_restit-4.1.34 → django_restit-4.1.40}/rest/search.py +0 -0
  392. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/__init__.py +0 -0
  393. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/collection.py +0 -0
  394. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/excel.py +0 -0
  395. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/json.py +0 -0
  396. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/model.py +0 -0
  397. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/profiler.py +0 -0
  398. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/response.py +0 -0
  399. {django_restit-4.1.34 → django_restit-4.1.40}/rest/serializers/util.py +0 -0
  400. {django_restit-4.1.34 → django_restit-4.1.40}/rest/settings_helper.py +0 -0
  401. {django_restit-4.1.34 → django_restit-4.1.40}/rest/ssl_check.py +0 -0
  402. {django_restit-4.1.34 → django_restit-4.1.40}/rest/static/lib/jquery.js +0 -0
  403. {django_restit-4.1.34 → django_restit-4.1.40}/rest/static/rest/app.css +0 -0
  404. {django_restit-4.1.34 → django_restit-4.1.40}/rest/static/rest/app.js +0 -0
  405. {django_restit-4.1.34 → django_restit-4.1.40}/rest/static/rest/rest.js +0 -0
  406. {django_restit-4.1.34 → django_restit-4.1.40}/rest/static/rest/rest.scss +0 -0
  407. {django_restit-4.1.34 → django_restit-4.1.40}/rest/templates/email/error.html +0 -0
  408. {django_restit-4.1.34 → django_restit-4.1.40}/rest/templates/email/error.subject +0 -0
  409. {django_restit-4.1.34 → django_restit-4.1.40}/rest/templates/rest_docs.html +0 -0
  410. {django_restit-4.1.34 → django_restit-4.1.40}/rest/templates/rest_html.html +0 -0
  411. {django_restit-4.1.34 → django_restit-4.1.40}/rest/ua.py +0 -0
  412. {django_restit-4.1.34 → django_restit-4.1.40}/rest/uberdict.py +0 -0
  413. {django_restit-4.1.34 → django_restit-4.1.40}/rest/url_docs.py +0 -0
  414. {django_restit-4.1.34 → django_restit-4.1.40}/rest/urls.py +0 -0
  415. {django_restit-4.1.34 → django_restit-4.1.40}/rest/views.py +0 -0
  416. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/.gitignore +0 -0
  417. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/README.md +0 -0
  418. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/__init__.py +0 -0
  419. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/admin.py +0 -0
  420. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/migrations/0001_initial.py +0 -0
  421. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/migrations/__init__.py +0 -0
  422. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/models.py +0 -0
  423. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/tests.py +0 -0
  424. {django_restit-4.1.34 → django_restit-4.1.40}/sessionlog/views.py +0 -0
  425. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/README.md +0 -0
  426. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/__init__.py +0 -0
  427. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/admin.py +0 -0
  428. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/migrations/0001_initial.py +0 -0
  429. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/migrations/__init__.py +0 -0
  430. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/models.py +0 -0
  431. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/periodic.py +0 -0
  432. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/rpc.py +0 -0
  433. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/tq.py +0 -0
  434. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/__init__.py +0 -0
  435. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/email.py +0 -0
  436. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/http.py +0 -0
  437. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/s3.py +0 -0
  438. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/sftp.py +0 -0
  439. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/transports/sms.py +0 -0
  440. {django_restit-4.1.34 → django_restit-4.1.40}/taskqueue/worker.py +0 -0
  441. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/__init__.py +0 -0
  442. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/admin.py +0 -0
  443. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/decorators.py +0 -0
  444. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/migrations/0001_initial.py +0 -0
  445. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/migrations/__init__.py +0 -0
  446. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/models.py +0 -0
  447. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/phone_util.py +0 -0
  448. {django_restit-4.1.34 → django_restit-4.1.40}/telephony/rpc.py +0 -0
  449. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/__init__.py +0 -0
  450. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/migrations/0001_initial.py +0 -0
  451. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/migrations/__init__.py +0 -0
  452. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/models/__init__.py +0 -0
  453. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/models/faq.py +0 -0
  454. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/models/page.py +0 -0
  455. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/models/revision.py +0 -0
  456. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/periodic.py +0 -0
  457. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/__init__.py +0 -0
  458. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/__init__.py +0 -0
  459. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/highlight.py +0 -0
  460. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/math.py +0 -0
  461. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/media.py +0 -0
  462. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/meta.py +0 -0
  463. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/task_list.py +0 -0
  464. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/renderers/mistune/toc.py +0 -0
  465. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/rpc/__init__.py +0 -0
  466. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/rpc/wiki.py +0 -0
  467. {django_restit-4.1.34 → django_restit-4.1.40}/wiki/tq.py +0 -0
  468. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/README.md +0 -0
  469. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/__init__.py +0 -0
  470. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/client.py +0 -0
  471. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/connection.py +0 -0
  472. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/exceptions.py +0 -0
  473. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/redis.py +0 -0
  474. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/servers/__init__.py +0 -0
  475. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/servers/base.py +0 -0
  476. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/servers/django.py +0 -0
  477. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/servers/uwsgi.py +0 -0
  478. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/settings.py +0 -0
  479. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/utf8validator.py +0 -0
  480. {django_restit-4.1.34 → django_restit-4.1.40}/ws4redis/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.1.34
3
+ Version: 4.1.40
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -136,7 +136,7 @@ class Group(models.Model, RestModel, MetaDataModel):
136
136
  return self.restGet(request)
137
137
  return restPermissionDenied(request)
138
138
 
139
- def onRestCanSave(self, request):
139
+ def onRestCanSave(self, request=None, data=None, extended=None):
140
140
  if request.member is None:
141
141
  raise PermissionDeniedException("permission denied for save")
142
142
  if request.member.hasPermission(["manage_groups", "create_groups"]):
@@ -505,22 +505,34 @@ class Member(User, RestModel, MetaDataModel):
505
505
  return True
506
506
 
507
507
  def sendEmail(self, subject, body, attachments=[], do_async=True, template=None, context=None):
508
+ default_domain = self.getProperty("default_domain", settings.EMAIL_DEFAULT_DOMAIN)
509
+ from_email = rh.getFromEmailForHost(default_domain)
508
510
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
509
511
  NotificationRecord.notify(
510
512
  [self], subject=subject, message=body,
511
513
  template=template, context=context,
514
+ from_email=from_email,
512
515
  email_only=True, attachments=attachments)
513
516
 
514
517
  def sendInvite(self, subject, group=None, url=None, msg=None, **kwargs):
518
+ if url is None:
519
+ url = settings.DEFAULT_LOGIN_URL
515
520
  if url[:4] != "http":
516
521
  url = f"https://{url}"
522
+ from_domain = rh.parseHostName(url, True)
523
+ from_email = rh.getFromEmailForHost(from_domain)
524
+ self.member.setProperty("default_domain", from_domain)
525
+ self.member.setProperty("default_from_email", from_email)
517
526
  context = rh.getContext(
518
527
  self.getActiveRequest(),
519
528
  member=self,
520
529
  group=group,
521
530
  url=url,
522
531
  msg=msg, **kwargs)
523
- rest_mail.send(self.email, subject, template=settings.get("EMAIL_TEMPLATE_INVITE", "email/invite.html"), context=context)
532
+ rest_mail.send(
533
+ self.email, subject, from_email=from_email,
534
+ template=settings.get("EMAIL_TEMPLATE_INVITE", "email/invite.html"),
535
+ context=context)
524
536
 
525
537
  def getActiveSessions(self):
526
538
  return SessionLog.objects.filter(user__id=self.pk, is_closed=False)
@@ -81,10 +81,17 @@ class Membership(models.Model, RestModel, MetaDataModel):
81
81
  if value == "resend_invite":
82
82
  self.sendInvite(self.getActiveRequest())
83
83
 
84
- def sendInvite(self, request=None, url=None, subject=None):
84
+ def sendInvite(self, request=None, url=None, subject=None, site_logo=None, company_name=None):
85
85
  if request:
86
+ powered_by = request.DATA.get("powered_by", True)
86
87
  subject = request.DATA.get("invite_subject")
87
88
  url = request.DATA.get("invite_url")
89
+ site_logo = request.DATA.get("site_logo", settings.SITE_LOGO)
90
+ company_name = request.DATA.get("company_name", settings.COMPANY_NAME)
91
+ else:
92
+ powered_by = True
93
+ site_logo = settings.SITE_LOGO
94
+ company_name = settings.COMPANY_NAME
88
95
  if url is None:
89
96
  raise RestValidationError("requires url", -1)
90
97
  if "?" not in url:
@@ -99,7 +106,13 @@ class Membership(models.Model, RestModel, MetaDataModel):
99
106
  self.member.generateAuthCode(expires=expires)
100
107
  auth_token = objict(username=self.member.username, auth_token=self.member.auth_code)
101
108
  url = "{}&auth_code={}".format(url, auth_token.toBase64())
102
- self.member.sendInvite(subject, self.group, url=url, msg=request.DATA.get("invite_msg", None), btn_label=btn_label)
109
+ self.member.sendInvite(
110
+ subject, self.group, url=url,
111
+ msg=request.DATA.get("invite_msg", None),
112
+ POWERED_BY=powered_by,
113
+ SITE_LOGO=site_logo,
114
+ COMPANY_NAME=company_name,
115
+ btn_label=btn_label)
103
116
 
104
117
  def set_state(self, value):
105
118
  if self.state != value:
@@ -186,7 +186,7 @@
186
186
  <tr>
187
187
  <td align="center" style="font-size:0px;padding:8px 0;word-break:break-word;">
188
188
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:30px;font-weight:300;line-height:30px;text-align:center;color:#000000;">
189
- {{settings.COMPANY_NAME}}</div>
189
+ {{COMPANY_NAME}}</div>
190
190
 
191
191
  </td>
192
192
  </tr>
@@ -209,7 +209,7 @@
209
209
  </tr>
210
210
  <tr>
211
211
  <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
212
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:20px;font-weight:300;line-height:30px;text-align:left;color:#000000;">You have been invited to join "<a href="{{url}}" style="color: #2e58ff; text-decoration: none; font-weight: 400;">{{group.name}}</a>" on the {{settings.COMPANY_NAME}} portal.</div>
212
+ <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:20px;font-weight:300;line-height:30px;text-align:left;color:#000000;">You have been invited to join "<a href="{{url}}" style="color: #2e58ff; text-decoration: none; font-weight: 400;">{{group.name}}</a>" on the {{COMPANY_NAME}} portal.</div>
213
213
  </td>
214
214
  </tr>
215
215
  {% if msg %}
@@ -284,6 +284,7 @@
284
284
  <![endif]-->
285
285
  <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
286
286
  <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
287
+ {% if POWERED_BY %}
287
288
  <tr>
288
289
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
289
290
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
@@ -291,6 +292,7 @@
291
292
  </div>
292
293
  </td>
293
294
  </tr>
295
+ {% endif %}
294
296
  <tr>
295
297
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
296
298
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
@@ -186,7 +186,7 @@
186
186
  <tr>
187
187
  <td align="center" style="font-size:0px;padding:8px 0;word-break:break-word;">
188
188
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:30px;font-weight:300;line-height:30px;text-align:center;color:#000000;">
189
- {{settings.COMPANY_NAME}}</div>
189
+ {{COMPANY_NAME}}</div>
190
190
 
191
191
  </td>
192
192
  </tr>
@@ -209,7 +209,7 @@
209
209
  </tr>
210
210
  <tr>
211
211
  <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
212
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:20px;font-weight:300;line-height:30px;text-align:left;color:#000000;">You have been invited to join "<a href="{{url}}" style="color: #2e58ff; text-decoration: none; font-weight: 400;">{{group.name}}</a>" on the {{settings.COMPANY_NAME}} portal.</div>
212
+ <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:20px;font-weight:300;line-height:30px;text-align:left;color:#000000;">You have been invited to join "<a href="{{url}}" style="color: #2e58ff; text-decoration: none; font-weight: 400;">{{group.name}}</a>" on the {{COMPANY_NAME}} portal.</div>
213
213
  </td>
214
214
  </tr>
215
215
  {% if msg %}
@@ -360,4 +360,5 @@
360
360
  </div>
361
361
  </body>
362
362
 
363
- </html>
363
+ </html>
364
+
@@ -409,7 +409,7 @@ class MediaItem(models.Model, RestModel, MetaDataModel):
409
409
  super(MediaItem, self).__init__(*args, **kwargs)
410
410
  self.old_state = self.state
411
411
 
412
- def onRestCanSave(self, request):
412
+ def onRestCanSave(self, request=None, data=None, extended=None):
413
413
  # must throw an exception if cannot save
414
414
  return True
415
415
 
@@ -271,9 +271,18 @@ def generate_uuid(slug, group, slug_append=None):
271
271
 
272
272
  class Metrics(models.Model, rm.RestModel):
273
273
  class RestMeta:
274
+ QUERY_FIELDS = ["group__kind", "all_fields"]
274
275
  GRAPHS = {
275
- "default": {
276
- "recurse_into": ["generic__component"]
276
+ "detailed": {
277
+ "fields": [
278
+ "id", "created", "start",
279
+ "granularity", "uuid",
280
+ "slug"
281
+ ],
282
+ "extra": [("getMetrics", "metrics")],
283
+ "graphs": {
284
+ "group": "basic"
285
+ }
277
286
  }
278
287
  }
279
288
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-restit"
3
- version = "4.1.34"
3
+ version = "4.1.40"
4
4
  description = "A Rest Framework for DJANGO"
5
5
  authors = ["Ian Starnes <ians@311labs.com>"]
6
6
  license = "MIT"
@@ -1,4 +1,4 @@
1
1
  from .uberdict import UberDict # noqa: F401
2
2
  from .settings_helper import settings # noqa: F401
3
3
 
4
- __version__ = "4.1.34"
4
+ __version__ = "4.1.40"
@@ -15,6 +15,9 @@ from .datem import *
15
15
  from .log import getLogger
16
16
  import getpass
17
17
 
18
+ from urllib.parse import urlparse
19
+
20
+
18
21
  try:
19
22
  from fuzzywuzzy import fuzz
20
23
  except:
@@ -121,6 +124,17 @@ def log_error(*args):
121
124
  getLoggerByRequest(request).error(*extra, *args)
122
125
 
123
126
 
127
+ def log_stack(*args):
128
+ request = getActiveRequest()
129
+ import inspect
130
+ extra = []
131
+ for frame in inspect.stack():
132
+ file, line, func = frame[1:4]
133
+ extra.append(f"{file}, line {line} in function {func}")
134
+ ERROR_LOGGER.error(*extra, *args)
135
+ getLoggerByRequest(request).error(*extra, *args)
136
+
137
+
124
138
  def setLogModel(self, component, pk):
125
139
  # this method allows for updating the component to associate a log with
126
140
  if not pk or (self._log_pk == pk):
@@ -261,6 +275,30 @@ def getRemoteIP(request):
261
275
  ip = request.META.get('REMOTE_ADDR')
262
276
  return ip
263
277
 
278
+
279
+ def parseHostName(url, root=False):
280
+ if url.startswith("http"):
281
+ parsed_url = urlparse(url)
282
+ hname = parsed_url.netloc
283
+ else:
284
+ hname = url
285
+ if root and hname.count('.') > 1:
286
+ return hname[hname.find(".")+1:]
287
+ return hname
288
+
289
+
290
+ def getFromEmailForHost(host):
291
+ email_domain = settings.EMAIL_DEFAULT_DOMAIN
292
+ from_label = settings.EMAIL_FROM_LABEL
293
+ if settings.EMAIL_SETTINGS:
294
+ hostname = parseHostName(host, True)
295
+ info = settings.EMAIL_SETTINGS.get(hostname, None)
296
+ if info is not None:
297
+ email_domain = info.get("email_domain", email_domain)
298
+ from_label = info.get("from_label", from_label)
299
+ return f"{from_label} <noreply@{email_domain}>"
300
+
301
+
264
302
  def getUserAgent(request):
265
303
  # Some mobile browsers put the User-Agent in a HTTP-X header
266
304
  return request.META.get('HTTP_X_OPERAMINI_PHONE_UA') or \
@@ -443,7 +481,7 @@ def getContext(request, *args, **kwargs):
443
481
  c["protocol"] = getProtocol(request)
444
482
  c["request"] = request
445
483
 
446
- for k, v in list(kwargs.items()):
484
+ for k, v in kwargs.items():
447
485
  c[k] = v
448
486
  return c
449
487
 
@@ -50,7 +50,7 @@ def send(to, subject, body=None, attachments=[],
50
50
  html = renderBody(html, template, context)
51
51
 
52
52
  msg = createMultiPartMessage(
53
- settings.DEFAULT_FROM_EMAIL, to, subject,
53
+ from_email, to, subject,
54
54
  text=text, html=html, attachments=attachments,
55
55
  replyto=replyto)
56
56
 
@@ -418,7 +418,7 @@ class RestModel(object):
418
418
  obj = new_obj
419
419
  if using is None:
420
420
  using = self.restGetModelDB()
421
- obj.saveFromDict(None, value, using=using)
421
+ obj.checkPermsAndSave(None, value, using=using)
422
422
  # rh.log_print("{} vs {}".format(self._state.db, obj._state.db))
423
423
  # rh.log_print("saving FK to {} ({}.{}) - {}".format(fieldname, using, obj.pk, type(obj)), value)
424
424
  setattr(self, fieldname, obj)
@@ -468,7 +468,7 @@ class RestModel(object):
468
468
  def saveFromRequest(self, request, **kwargs):
469
469
  if "files" not in kwargs:
470
470
  kwargs["files"] = request.FILES
471
- return self.saveFromDict(request, request.DATA, **kwargs)
471
+ return self.checkPermsAndSave(request, request.DATA, **kwargs)
472
472
 
473
473
  def hasFieldChanged(self, fieldname):
474
474
  if not hasattr(self, "_changed__"):
@@ -489,17 +489,20 @@ class RestModel(object):
489
489
  else:
490
490
  self._changed__[fieldname] = old_value
491
491
 
492
- def saveFromDict(self, request, data, files=None, **kwargs):
492
+ def checkPermsAndSave(self, request, data, files=None, **kwargs):
493
493
  can_save = getattr(self.RestMeta, "CAN_SAVE", True)
494
494
  if not can_save:
495
- return self.restStatus(request, False, error="saving not allowed via rest for this model.")
496
- save_media_files = getattr(self.RestMeta, "SAVE_MEDIA_FILES", False) or getattr(self.RestMeta, "SAVE_MEDIA_FILES_BY_NAME", False)
495
+ raise re.PermissionDeniedException("saving not allowed via rest for this model.")
497
496
  # check check for save permissions
498
497
  if request is None:
499
498
  request = RestModel.getActiveRequest()
500
499
  if request is None:
501
500
  request = objict(member=None, FILES=[], DATA=objict(), is_authenticated=False, is_local=True)
502
- self.onRestCanSave(request)
501
+ self.onRestCanSave(request, data, kwargs)
502
+ return self.saveFromDict(request, data, files=None, **kwargs)
503
+
504
+ def saveFromDict(self, request, data, files=None, **kwargs):
505
+ save_media_files = getattr(self.RestMeta, "SAVE_MEDIA_FILES", False) or getattr(self.RestMeta, "SAVE_MEDIA_FILES_BY_NAME", False)
503
506
  is_new = self.id is None
504
507
  has_fields = hasattr(self.RestMeta, "SAVE_FIELDS") and len(self.RestMeta.SAVE_FIELDS)
505
508
  has_no_fields = hasattr(self.RestMeta, "NO_SAVE_FIELDS") and len(self.RestMeta.NO_SAVE_FIELDS)
@@ -516,9 +519,10 @@ class RestModel(object):
516
519
  else:
517
520
  m_field = field
518
521
  req_field = field
519
- req_value = getattr(request, req_field, None)
520
- if request and req_value:
521
- data[m_field] = req_value
522
+ if request is not None:
523
+ req_value = getattr(request, req_field, None)
524
+ if req_value is not None:
525
+ data[m_field] = req_value
522
526
  # rh.log_print(data)
523
527
  self._changed__ = objict()
524
528
  if hasattr(self.RestMeta, "POST_SAVE_FIELDS"):
@@ -561,7 +565,7 @@ class RestModel(object):
561
565
  if len(deferred):
562
566
  self.save(using=using)
563
567
 
564
- if len(rfiles) and save_media_files:
568
+ if rfiles is not None and len(rfiles) and save_media_files:
565
569
  self.restSaveMediaFiles(rfiles)
566
570
 
567
571
  # these setters are responsible for saving themselves
@@ -575,7 +579,7 @@ class RestModel(object):
575
579
  return self
576
580
 
577
581
  def restSaveFiles(self, request, files=None):
578
- if files is None:
582
+ if files is None and request is not None:
579
583
  files = request.FILES
580
584
  if not files:
581
585
  return files
@@ -728,10 +732,10 @@ class RestModel(object):
728
732
  self.on_rest_pre_get(request)
729
733
  return self.restGet(request)
730
734
 
731
- def onRestCanSave(self, request=None):
732
- self.onRestCheckSavePerms(request)
735
+ def onRestCanSave(self, request=None, data=None, extended=None):
736
+ self.onRestCheckSavePerms(request, data, extended)
733
737
 
734
- def onRestCheckSavePerms(self, request=None):
738
+ def onRestCheckSavePerms(self, request=None, data=None, extended=None):
735
739
  if request is None:
736
740
  request = self.getActiveRequest()
737
741
  if request is None:
@@ -739,7 +743,7 @@ class RestModel(object):
739
743
  if getattr(request, "is_local", False):
740
744
  return True
741
745
  perms = getattr(self.RestMeta, "SAVE_PERMS", getattr(self.RestMeta, "VIEW_PERMS", None))
742
- if self.pk is None:
746
+ if self.id is None:
743
747
  perms = getattr(self.RestMeta, "CREATE_PERMS", perms)
744
748
  if perms:
745
749
  if "owner" in perms and self.checkIsOwner(request.member):
@@ -747,8 +751,16 @@ class RestModel(object):
747
751
  # we need to check if this user has permission
748
752
  group_field = getattr(self.RestMeta, "GROUP_FIELD", "group")
749
753
  # rh.log_error(F"group field={group_field}")
750
- if self.pk is None:
751
- group = request.DATA.get(group_field)
754
+ if self.id is None:
755
+ group = None
756
+ if extended is not None:
757
+ group = extended.get(group_field, None)
758
+ if group is None:
759
+ if data is not None:
760
+ group = data.get(group_field, None)
761
+ if group is None:
762
+ if request is not None:
763
+ group = request.DATA.get(group_field, None)
752
764
  elif "__" in group_field and hasattr(self, "group"):
753
765
  group = self.group
754
766
  elif "__" in group_field:
@@ -762,13 +774,13 @@ class RestModel(object):
762
774
  group = getattr(self, group_field, None)
763
775
  status, error, code = rh.requestHasPerms(request, perms, group)
764
776
  if not status:
765
- if self.pk is None and code == 402:
777
+ if self.id is None and code == 402:
766
778
  code = 435
767
- rh.log_error(F"onRestCheckSavePerms: {request.member} {group} permission denied: status={status}, error={error}, code={code}", perms)
779
+ rh.log_error(F"onRestCheckSavePerms: {self.__class__.__name__} {request.member} {group} permission denied: status={status}, error={error}, code={code}", perms)
768
780
  raise re.PermissionDeniedException(error, code)
769
781
 
770
782
  def on_rest_post(self, request):
771
- self.saveFromRequest(request)
783
+ self.checkPermsAndSave(request, request.DATA)
772
784
  status_only = request.DATA.get("status_only", False, field_type=bool)
773
785
  if status_only:
774
786
  return self.restStatus(request, True)
@@ -784,11 +796,12 @@ class RestModel(object):
784
796
  def on_rest_saved(self, request, is_new=False):
785
797
  pass
786
798
 
787
- def on_rest_delete(self, request):
799
+ def on_rest_delete(self, request, force=False):
788
800
  can_delete = getattr(self.RestMeta, "CAN_DELETE", False)
789
801
  if not can_delete:
790
802
  return self.restStatus(request, False, error="deletion not allowed via rest for this model.")
791
- self.onRestCanSave(request)
803
+ if not force:
804
+ self.onRestCanSave(request)
792
805
  self.on_rest_deleted(request)
793
806
  self.delete()
794
807
  RestModel._setupGraphHelpers()
@@ -1121,7 +1134,7 @@ class RestModel(object):
1121
1134
  try:
1122
1135
  obj = cls.ro_objects().filter(**item).last()
1123
1136
  if not obj:
1124
- obj.saveFromDict(request, item)
1137
+ obj.checkPermsAndSave(request, item)
1125
1138
  items.append(obj)
1126
1139
  except Exception:
1127
1140
  pass
@@ -1189,17 +1202,17 @@ class RestModel(object):
1189
1202
  # check if model id is in post
1190
1203
  request.rest_class = cls
1191
1204
  cls._boundRest()
1192
- if not pk and getattr(cls.RestMeta, "PK_FROM_FILTER", False):
1205
+ if pk is None and getattr(cls.RestMeta, "PK_FROM_FILTER", False):
1193
1206
  pk_fields = []
1194
1207
  key = cls.get_class_name().lower()
1195
- key_p = "{0}_id".format(key)
1208
+ key_p = f"{key}_id"
1196
1209
  pk_fields.append(key_p)
1197
1210
  # check if the cls has a field with the class name, (causes conflict)
1198
1211
  if not cls.get_field_type(key):
1199
1212
  pk_fields.append(key)
1200
1213
  pk = request.DATA.get(pk_fields, None, field_type=int)
1201
1214
  # generic rest request handler
1202
- if pk:
1215
+ if pk is not None:
1203
1216
  using = getattr(cls.RestMeta, "RO_DATABASE", None)
1204
1217
  if using is None:
1205
1218
  using = getattr(cls.RestMeta, "DATABASE", None)
@@ -1207,7 +1220,7 @@ class RestModel(object):
1207
1220
  obj = cls.objects.using(using).filter(pk=pk).last()
1208
1221
  else:
1209
1222
  obj = cls.objects.filter(pk=pk).last()
1210
- if not obj:
1223
+ if obj is None:
1211
1224
  return GRAPH_HELPERS.views.restNotFound(request)
1212
1225
  if request.method == "GET":
1213
1226
  return obj.on_rest_get(request)
@@ -1423,7 +1436,18 @@ class RestModel(object):
1423
1436
  """
1424
1437
  This will look at the query request and allow for basic filtering.
1425
1438
 
1426
- QUERY_FIELDS can be used to restrict what fields can be queried
1439
+ QUERY_FIELDS_SPECIAL can be used to allow mappings of certain queries:
1440
+ ?group=iso
1441
+ {
1442
+ "group": "group__kind"
1443
+ }
1444
+
1445
+ QUERY_FIELDS can be used to restrict what fields can be queried
1446
+ and add special fields:
1447
+
1448
+ ?group__kind=iso
1449
+ # this will allow "group__kind" but also support all other fields
1450
+ ["group__kind", "all_fields"]
1427
1451
 
1428
1452
  <field_name>=value
1429
1453
  or
@@ -1523,7 +1547,7 @@ class RestModel(object):
1523
1547
  value = rh.parseDateTime(value)
1524
1548
  q[key] = value
1525
1549
  if bool(q):
1526
- # rh.debug("queryFromRequest", q, request.default_rest_filters)
1550
+ # rh.debug("queryFromRequest", q, "default_filters:", request.default_rest_filters)
1527
1551
  qset = qset.filter(**q)
1528
1552
  return qset
1529
1553
 
@@ -5,38 +5,42 @@ import csv
5
5
 
6
6
 
7
7
  def flattenObject(obj, field_names):
8
- NOT_FOUND = "-!@#$%^&*()-"
9
-
10
8
  row = []
11
9
  for f in field_names:
12
- d = getattr(obj, f, NOT_FOUND)
13
- if d != NOT_FOUND:
14
- if callable(d):
15
- d = d()
16
- elif "." in f:
17
- f1, f2 = f.split('.')
18
- d1 = getattr(obj, f1, None)
19
- if d1:
20
- if not hasattr(d1, f2):
21
- if hasattr(d1, "first"):
22
- d1 = d1.first()
23
- d = getattr(d1, f2, "")
10
+ d = ""
11
+ if "__" in f:
12
+ f = f.replace("__", ".")
13
+ if "." in f:
14
+ # we could use obj.getFieldValue
15
+ keys = f.split('.')
16
+ f1 = keys[0]
17
+ f2 = keys[1]
18
+ if f1 == "metadata" and hasattr(obj, "getProperty"):
19
+ if len(keys) > 2:
20
+ d = obj.getProperty(f2, category=keys[2])
21
+ else:
22
+ d = obj.getProperty(f2)
23
+ elif hasattr(obj, "getFieldValue"):
24
+ d = obj.getFieldValue(f, "t/a")
24
25
  if callable(d):
25
26
  d = d()
26
27
  else:
27
- d = ""
28
- elif "__" in f:
29
- f1, f2 = f.split('__')
30
- d1 = getattr(obj, f1, None)
31
- if d1:
32
- if not hasattr(d1, f2):
33
- if hasattr(d1, "first"):
34
- d1 = d1.first()
35
- d = getattr(d1, f2, "")
36
- else:
37
- d = ""
28
+ d1 = getattr(obj, f1, None)
29
+ if d1 is not None:
30
+ if not hasattr(d1, f2):
31
+ if hasattr(d1, "first"):
32
+ d1 = d1.first()
33
+ d = getattr(d1, f2, "")
34
+ if callable(d):
35
+ d = d()
38
36
  else:
37
+ d = getattr(obj, f, "n/a")
38
+ if callable(d):
39
+ d = d()
40
+ if d is None:
39
41
  d = "n/a"
42
+ elif hasattr(d, "pk"):
43
+ d = d.pk
40
44
  row.append(str(d))
41
45
  return row
42
46
 
@@ -226,6 +226,7 @@ class RawQuery(object):
226
226
  sql += " OFFSET %d" % self.offset
227
227
 
228
228
  return sql + ";"
229
+
229
230
  def run(self):
230
231
  return self.model.objects.raw(self.sql())
231
232
 
File without changes