django-restit 4.2.72__tar.gz → 4.2.74__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 (508) hide show
  1. {django_restit-4.2.72 → django_restit-4.2.74}/PKG-INFO +1 -1
  2. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/device.py +13 -2
  3. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/member.py +32 -6
  4. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/membership.py +3 -2
  5. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/notify.py +81 -3
  6. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/session.py +1 -1
  7. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/auth.py +9 -2
  8. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/device.py +7 -0
  9. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/member.py +13 -1
  10. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/base.html +1 -1
  11. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/invite.html +0 -5
  12. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/plain/invite.html +0 -7
  13. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/plain/reset_code.html +0 -7
  14. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/reset_code.html +0 -5
  15. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/simple/invite.html +0 -7
  16. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/simple/reset_code.html +0 -7
  17. django_restit-4.2.74/account/templates/unsubscribed.html +68 -0
  18. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/utils/render.py +1 -0
  19. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/incident.py +1 -1
  20. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/rules.py +17 -0
  21. {django_restit-4.2.72 → django_restit-4.2.74}/incident/templates/email/incident_change.html +1 -1
  22. {django_restit-4.2.72 → django_restit-4.2.74}/incident/templates/email/incident_msg.html +1 -1
  23. {django_restit-4.2.72 → django_restit-4.2.74}/incident/templates/email/incident_new.html +1 -1
  24. {django_restit-4.2.72 → django_restit-4.2.74}/incident/templates/email/incident_plain.html +1 -1
  25. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/rpc.py +8 -2
  26. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/tq.py +1 -1
  27. {django_restit-4.2.72 → django_restit-4.2.74}/pyproject.toml +1 -1
  28. {django_restit-4.2.72 → django_restit-4.2.74}/rest/helpers.py +3 -1
  29. {django_restit-4.2.72 → django_restit-4.2.74}/rest/models/base.py +64 -17
  30. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/response.py +8 -0
  31. {django_restit-4.2.72 → django_restit-4.2.74}/LICENSE.md +0 -0
  32. {django_restit-4.2.72 → django_restit-4.2.74}/README.md +0 -0
  33. {django_restit-4.2.72 → django_restit-4.2.74}/account/__init__.py +0 -0
  34. {django_restit-4.2.72 → django_restit-4.2.74}/account/admin.py +0 -0
  35. {django_restit-4.2.72 → django_restit-4.2.74}/account/fcm/__init__.py +0 -0
  36. {django_restit-4.2.72 → django_restit-4.2.74}/account/fcm/google.py +0 -0
  37. {django_restit-4.2.72 → django_restit-4.2.74}/account/fcm/v1.py +0 -0
  38. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0001_initial.py +0 -0
  39. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0003_member_phone_number.py +0 -0
  40. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
  41. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0005_member_auth_code_expires.py +0 -0
  42. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0006_member_security_token.py +0 -0
  43. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
  44. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
  45. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0009_alter_member_phone_number.py +0 -0
  46. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0010_delete_authtoken.py +0 -0
  47. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0011_authtoken.py +0 -0
  48. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0012_settings_settingsmetadata.py +0 -0
  49. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0013_memberdevice_ip.py +0 -0
  50. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
  51. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0015_memberdevice_buid.py +0 -0
  52. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0016_authsession_buid.py +0 -0
  53. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
  54. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0018_userpasskey.py +0 -0
  55. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0019_group_location.py +0 -0
  56. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
  57. {django_restit-4.2.72 → django_restit-4.2.74}/account/migrations/__init__.py +0 -0
  58. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/__init__.py +0 -0
  59. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/feeds.py +0 -0
  60. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/group.py +0 -0
  61. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/legacy.py +0 -0
  62. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/passkeys.py +0 -0
  63. {django_restit-4.2.72 → django_restit-4.2.74}/account/models/settings.py +0 -0
  64. {django_restit-4.2.72 → django_restit-4.2.74}/account/oauth/__init__.py +0 -0
  65. {django_restit-4.2.72 → django_restit-4.2.74}/account/oauth/google.py +0 -0
  66. {django_restit-4.2.72 → django_restit-4.2.74}/account/passkeys/__init__.py +0 -0
  67. {django_restit-4.2.72 → django_restit-4.2.74}/account/passkeys/core.py +0 -0
  68. {django_restit-4.2.72 → django_restit-4.2.74}/account/periodic.py +0 -0
  69. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/__init__.py +0 -0
  70. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/group.py +0 -0
  71. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/notify.py +0 -0
  72. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/oauth.py +0 -0
  73. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/passkeys.py +0 -0
  74. {django_restit-4.2.72 → django_restit-4.2.74}/account/rpc/settings.py +0 -0
  75. {django_restit-4.2.72 → django_restit-4.2.74}/account/settings.py +0 -0
  76. {django_restit-4.2.72 → django_restit-4.2.74}/account/templates/email/plain/base.html +0 -0
  77. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/README +0 -0
  78. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/__init__.py +0 -0
  79. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/admin.py +0 -0
  80. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/cloudwatch.py +0 -0
  81. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/decorators.py +0 -0
  82. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/middleware.py +0 -0
  83. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/migrations/0001_initial.py +0 -0
  84. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/migrations/__init__.py +0 -0
  85. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/models.py +0 -0
  86. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/periodic.py +0 -0
  87. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/rpc.py +0 -0
  88. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/tq.py +0 -0
  89. {django_restit-4.2.72 → django_restit-4.2.74}/auditlog/urls.py +0 -0
  90. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/README.md +0 -0
  91. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/__init__.py +0 -0
  92. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/admin.py +0 -0
  93. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/handlers.py +0 -0
  94. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/migrations/0001_initial.py +0 -0
  95. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/migrations/0002_alter_message_cc.py +0 -0
  96. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/migrations/0003_attachment_content_type.py +0 -0
  97. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/migrations/0004_mailtemplate.py +0 -0
  98. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/migrations/__init__.py +0 -0
  99. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/models/__init__.py +0 -0
  100. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/models/bounce.py +0 -0
  101. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/models/complaint.py +0 -0
  102. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/models/message.py +0 -0
  103. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/models/template.py +0 -0
  104. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/rpc.py +0 -0
  105. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/utils/__init__.py +0 -0
  106. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/utils/parsing.py +0 -0
  107. {django_restit-4.2.72 → django_restit-4.2.74}/inbox/utils/sending.py +0 -0
  108. {django_restit-4.2.72 → django_restit-4.2.74}/incident/README.md +0 -0
  109. {django_restit-4.2.72 → django_restit-4.2.74}/incident/__init__.py +0 -0
  110. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0001_initial.py +0 -0
  111. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0002_event_component_event_component_id.py +0 -0
  112. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0003_rule_action.py +0 -0
  113. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
  114. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
  115. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0006_delete_eventmetadata.py +0 -0
  116. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0007_event_metadata.py +0 -0
  117. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
  118. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0009_incident_reporter_ip.py +0 -0
  119. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
  120. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0011_ticket.py +0 -0
  121. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0012_rule_match_by.py +0 -0
  122. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0013_rulecheck_is_required.py +0 -0
  123. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
  124. {django_restit-4.2.72 → django_restit-4.2.74}/incident/migrations/__init__.py +0 -0
  125. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/__init__.py +0 -0
  126. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/event.py +0 -0
  127. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/ossec.py +0 -0
  128. {django_restit-4.2.72 → django_restit-4.2.74}/incident/models/ticket.py +0 -0
  129. {django_restit-4.2.72 → django_restit-4.2.74}/incident/parsers/__init__.py +0 -0
  130. {django_restit-4.2.72 → django_restit-4.2.74}/incident/parsers/ossec.py +0 -0
  131. {django_restit-4.2.72 → django_restit-4.2.74}/incident/periodic.py +0 -0
  132. {django_restit-4.2.72 → django_restit-4.2.74}/incident/rpc.py +0 -0
  133. {django_restit-4.2.72 → django_restit-4.2.74}/incident/tq.py +0 -0
  134. {django_restit-4.2.72 → django_restit-4.2.74}/location/__init__.py +0 -0
  135. {django_restit-4.2.72 → django_restit-4.2.74}/location/admin.py +0 -0
  136. {django_restit-4.2.72 → django_restit-4.2.74}/location/geolocate.py +0 -0
  137. {django_restit-4.2.72 → django_restit-4.2.74}/location/migrations/0001_initial.py +0 -0
  138. {django_restit-4.2.72 → django_restit-4.2.74}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
  139. {django_restit-4.2.72 → django_restit-4.2.74}/location/migrations/0003_address_postalcode_suffix.py +0 -0
  140. {django_restit-4.2.72 → django_restit-4.2.74}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
  141. {django_restit-4.2.72 → django_restit-4.2.74}/location/migrations/__init__.py +0 -0
  142. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/__init__.py +0 -0
  143. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/address.py +0 -0
  144. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/ip.py +0 -0
  145. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/legacy.py +0 -0
  146. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/location.py +0 -0
  147. {django_restit-4.2.72 → django_restit-4.2.74}/location/models/track.py +0 -0
  148. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/__init__.py +0 -0
  149. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/__init__.py +0 -0
  150. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/abstractapi.py +0 -0
  151. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/extremeip.py +0 -0
  152. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/geoplugin.py +0 -0
  153. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/ipapi.py +0 -0
  154. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/ipinfo.py +0 -0
  155. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/iplookup/restit.py +0 -0
  156. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/location/__init__.py +0 -0
  157. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/location/google.py +0 -0
  158. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/timezones/__init__.py +0 -0
  159. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/timezones/google.py +0 -0
  160. {django_restit-4.2.72 → django_restit-4.2.74}/location/providers/zillow.py +0 -0
  161. {django_restit-4.2.72 → django_restit-4.2.74}/location/rpc/__init__.py +0 -0
  162. {django_restit-4.2.72 → django_restit-4.2.74}/location/rpc/address.py +0 -0
  163. {django_restit-4.2.72 → django_restit-4.2.74}/location/rpc/ip.py +0 -0
  164. {django_restit-4.2.72 → django_restit-4.2.74}/location/rpc/location.py +0 -0
  165. {django_restit-4.2.72 → django_restit-4.2.74}/location/rpc/track.py +0 -0
  166. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/__init__.py +0 -0
  167. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/admin.py +0 -0
  168. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/cvutil/__init__.py +0 -0
  169. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/cvutil/contours.py +0 -0
  170. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/cvutil/images.py +0 -0
  171. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/cvutil/misc.py +0 -0
  172. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/cvutil/text.py +0 -0
  173. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/fixtures/initial_data.json +0 -0
  174. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/fixtures/medialib.json +0 -0
  175. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/fixtures/medialib_test_fixture.json +0 -0
  176. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/forms.py +0 -0
  177. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/migrations/0001_initial.py +0 -0
  178. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/migrations/__init__.py +0 -0
  179. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/models.py +0 -0
  180. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/ocr.py +0 -0
  181. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/pdf.py +0 -0
  182. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/qrcode.py +0 -0
  183. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/__init__.py +0 -0
  184. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/__init__.py +0 -0
  185. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/anigif.py +0 -0
  186. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/ffmpeg.py +0 -0
  187. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/gifsicle.py +0 -0
  188. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/hls.py +0 -0
  189. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/mp4box.py +0 -0
  190. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/rtmp/Makefile +0 -0
  191. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/rtmp/__init__.py +0 -0
  192. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/rtmp/rtmp.i +0 -0
  193. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/rtmpdump.py +0 -0
  194. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/rtmpsink.py +0 -0
  195. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/video_getinfo.py +0 -0
  196. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/engines/websnap.py +0 -0
  197. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/exceptions.py +0 -0
  198. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/__init__.py +0 -0
  199. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/akamai.py +0 -0
  200. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/animated_thumbnail.py +0 -0
  201. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/ffmpeg.py +0 -0
  202. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/flv.py +0 -0
  203. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/hls.py +0 -0
  204. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/image_transcode.py +0 -0
  205. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/image_validate.py +0 -0
  206. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/mp4.py +0 -0
  207. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/video_still.py +0 -0
  208. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/video_validate.py +0 -0
  209. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/websnap.py +0 -0
  210. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/presets/youtube.py +0 -0
  211. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/render_utils.py +0 -0
  212. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/render/schedule.py +0 -0
  213. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/rpc/__init__.py +0 -0
  214. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/rpc/legacy.py +0 -0
  215. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/rpc/media.py +0 -0
  216. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/rpc/tools.py +0 -0
  217. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/scripts/init_config +0 -0
  218. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/css/base_medialibui.css +0 -0
  219. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/css/base_widgets.css +0 -0
  220. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/css/jquery.jcrop.css +0 -0
  221. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/arrow-down-white.png +0 -0
  222. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/bg-body.gif +0 -0
  223. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/cancel.gif +0 -0
  224. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/icon-generic.gif +0 -0
  225. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/icon-image.gif +0 -0
  226. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/icon-media.gif +0 -0
  227. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/icon-zip.gif +0 -0
  228. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/loading.gif +0 -0
  229. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/noimage.gif +0 -0
  230. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/render_err.gif +0 -0
  231. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/rendering.gif +0 -0
  232. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/star_off.png +0 -0
  233. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/star_on.png +0 -0
  234. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/img/unknown.gif +0 -0
  235. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/caman.full.js +0 -0
  236. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/hammer.min.js +0 -0
  237. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/jquery.Jcrop.js +0 -0
  238. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/jquery.hammer.js +0 -0
  239. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/load-image.min.js +0 -0
  240. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/swiper.js +0 -0
  241. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
  242. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
  243. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
  244. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
  245. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/__init__.py +0 -0
  246. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/__init__.py +0 -0
  247. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/channel.py +0 -0
  248. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/discovery.py +0 -0
  249. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/errors.py +0 -0
  250. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/http.py +0 -0
  251. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/mimeparse.py +0 -0
  252. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/model.py +0 -0
  253. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/sample_tools.py +0 -0
  254. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/apiclient/schema.py +0 -0
  255. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/filestore.py +0 -0
  256. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/httplib2/__init__.py +0 -0
  257. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/httplib2/cacerts.txt +0 -0
  258. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/httplib2/iri2uri.py +0 -0
  259. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/httplib2/socks.py +0 -0
  260. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/httpstore.py +0 -0
  261. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/nullstore.py +0 -0
  262. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/__init__.py +0 -0
  263. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/anyjson.py +0 -0
  264. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/appengine.py +0 -0
  265. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/client.py +0 -0
  266. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/clientsecrets.py +0 -0
  267. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/crypt.py +0 -0
  268. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/django_orm.py +0 -0
  269. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/file.py +0 -0
  270. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/gce.py +0 -0
  271. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/keyring_storage.py +0 -0
  272. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/locked_file.py +0 -0
  273. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/multistore_file.py +0 -0
  274. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/old_run.py +0 -0
  275. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/tools.py +0 -0
  276. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/util.py +0 -0
  277. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/oauth2client/xsrfutil.py +0 -0
  278. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/rtmpstore.py +0 -0
  279. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/s3store.py +0 -0
  280. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/uritemplate/__init__.py +0 -0
  281. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/stores/youtubestore.py +0 -0
  282. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/base.html +0 -0
  283. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/instances.html +0 -0
  284. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/items.html +0 -0
  285. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/library.html +0 -0
  286. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_error.subject +0 -0
  287. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_error.to +0 -0
  288. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_error.txt +0 -0
  289. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_ready.subject +0 -0
  290. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_ready.to +0 -0
  291. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_ready.txt +0 -0
  292. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_render_error.subject +0 -0
  293. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_render_error.to +0 -0
  294. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_render_error.txt +0 -0
  295. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_validate_error.subject +0 -0
  296. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_validate_error.to +0 -0
  297. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/notify_validate_error.txt +0 -0
  298. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/smil +0 -0
  299. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/test.html +0 -0
  300. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/templates/medialib/testpicker.html +0 -0
  301. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/tests.py +0 -0
  302. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/tq.py +0 -0
  303. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/urls.py +0 -0
  304. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/utils.py +0 -0
  305. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/views.py +0 -0
  306. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/__init__.py +0 -0
  307. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/__init__.py +0 -0
  308. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/channel.py +0 -0
  309. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/discovery.py +0 -0
  310. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/errors.py +0 -0
  311. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/http.py +0 -0
  312. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/mimeparse.py +0 -0
  313. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/model.py +0 -0
  314. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/sample_tools.py +0 -0
  315. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/apiclient/schema.py +0 -0
  316. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/httplib2/__init__.py +0 -0
  317. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/httplib2/cacerts.txt +0 -0
  318. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/httplib2/iri2uri.py +0 -0
  319. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/httplib2/socks.py +0 -0
  320. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/__init__.py +0 -0
  321. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/anyjson.py +0 -0
  322. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/appengine.py +0 -0
  323. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/client.py +0 -0
  324. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
  325. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/crypt.py +0 -0
  326. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/django_orm.py +0 -0
  327. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/file.py +0 -0
  328. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/gce.py +0 -0
  329. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
  330. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/locked_file.py +0 -0
  331. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/multistore_file.py +0 -0
  332. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/old_run.py +0 -0
  333. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/tools.py +0 -0
  334. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/util.py +0 -0
  335. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
  336. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/upload.py +0 -0
  337. {django_restit-4.2.72 → django_restit-4.2.74}/medialib/youtube/uritemplate/__init__.py +0 -0
  338. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/README.md +0 -0
  339. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/__init__.py +0 -0
  340. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/client.py +0 -0
  341. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/eod.py +0 -0
  342. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/examples/eod_example.py +0 -0
  343. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/__init__.py +0 -0
  344. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/__init__.py +0 -0
  345. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/delete_gauge.py +0 -0
  346. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/delete_metric.py +0 -0
  347. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
  348. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/generate_test_metrics.py +0 -0
  349. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
  350. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/reset_weekly_metrics.py +0 -0
  351. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/management/commands/system_metric.py +0 -0
  352. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/0001_initial.py +0 -0
  353. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
  354. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/0003_metrics_expires.py +0 -0
  355. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/0004_eodmetrics.py +0 -0
  356. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
  357. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/migrations/__init__.py +0 -0
  358. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/models.py +0 -0
  359. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/periodic.py +0 -0
  360. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/providers/__init__.py +0 -0
  361. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/providers/aws.py +0 -0
  362. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/settings.py +0 -0
  363. {django_restit-4.2.72 → django_restit-4.2.74}/metrics/utils.py +0 -0
  364. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/__init__.py +0 -0
  365. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/admin.py +0 -0
  366. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/migrations/0001_initial.py +0 -0
  367. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/migrations/__init__.py +0 -0
  368. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/models.py +0 -0
  369. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/rpc/__init__.py +0 -0
  370. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/rpc/githooks.py +0 -0
  371. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/rpc/legacy.py +0 -0
  372. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/rpc/products.py +0 -0
  373. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/static/js/models_pushit.js +0 -0
  374. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/tq.py +0 -0
  375. {django_restit-4.2.72 → django_restit-4.2.74}/pushit/utils.py +0 -0
  376. {django_restit-4.2.72 → django_restit-4.2.74}/rest/.gitignore +0 -0
  377. {django_restit-4.2.72 → django_restit-4.2.74}/rest/README.md +0 -0
  378. {django_restit-4.2.72 → django_restit-4.2.74}/rest/RemoteEvents.py +0 -0
  379. {django_restit-4.2.72 → django_restit-4.2.74}/rest/__init__.py +0 -0
  380. {django_restit-4.2.72 → django_restit-4.2.74}/rest/arc4.py +0 -0
  381. {django_restit-4.2.72 → django_restit-4.2.74}/rest/cache.py +0 -0
  382. {django_restit-4.2.72 → django_restit-4.2.74}/rest/crypto/__init__.py +0 -0
  383. {django_restit-4.2.72 → django_restit-4.2.74}/rest/crypto/aes.py +0 -0
  384. {django_restit-4.2.72 → django_restit-4.2.74}/rest/crypto/privpub.py +0 -0
  385. {django_restit-4.2.72 → django_restit-4.2.74}/rest/crypto/util.py +0 -0
  386. {django_restit-4.2.72 → django_restit-4.2.74}/rest/datem.py +0 -0
  387. {django_restit-4.2.72 → django_restit-4.2.74}/rest/decorators.py +0 -0
  388. {django_restit-4.2.72 → django_restit-4.2.74}/rest/encryption.py +0 -0
  389. {django_restit-4.2.72 → django_restit-4.2.74}/rest/errors.py +0 -0
  390. {django_restit-4.2.72 → django_restit-4.2.74}/rest/extra/__init__.py +0 -0
  391. {django_restit-4.2.72 → django_restit-4.2.74}/rest/extra/json_metadata.py +0 -0
  392. {django_restit-4.2.72 → django_restit-4.2.74}/rest/fields.py +0 -0
  393. {django_restit-4.2.72 → django_restit-4.2.74}/rest/forms.py +0 -0
  394. {django_restit-4.2.72 → django_restit-4.2.74}/rest/joke.py +0 -0
  395. {django_restit-4.2.72 → django_restit-4.2.74}/rest/jwtoken.py +0 -0
  396. {django_restit-4.2.72 → django_restit-4.2.74}/rest/log.py +0 -0
  397. {django_restit-4.2.72 → django_restit-4.2.74}/rest/mail.py +0 -0
  398. {django_restit-4.2.72 → django_restit-4.2.74}/rest/mailman.py +0 -0
  399. {django_restit-4.2.72 → django_restit-4.2.74}/rest/management/__init__.py +0 -0
  400. {django_restit-4.2.72 → django_restit-4.2.74}/rest/management/commands/__init__.py +0 -0
  401. {django_restit-4.2.72 → django_restit-4.2.74}/rest/management/commands/rpc.py +0 -0
  402. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/__init__.py +0 -0
  403. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/cors.py +0 -0
  404. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/db_router.py +0 -0
  405. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/jwt.py +0 -0
  406. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/request.py +0 -0
  407. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/session.py +0 -0
  408. {django_restit-4.2.72 → django_restit-4.2.74}/rest/middleware/session_store.py +0 -0
  409. {django_restit-4.2.72 → django_restit-4.2.74}/rest/models/__init__.py +0 -0
  410. {django_restit-4.2.72 → django_restit-4.2.74}/rest/models/cacher.py +0 -0
  411. {django_restit-4.2.72 → django_restit-4.2.74}/rest/models/metadata.py +0 -0
  412. {django_restit-4.2.72 → django_restit-4.2.74}/rest/net.py +0 -0
  413. {django_restit-4.2.72 → django_restit-4.2.74}/rest/regexes.yaml +0 -0
  414. {django_restit-4.2.72 → django_restit-4.2.74}/rest/requestex.py +0 -0
  415. {django_restit-4.2.72 → django_restit-4.2.74}/rest/rpc.py +0 -0
  416. {django_restit-4.2.72 → django_restit-4.2.74}/rest/search.py +0 -0
  417. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/__init__.py +0 -0
  418. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/collection.py +0 -0
  419. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/csv.py +0 -0
  420. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/excel.py +0 -0
  421. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/json.py +0 -0
  422. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/legacy.py +0 -0
  423. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/localizers.py +0 -0
  424. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/model.py +0 -0
  425. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/profiler.py +0 -0
  426. {django_restit-4.2.72 → django_restit-4.2.74}/rest/serializers/util.py +0 -0
  427. {django_restit-4.2.72 → django_restit-4.2.74}/rest/settings_helper.py +0 -0
  428. {django_restit-4.2.72 → django_restit-4.2.74}/rest/ssl_check.py +0 -0
  429. {django_restit-4.2.72 → django_restit-4.2.74}/rest/static/lib/jquery.js +0 -0
  430. {django_restit-4.2.72 → django_restit-4.2.74}/rest/static/rest/app.css +0 -0
  431. {django_restit-4.2.72 → django_restit-4.2.74}/rest/static/rest/app.js +0 -0
  432. {django_restit-4.2.72 → django_restit-4.2.74}/rest/static/rest/rest.js +0 -0
  433. {django_restit-4.2.72 → django_restit-4.2.74}/rest/static/rest/rest.scss +0 -0
  434. {django_restit-4.2.72 → django_restit-4.2.74}/rest/templates/email/error.html +0 -0
  435. {django_restit-4.2.72 → django_restit-4.2.74}/rest/templates/email/error.subject +0 -0
  436. {django_restit-4.2.72 → django_restit-4.2.74}/rest/templates/rest_docs.html +0 -0
  437. {django_restit-4.2.72 → django_restit-4.2.74}/rest/templates/rest_html.html +0 -0
  438. {django_restit-4.2.72 → django_restit-4.2.74}/rest/ua.py +0 -0
  439. {django_restit-4.2.72 → django_restit-4.2.74}/rest/uberdict.py +0 -0
  440. {django_restit-4.2.72 → django_restit-4.2.74}/rest/url_docs.py +0 -0
  441. {django_restit-4.2.72 → django_restit-4.2.74}/rest/urls.py +0 -0
  442. {django_restit-4.2.72 → django_restit-4.2.74}/rest/views.py +0 -0
  443. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/.gitignore +0 -0
  444. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/README.md +0 -0
  445. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/__init__.py +0 -0
  446. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/admin.py +0 -0
  447. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/migrations/0001_initial.py +0 -0
  448. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/migrations/__init__.py +0 -0
  449. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/models.py +0 -0
  450. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/tests.py +0 -0
  451. {django_restit-4.2.72 → django_restit-4.2.74}/sessionlog/views.py +0 -0
  452. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/README.md +0 -0
  453. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/__init__.py +0 -0
  454. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/admin.py +0 -0
  455. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/migrations/0001_initial.py +0 -0
  456. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/migrations/__init__.py +0 -0
  457. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/models.py +0 -0
  458. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/periodic.py +0 -0
  459. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/rpc.py +0 -0
  460. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/tq.py +0 -0
  461. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/__init__.py +0 -0
  462. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/email.py +0 -0
  463. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/http.py +0 -0
  464. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/s3.py +0 -0
  465. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/sftp.py +0 -0
  466. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/transports/sms.py +0 -0
  467. {django_restit-4.2.72 → django_restit-4.2.74}/taskqueue/worker.py +0 -0
  468. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/__init__.py +0 -0
  469. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/admin.py +0 -0
  470. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/decorators.py +0 -0
  471. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/migrations/0001_initial.py +0 -0
  472. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/migrations/0002_alter_sms_sid.py +0 -0
  473. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/migrations/__init__.py +0 -0
  474. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/models.py +0 -0
  475. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/phone_util.py +0 -0
  476. {django_restit-4.2.72 → django_restit-4.2.74}/telephony/rpc.py +0 -0
  477. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/__init__.py +0 -0
  478. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/migrations/0001_initial.py +0 -0
  479. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/migrations/__init__.py +0 -0
  480. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/models/__init__.py +0 -0
  481. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/models/faq.py +0 -0
  482. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/models/page.py +0 -0
  483. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/models/revision.py +0 -0
  484. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/periodic.py +0 -0
  485. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/__init__.py +0 -0
  486. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/__init__.py +0 -0
  487. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/highlight.py +0 -0
  488. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/math.py +0 -0
  489. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/media.py +0 -0
  490. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/meta.py +0 -0
  491. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/task_list.py +0 -0
  492. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/renderers/mistune/toc.py +0 -0
  493. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/rpc/__init__.py +0 -0
  494. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/rpc/wiki.py +0 -0
  495. {django_restit-4.2.72 → django_restit-4.2.74}/wiki/tq.py +0 -0
  496. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/README.md +0 -0
  497. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/__init__.py +0 -0
  498. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/client.py +0 -0
  499. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/connection.py +0 -0
  500. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/exceptions.py +0 -0
  501. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/redis.py +0 -0
  502. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/servers/__init__.py +0 -0
  503. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/servers/base.py +0 -0
  504. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/servers/django.py +0 -0
  505. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/servers/uwsgi.py +0 -0
  506. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/settings.py +0 -0
  507. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/utf8validator.py +0 -0
  508. {django_restit-4.2.72 → django_restit-4.2.74}/ws4redis/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.72
3
+ Version: 4.2.74
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -113,9 +113,20 @@ class MemberDeviceMetaData(rm.MetaDataBase):
113
113
 
114
114
  class CloudCredentials(models.Model, rm.RestModel, rm.MetaDataModel):
115
115
  """
116
- MemberDevice Model tracks personal devices associated with a user.
117
- This can include mobile and desktop devices.
116
+ CloudCredentials is a global setting for a group to store this groups cloud credentials.
118
117
  """
118
+ class RestMeta:
119
+ VIEW_PERMS = ["view_cm", "manage_cm"]
120
+ EDIT_PERMS = ["manage_cm"]
121
+ GRAPHS = {
122
+ "default": {
123
+ "extra": ["metadata"],
124
+ "graphs": {
125
+ "group": "basic"
126
+ }
127
+ }
128
+ }
129
+
119
130
  created = models.DateTimeField(auto_now_add=True)
120
131
  modified = models.DateTimeField(auto_now=True)
121
132
  group = models.ForeignKey("account.Group", related_name="cloud_credentials", on_delete=models.CASCADE)
@@ -88,7 +88,8 @@ class Member(User, RestModel, MetaDataModel):
88
88
  ("perms", "properties|permissions.")]
89
89
  QUERY_FIELDS_SPECIAL = {
90
90
  "ip": "auth_sessions__ip",
91
- "login_country": "auth_sessions__location__country"
91
+ "login_country": "auth_sessions__location__country",
92
+ "not_login_country": "auth_sessions__location__country__ne"
92
93
  }
93
94
  UNIQUE_LOOKUP = ["username", "email"]
94
95
  METADATA_FIELD_PROPERTIES = settings.USER_METADATA_PROPERTIES
@@ -221,6 +222,14 @@ class Member(User, RestModel, MetaDataModel):
221
222
  return token.secure_token
222
223
  return None
223
224
 
225
+ @property
226
+ def force_single_session(self):
227
+ return self.hasPermission("force_single_session")
228
+
229
+ @property
230
+ def email_disabled(self):
231
+ return self.hasPermission("email_disabled")
232
+
224
233
  @property
225
234
  def has_totp(self):
226
235
  token = self.getProperty("totp_token", category="secrets", default=None)
@@ -617,7 +626,11 @@ class Member(User, RestModel, MetaDataModel):
617
626
  email = self.email
618
627
  valid_email = email is not None and "@" in email and "invalid" not in email
619
628
  allow_sms = not email_only and phone and (force or via in ["all", "sms"])
620
- allow_email = valid_email and (force or via in ["all", "email"])
629
+ if not force:
630
+ allow_email = not self.email_disabled and valid_email and (force or via in ["all", "email"])
631
+ else:
632
+ allow_email = valid_email
633
+
621
634
  if not allow_email and not allow_sms:
622
635
  return False
623
636
 
@@ -847,6 +860,8 @@ class Member(User, RestModel, MetaDataModel):
847
860
  if token is None:
848
861
  token = AuthToken(member=self, role="default")
849
862
  token.generateToken()
863
+ elif action == "refresh_keys":
864
+ self.refreshSecurityToken()
850
865
 
851
866
  def set_full_name(self, value):
852
867
  self.set_name(value)
@@ -1042,7 +1057,7 @@ class Member(User, RestModel, MetaDataModel):
1042
1057
  return Member.objects.filter(phone_number=phone_number.lower()).last()
1043
1058
 
1044
1059
  @staticmethod
1045
- def GetWithPermission(perm, email_list=False):
1060
+ def GetWithPermission(perm, email_list=False, ignore_disabled_email=True):
1046
1061
  if type(perm) is list:
1047
1062
  queries = [Q(properties__category="permissions", properties__key=p, properties__value="1") for p in perm]
1048
1063
  query = queries.pop()
@@ -1052,12 +1067,17 @@ class Member(User, RestModel, MetaDataModel):
1052
1067
  else:
1053
1068
  qset = Member.objects.filter(is_active=True).filter(properties__category="permissions", properties__key=perm, properties__value="1")
1054
1069
 
1070
+ if not ignore_disabled_email:
1071
+ qset = qset.exclude(
1072
+ properties__category="permissions",
1073
+ properties__key="email_disabled",
1074
+ properties__int_value=1)
1055
1075
  if email_list:
1056
1076
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1057
1077
  return qset
1058
1078
 
1059
1079
  @staticmethod
1060
- def GetWithNotification(perm, email_list=False, exclude_member=None):
1080
+ def GetWithNotification(perm, email_list=False, exclude_member=None, ignore_disabled_email=True):
1061
1081
  qset = Member.objects.filter(is_active=True)
1062
1082
  if exclude_member:
1063
1083
  qset = qset.exclude(pk=exclude_member.pk)
@@ -1080,6 +1100,11 @@ class Member(User, RestModel, MetaDataModel):
1080
1100
  properties__key=perm,
1081
1101
  properties__int_value=1)
1082
1102
 
1103
+ if not ignore_disabled_email:
1104
+ qset = qset.exclude(
1105
+ properties__category="permissions",
1106
+ properties__key="email_disabled",
1107
+ properties__int_value=1)
1083
1108
  if email_list:
1084
1109
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1085
1110
  return qset
@@ -1126,7 +1151,7 @@ class Member(User, RestModel, MetaDataModel):
1126
1151
  email_only=False, sms_msg=None, force=False, from_email=None):
1127
1152
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1128
1153
  NotificationRecord.notify(
1129
- Member.GetWithPermission(perm), subject, message,
1154
+ Member.GetWithPermission(perm, ignore_disabled_email=True), subject, message,
1130
1155
  template, context, email_only, sms_msg, force,
1131
1156
  from_email=from_email)
1132
1157
 
@@ -1136,7 +1161,8 @@ class Member(User, RestModel, MetaDataModel):
1136
1161
  exclude_member=None):
1137
1162
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1138
1163
  NotificationRecord.notify(
1139
- Member.GetWithNotification(setting, exclude_member=exclude_member), subject, message,
1164
+ Member.GetWithNotification(setting, exclude_member=exclude_member, ignore_disabled_email=True),
1165
+ subject, message,
1140
1166
  template, context, email_only, sms_msg, force,
1141
1167
  from_email=from_email)
1142
1168
 
@@ -82,13 +82,14 @@ class Membership(models.Model, RestModel, MetaDataModel):
82
82
  if value == "resend_invite":
83
83
  self.sendInvite(self.getActiveRequest())
84
84
 
85
- def sendInvite(self, request=None, url=None, subject=None, site_logo=None, company_name=None):
85
+ def sendInvite(self, request=None, url=None, subject=None, site_logo=None, company_name=None, msg=None):
86
86
  if request:
87
87
  powered_by = request.DATA.get("powered_by", True)
88
88
  subject = request.DATA.get("invite_subject")
89
89
  url = request.DATA.get("invite_url")
90
90
  site_logo = request.DATA.get("site_logo", settings.SITE_LOGO)
91
91
  company_name = request.DATA.get("company_name", settings.COMPANY_NAME)
92
+ msg = request.DATA.get("invite_msg", None)
92
93
  else:
93
94
  powered_by = True
94
95
  site_logo = settings.SITE_LOGO
@@ -109,7 +110,7 @@ class Membership(models.Model, RestModel, MetaDataModel):
109
110
  url = "{}&auth_code={}".format(url, auth_token.toBase64())
110
111
  self.member.sendInvite(
111
112
  subject, self.group, url=url,
112
- msg=request.DATA.get("invite_msg", None),
113
+ msg=msg,
113
114
  POWERED_BY=powered_by,
114
115
  SITE_LOGO=site_logo,
115
116
  COMPANY_NAME=company_name,
@@ -151,12 +151,90 @@ class NotificationRecord(models.Model, RestModel):
151
151
  members = Member.objects.filter(email__in=emails)
152
152
  cls.notify(members, subject, message, template, context, email_only, sms_msg, force, from_email, attachments)
153
153
 
154
+
154
155
  @classmethod
155
156
  def notify(cls, notify_users, subject, message=None,
156
157
  template=None, context=None, email_only=False,
157
158
  sms_msg=None, force=False,
158
159
  from_email=settings.DEFAULT_FROM_EMAIL,
159
160
  attachments=[]):
161
+ dup_list = []
162
+ email_to = []
163
+ sms_to = []
164
+ for member in notify_users:
165
+ via = member.getProperty("notify_via", "all")
166
+ phone = member.getProperty("phone")
167
+ email = member.email
168
+ valid_email = email is not None and "@" in email and "invalid" not in email
169
+ allow_sms = not email_only and phone and (force or via in ["all", "sms"])
170
+ allow_email = not member.email_disabled and valid_email and (force or via in ["all", "email"])
171
+ if not allow_email and not allow_sms:
172
+ continue
173
+ if allow_email and email not in dup_list:
174
+ dup_list.append(email)
175
+ email_to.append(member)
176
+ if not email_only and allow_sms and phone not in dup_list:
177
+ dup_list.append(phone)
178
+ sms_to.append(phone)
179
+
180
+ if len(dup_list) == 0:
181
+ return
182
+
183
+ if not message and not template and subject:
184
+ message = subject
185
+ if not sms_msg and subject:
186
+ sms_msg = subject
187
+ if not sms_msg and message:
188
+ sms_msg = message
189
+
190
+ if subject and len(subject) > 80:
191
+ epos = subject.find('. ') + 1
192
+ if epos > 10:
193
+ subject = subject[:epos]
194
+ if len(subject) > 80:
195
+ subject = subject[:80]
196
+ subject = subject[:subject.rfind(' ')] + "..."
197
+
198
+ if sms_to:
199
+ for phone in sms_to:
200
+ SMS.send(phone, sms_msg)
201
+
202
+ if not email_to:
203
+ return
204
+ for member in email_to:
205
+ cls._notifyViaEmail(member, subject, message, template, context, attachments, from_email)
206
+
207
+ @classmethod
208
+ def _notifyViaEmail(cls, member, subject, message, template, context,
209
+ attachments, from_email=None):
210
+ # lets verify the db is working
211
+ if template:
212
+ if context is None:
213
+ context = {}
214
+ if message is not None:
215
+ context["body"] = message
216
+ context["unsubscribe_token"] = member.getUUID()
217
+ message = inbox.utils.renderTemplate(template, context)
218
+
219
+ nr = NotificationMemberRecord(member=member, to_addr=member.email)
220
+ email_record = NotificationRecord(
221
+ method="email",
222
+ subject=subject,
223
+ from_addr=from_email,
224
+ body=message)
225
+ try:
226
+ email_record.save()
227
+ email_record.addAttachments(attachments)
228
+ email_record.send([nr])
229
+ except Exception as err:
230
+ rh.log_exception("email send failed", email_to)
231
+
232
+ @classmethod
233
+ def notifyLegacy(cls, notify_users, subject, message=None,
234
+ template=None, context=None, email_only=False,
235
+ sms_msg=None, force=False,
236
+ from_email=settings.DEFAULT_FROM_EMAIL,
237
+ attachments=[]):
160
238
  # this will create a record for each email address message is sent to
161
239
  from telephony.models import SMS
162
240
  email_to = []
@@ -165,7 +243,6 @@ class NotificationRecord(models.Model, RestModel):
165
243
 
166
244
  if not message and not template and subject:
167
245
  message = subject
168
-
169
246
  if not sms_msg and subject:
170
247
  sms_msg = subject
171
248
  if not sms_msg and message:
@@ -197,7 +274,7 @@ class NotificationRecord(models.Model, RestModel):
197
274
  email = member.email
198
275
  valid_email = email is not None and "@" in email and "invalid" not in email
199
276
  allow_sms = not email_only and phone and (force or via in ["all", "sms"])
200
- allow_email = valid_email and (force or via in ["all", "email"])
277
+ allow_email = not member.email_disabled and valid_email and (force or via in ["all", "email"])
201
278
  if not allow_email and not allow_sms:
202
279
  continue
203
280
  if allow_email and email not in email_list:
@@ -226,7 +303,7 @@ class NotificationRecord(models.Model, RestModel):
226
303
  email_record.addAttachments(attachments)
227
304
  email_record.send(email_to)
228
305
  except Exception as err:
229
- print(("failed to create record: {}".format(str(err))))
306
+ rh.log_exception("email send failed", email_to)
230
307
  # we need to send emails the old way
231
308
  addrs = []
232
309
  for to in email_to:
@@ -302,6 +379,7 @@ class BounceHistory(models.Model, RestModel):
302
379
  if bounce_count > 2:
303
380
  # TODO notify support an account has been disabled because of bounce
304
381
  user.setProperty("notify_via", "off")
382
+ user.addPermission("email_disabled")
305
383
  user.log("disabled", "notifications disabled because email bounced", method="notify")
306
384
  else:
307
385
  # TODO notify support of unknown bounce
@@ -8,7 +8,7 @@ from rest import ua
8
8
  # replacing legacy cookie session system with more robust session info
9
9
  class AuthSession(models.Model, RestModel):
10
10
  class RestMeta:
11
- SEARCH_FIELDS = ["ip", "member__username", "browser", "location__city"]
11
+ SEARCH_FIELDS = ["ip", "member__username", "browser", "location__city", "buid"]
12
12
  VIEW_PERMS = ["view_members", "manage_members", "manage_users", "owner"]
13
13
  CAN_SAVE = False
14
14
  CAN_DELETE = False
@@ -12,6 +12,7 @@ from django.http import HttpResponse
12
12
  from datetime import datetime, timedelta
13
13
 
14
14
  ALLOW_BASIC_LOGIN = settings.get("ALLOW_BASIC_LOGIN", False)
15
+ FORGET_ALWAYS_TRUE = settings.get("FORGET_ALWAYS_TRUE", True)
15
16
 
16
17
 
17
18
  @rd.urlPOST(r'^login$')
@@ -57,7 +58,7 @@ def jwt_login(request):
57
58
 
58
59
 
59
60
  def on_complete_jwt(request, member):
60
- if member.security_token is None or member.security_token == JWT_KEY:
61
+ if member.security_token is None or member.security_token == JWT_KEY or member.force_single_session:
61
62
  member.refreshSecurityToken()
62
63
 
63
64
  member.log(
@@ -301,14 +302,20 @@ def member_forgot_password(request):
301
302
  """
302
303
  member, resp = get_member_from_request(request)
303
304
  if member is None:
305
+ if FORGET_ALWAYS_TRUE:
306
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
304
307
  return resp
305
308
  if resp is not None and not member.is_active:
309
+ if FORGET_ALWAYS_TRUE:
310
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
306
311
  return resp
307
312
 
308
313
  if request.DATA.get("use_code", False):
309
314
  return member_forgot_password_code(request, member)
310
315
 
311
316
  if member.auth_code is not None and member.auth_code_expires > datetime.now():
317
+ if FORGET_ALWAYS_TRUE:
318
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
312
319
  return rv.restPermissionDenied(request, "already sent valid auth code")
313
320
 
314
321
  member.auth_code = crypto.randomString(16)
@@ -325,7 +332,7 @@ def member_forgot_password(request):
325
332
  'to': [member.email],
326
333
  })
327
334
 
328
- return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email.")
335
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
329
336
 
330
337
 
331
338
  def member_forgot_password_code(request, member):
@@ -5,6 +5,13 @@ from account import models as am
5
5
  from objict import objict
6
6
 
7
7
 
8
+ @rd.url(r'^group/cloud/credentials$')
9
+ @rd.url(r'^group/cloud/credentials/(?P<pk>\d+)$')
10
+ @rd.login_required
11
+ def rest_on_group_cloud_creds(request, pk=None):
12
+ return am.CloudCredentials.on_rest_request(request, pk)
13
+
14
+
8
15
  @rd.url(r'^member/device$')
9
16
  @rd.url(r'^member/device/(?P<pk>\d+)$')
10
17
  @rd.login_required
@@ -1,5 +1,6 @@
1
1
  from rest import decorators as rd
2
- from rest.views import restPermissionDenied, restStatus
2
+ from rest.views import restPermissionDenied, restStatus, restHTML
3
+ from rest import helpers as rh
3
4
  from account import models as am
4
5
 
5
6
 
@@ -39,3 +40,14 @@ def rest_on_authtoken(request, pk=None):
39
40
  def rest_on_session(request, pk=None):
40
41
  return am.AuthSession.on_rest_request(request, pk)
41
42
 
43
+
44
+ @rd.urlGET('unsubscribe')
45
+ @rd.requires_params(["t"])
46
+ def rest_on_member(request):
47
+ t = request.DATA.get("t")
48
+ m = am.Member.objects.filter(uuid=t).last()
49
+ if m is not None:
50
+ m.addPermission("email_disabled")
51
+ m.reportIncident("email", f"{m.email} has unsubscribed to all email")
52
+ context = rh.getContext(request, member=m)
53
+ return restHTML(request, template="unsubscribed.html", context=context)
@@ -281,7 +281,7 @@
281
281
  <a href="{{settings.BASE_URL}}">{{settings.SITE_LABEL}}</a>
282
282
  </div>
283
283
  {% endblock %}
284
- <p style="text-align: center; font-size: 10px;">Don't want to get notifications? <a href="{{settings.BASE_URL}}rpc/account/member/unsubscribe?email={{to}}&token={{to_token}}">Unsubscribe</a>
284
+ <p style="text-align: center; font-size: 10px;">Don't want to get notifications? <a href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>
285
285
  </p>
286
286
  <div>
287
287
 
@@ -387,11 +387,6 @@
387
387
  <!-- START FOOTER -->
388
388
  <div class="footer">
389
389
  <table role="presentation" border="0" cellpadding="0" cellspacing="0">
390
- <tr>
391
- <td class="content-block">
392
- <br> Don't like these emails? <a href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
393
- </td>
394
- </tr>
395
390
  <tr>
396
391
  <td class="content-block powered-by">
397
392
  <div>Powered by {{SITE_LABEL}}</div>
@@ -295,13 +295,6 @@
295
295
  {% endif %}
296
296
  <tr>
297
297
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
298
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
299
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
300
- </div>
301
- </td>
302
- </tr>
303
- <tr>
304
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
305
298
 
306
299
  <table
307
300
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -284,13 +284,6 @@
284
284
  </tr>
285
285
  <tr>
286
286
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
287
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
288
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
289
- </div>
290
- </td>
291
- </tr>
292
- <tr>
293
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
294
287
 
295
288
  <table
296
289
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -377,11 +377,6 @@
377
377
  <!-- START FOOTER -->
378
378
  <div class="footer">
379
379
  <table role="presentation" border="0" cellpadding="0" cellspacing="0">
380
- <tr>
381
- <td class="content-block">
382
- <br> Don't like these emails? <a href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
383
- </td>
384
- </tr>
385
380
  <tr>
386
381
  <td class="content-block powered-by">
387
382
  <div>Powered by {{SITE_LABEL}}</div>
@@ -293,13 +293,6 @@
293
293
  </tr>
294
294
  <tr>
295
295
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
296
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#fafafa;">
297
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
298
- </div>
299
- </td>
300
- </tr>
301
- <tr>
302
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
303
296
 
304
297
  <table
305
298
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -284,13 +284,6 @@
284
284
  </tr>
285
285
  <tr>
286
286
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
287
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#fafafa;">
288
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
289
- </div>
290
- </td>
291
- </tr>
292
- <tr>
293
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
294
287
 
295
288
  <table
296
289
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"