django-restit 4.2.73__tar.gz → 4.2.75__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.73 → django_restit-4.2.75}/PKG-INFO +1 -1
  2. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/member.py +46 -7
  3. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/notify.py +81 -3
  4. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/auth.py +1 -1
  5. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/member.py +15 -1
  6. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/base.html +1 -1
  7. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/invite.html +0 -5
  8. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/plain/invite.html +0 -7
  9. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/plain/reset_code.html +0 -7
  10. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/reset_code.html +0 -5
  11. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/simple/invite.html +0 -7
  12. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/simple/reset_code.html +0 -7
  13. django_restit-4.2.75/account/templates/unsubscribed.html +74 -0
  14. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/utils/render.py +1 -0
  15. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/incident.py +1 -1
  16. {django_restit-4.2.73 → django_restit-4.2.75}/incident/parsers/ossec.py +21 -2
  17. {django_restit-4.2.73 → django_restit-4.2.75}/incident/rpc.py +1 -0
  18. {django_restit-4.2.73 → django_restit-4.2.75}/incident/templates/email/incident_change.html +1 -1
  19. {django_restit-4.2.73 → django_restit-4.2.75}/incident/templates/email/incident_msg.html +1 -1
  20. {django_restit-4.2.73 → django_restit-4.2.75}/incident/templates/email/incident_new.html +1 -1
  21. {django_restit-4.2.73 → django_restit-4.2.75}/incident/templates/email/incident_plain.html +1 -1
  22. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/rpc.py +8 -2
  23. {django_restit-4.2.73 → django_restit-4.2.75}/pyproject.toml +1 -1
  24. {django_restit-4.2.73 → django_restit-4.2.75}/rest/helpers.py +3 -1
  25. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/response.py +8 -0
  26. {django_restit-4.2.73 → django_restit-4.2.75}/LICENSE.md +0 -0
  27. {django_restit-4.2.73 → django_restit-4.2.75}/README.md +0 -0
  28. {django_restit-4.2.73 → django_restit-4.2.75}/account/__init__.py +0 -0
  29. {django_restit-4.2.73 → django_restit-4.2.75}/account/admin.py +0 -0
  30. {django_restit-4.2.73 → django_restit-4.2.75}/account/fcm/__init__.py +0 -0
  31. {django_restit-4.2.73 → django_restit-4.2.75}/account/fcm/google.py +0 -0
  32. {django_restit-4.2.73 → django_restit-4.2.75}/account/fcm/v1.py +0 -0
  33. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0001_initial.py +0 -0
  34. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0003_member_phone_number.py +0 -0
  35. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
  36. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0005_member_auth_code_expires.py +0 -0
  37. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0006_member_security_token.py +0 -0
  38. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
  39. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
  40. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0009_alter_member_phone_number.py +0 -0
  41. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0010_delete_authtoken.py +0 -0
  42. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0011_authtoken.py +0 -0
  43. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0012_settings_settingsmetadata.py +0 -0
  44. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0013_memberdevice_ip.py +0 -0
  45. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
  46. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0015_memberdevice_buid.py +0 -0
  47. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0016_authsession_buid.py +0 -0
  48. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
  49. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0018_userpasskey.py +0 -0
  50. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0019_group_location.py +0 -0
  51. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
  52. {django_restit-4.2.73 → django_restit-4.2.75}/account/migrations/__init__.py +0 -0
  53. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/__init__.py +0 -0
  54. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/device.py +0 -0
  55. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/feeds.py +0 -0
  56. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/group.py +0 -0
  57. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/legacy.py +0 -0
  58. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/membership.py +0 -0
  59. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/passkeys.py +0 -0
  60. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/session.py +0 -0
  61. {django_restit-4.2.73 → django_restit-4.2.75}/account/models/settings.py +0 -0
  62. {django_restit-4.2.73 → django_restit-4.2.75}/account/oauth/__init__.py +0 -0
  63. {django_restit-4.2.73 → django_restit-4.2.75}/account/oauth/google.py +0 -0
  64. {django_restit-4.2.73 → django_restit-4.2.75}/account/passkeys/__init__.py +0 -0
  65. {django_restit-4.2.73 → django_restit-4.2.75}/account/passkeys/core.py +0 -0
  66. {django_restit-4.2.73 → django_restit-4.2.75}/account/periodic.py +0 -0
  67. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/__init__.py +0 -0
  68. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/device.py +0 -0
  69. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/group.py +0 -0
  70. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/notify.py +0 -0
  71. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/oauth.py +0 -0
  72. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/passkeys.py +0 -0
  73. {django_restit-4.2.73 → django_restit-4.2.75}/account/rpc/settings.py +0 -0
  74. {django_restit-4.2.73 → django_restit-4.2.75}/account/settings.py +0 -0
  75. {django_restit-4.2.73 → django_restit-4.2.75}/account/templates/email/plain/base.html +0 -0
  76. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/README +0 -0
  77. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/__init__.py +0 -0
  78. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/admin.py +0 -0
  79. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/cloudwatch.py +0 -0
  80. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/decorators.py +0 -0
  81. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/middleware.py +0 -0
  82. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/migrations/0001_initial.py +0 -0
  83. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/migrations/__init__.py +0 -0
  84. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/models.py +0 -0
  85. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/periodic.py +0 -0
  86. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/rpc.py +0 -0
  87. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/tq.py +0 -0
  88. {django_restit-4.2.73 → django_restit-4.2.75}/auditlog/urls.py +0 -0
  89. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/README.md +0 -0
  90. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/__init__.py +0 -0
  91. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/admin.py +0 -0
  92. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/handlers.py +0 -0
  93. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/migrations/0001_initial.py +0 -0
  94. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/migrations/0002_alter_message_cc.py +0 -0
  95. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/migrations/0003_attachment_content_type.py +0 -0
  96. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/migrations/0004_mailtemplate.py +0 -0
  97. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/migrations/__init__.py +0 -0
  98. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/models/__init__.py +0 -0
  99. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/models/bounce.py +0 -0
  100. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/models/complaint.py +0 -0
  101. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/models/message.py +0 -0
  102. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/models/template.py +0 -0
  103. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/rpc.py +0 -0
  104. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/utils/__init__.py +0 -0
  105. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/utils/parsing.py +0 -0
  106. {django_restit-4.2.73 → django_restit-4.2.75}/inbox/utils/sending.py +0 -0
  107. {django_restit-4.2.73 → django_restit-4.2.75}/incident/README.md +0 -0
  108. {django_restit-4.2.73 → django_restit-4.2.75}/incident/__init__.py +0 -0
  109. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0001_initial.py +0 -0
  110. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0002_event_component_event_component_id.py +0 -0
  111. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0003_rule_action.py +0 -0
  112. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
  113. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
  114. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0006_delete_eventmetadata.py +0 -0
  115. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0007_event_metadata.py +0 -0
  116. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
  117. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0009_incident_reporter_ip.py +0 -0
  118. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
  119. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0011_ticket.py +0 -0
  120. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0012_rule_match_by.py +0 -0
  121. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0013_rulecheck_is_required.py +0 -0
  122. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
  123. {django_restit-4.2.73 → django_restit-4.2.75}/incident/migrations/__init__.py +0 -0
  124. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/__init__.py +0 -0
  125. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/event.py +0 -0
  126. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/ossec.py +0 -0
  127. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/rules.py +0 -0
  128. {django_restit-4.2.73 → django_restit-4.2.75}/incident/models/ticket.py +0 -0
  129. {django_restit-4.2.73 → django_restit-4.2.75}/incident/parsers/__init__.py +0 -0
  130. {django_restit-4.2.73 → django_restit-4.2.75}/incident/periodic.py +0 -0
  131. {django_restit-4.2.73 → django_restit-4.2.75}/incident/tq.py +0 -0
  132. {django_restit-4.2.73 → django_restit-4.2.75}/location/__init__.py +0 -0
  133. {django_restit-4.2.73 → django_restit-4.2.75}/location/admin.py +0 -0
  134. {django_restit-4.2.73 → django_restit-4.2.75}/location/geolocate.py +0 -0
  135. {django_restit-4.2.73 → django_restit-4.2.75}/location/migrations/0001_initial.py +0 -0
  136. {django_restit-4.2.73 → django_restit-4.2.75}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
  137. {django_restit-4.2.73 → django_restit-4.2.75}/location/migrations/0003_address_postalcode_suffix.py +0 -0
  138. {django_restit-4.2.73 → django_restit-4.2.75}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
  139. {django_restit-4.2.73 → django_restit-4.2.75}/location/migrations/__init__.py +0 -0
  140. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/__init__.py +0 -0
  141. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/address.py +0 -0
  142. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/ip.py +0 -0
  143. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/legacy.py +0 -0
  144. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/location.py +0 -0
  145. {django_restit-4.2.73 → django_restit-4.2.75}/location/models/track.py +0 -0
  146. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/__init__.py +0 -0
  147. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/__init__.py +0 -0
  148. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/abstractapi.py +0 -0
  149. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/extremeip.py +0 -0
  150. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/geoplugin.py +0 -0
  151. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/ipapi.py +0 -0
  152. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/ipinfo.py +0 -0
  153. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/iplookup/restit.py +0 -0
  154. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/location/__init__.py +0 -0
  155. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/location/google.py +0 -0
  156. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/timezones/__init__.py +0 -0
  157. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/timezones/google.py +0 -0
  158. {django_restit-4.2.73 → django_restit-4.2.75}/location/providers/zillow.py +0 -0
  159. {django_restit-4.2.73 → django_restit-4.2.75}/location/rpc/__init__.py +0 -0
  160. {django_restit-4.2.73 → django_restit-4.2.75}/location/rpc/address.py +0 -0
  161. {django_restit-4.2.73 → django_restit-4.2.75}/location/rpc/ip.py +0 -0
  162. {django_restit-4.2.73 → django_restit-4.2.75}/location/rpc/location.py +0 -0
  163. {django_restit-4.2.73 → django_restit-4.2.75}/location/rpc/track.py +0 -0
  164. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/__init__.py +0 -0
  165. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/admin.py +0 -0
  166. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/cvutil/__init__.py +0 -0
  167. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/cvutil/contours.py +0 -0
  168. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/cvutil/images.py +0 -0
  169. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/cvutil/misc.py +0 -0
  170. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/cvutil/text.py +0 -0
  171. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/fixtures/initial_data.json +0 -0
  172. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/fixtures/medialib.json +0 -0
  173. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/fixtures/medialib_test_fixture.json +0 -0
  174. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/forms.py +0 -0
  175. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/migrations/0001_initial.py +0 -0
  176. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/migrations/__init__.py +0 -0
  177. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/models.py +0 -0
  178. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/ocr.py +0 -0
  179. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/pdf.py +0 -0
  180. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/qrcode.py +0 -0
  181. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/__init__.py +0 -0
  182. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/__init__.py +0 -0
  183. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/anigif.py +0 -0
  184. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/ffmpeg.py +0 -0
  185. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/gifsicle.py +0 -0
  186. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/hls.py +0 -0
  187. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/mp4box.py +0 -0
  188. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/rtmp/Makefile +0 -0
  189. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/rtmp/__init__.py +0 -0
  190. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/rtmp/rtmp.i +0 -0
  191. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/rtmpdump.py +0 -0
  192. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/rtmpsink.py +0 -0
  193. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/video_getinfo.py +0 -0
  194. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/engines/websnap.py +0 -0
  195. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/exceptions.py +0 -0
  196. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/__init__.py +0 -0
  197. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/akamai.py +0 -0
  198. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/animated_thumbnail.py +0 -0
  199. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/ffmpeg.py +0 -0
  200. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/flv.py +0 -0
  201. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/hls.py +0 -0
  202. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/image_transcode.py +0 -0
  203. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/image_validate.py +0 -0
  204. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/mp4.py +0 -0
  205. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/video_still.py +0 -0
  206. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/video_validate.py +0 -0
  207. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/websnap.py +0 -0
  208. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/presets/youtube.py +0 -0
  209. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/render_utils.py +0 -0
  210. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/render/schedule.py +0 -0
  211. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/rpc/__init__.py +0 -0
  212. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/rpc/legacy.py +0 -0
  213. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/rpc/media.py +0 -0
  214. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/rpc/tools.py +0 -0
  215. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/scripts/init_config +0 -0
  216. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/css/base_medialibui.css +0 -0
  217. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/css/base_widgets.css +0 -0
  218. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/css/jquery.jcrop.css +0 -0
  219. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/arrow-down-white.png +0 -0
  220. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/bg-body.gif +0 -0
  221. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/cancel.gif +0 -0
  222. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/icon-generic.gif +0 -0
  223. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/icon-image.gif +0 -0
  224. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/icon-media.gif +0 -0
  225. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/icon-zip.gif +0 -0
  226. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/loading.gif +0 -0
  227. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/noimage.gif +0 -0
  228. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/render_err.gif +0 -0
  229. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/rendering.gif +0 -0
  230. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/star_off.png +0 -0
  231. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/star_on.png +0 -0
  232. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/img/unknown.gif +0 -0
  233. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/caman.full.js +0 -0
  234. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/hammer.min.js +0 -0
  235. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/jquery.Jcrop.js +0 -0
  236. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/jquery.hammer.js +0 -0
  237. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/load-image.min.js +0 -0
  238. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/swiper.js +0 -0
  239. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
  240. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
  241. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
  242. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
  243. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/__init__.py +0 -0
  244. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/__init__.py +0 -0
  245. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/channel.py +0 -0
  246. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/discovery.py +0 -0
  247. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/errors.py +0 -0
  248. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/http.py +0 -0
  249. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/mimeparse.py +0 -0
  250. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/model.py +0 -0
  251. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/sample_tools.py +0 -0
  252. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/apiclient/schema.py +0 -0
  253. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/filestore.py +0 -0
  254. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/httplib2/__init__.py +0 -0
  255. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/httplib2/cacerts.txt +0 -0
  256. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/httplib2/iri2uri.py +0 -0
  257. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/httplib2/socks.py +0 -0
  258. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/httpstore.py +0 -0
  259. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/nullstore.py +0 -0
  260. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/__init__.py +0 -0
  261. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/anyjson.py +0 -0
  262. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/appengine.py +0 -0
  263. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/client.py +0 -0
  264. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/clientsecrets.py +0 -0
  265. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/crypt.py +0 -0
  266. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/django_orm.py +0 -0
  267. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/file.py +0 -0
  268. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/gce.py +0 -0
  269. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/keyring_storage.py +0 -0
  270. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/locked_file.py +0 -0
  271. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/multistore_file.py +0 -0
  272. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/old_run.py +0 -0
  273. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/tools.py +0 -0
  274. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/util.py +0 -0
  275. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/oauth2client/xsrfutil.py +0 -0
  276. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/rtmpstore.py +0 -0
  277. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/s3store.py +0 -0
  278. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/uritemplate/__init__.py +0 -0
  279. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/stores/youtubestore.py +0 -0
  280. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/base.html +0 -0
  281. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/instances.html +0 -0
  282. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/items.html +0 -0
  283. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/library.html +0 -0
  284. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_error.subject +0 -0
  285. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_error.to +0 -0
  286. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_error.txt +0 -0
  287. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_ready.subject +0 -0
  288. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_ready.to +0 -0
  289. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_ready.txt +0 -0
  290. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_render_error.subject +0 -0
  291. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_render_error.to +0 -0
  292. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_render_error.txt +0 -0
  293. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_validate_error.subject +0 -0
  294. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_validate_error.to +0 -0
  295. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/notify_validate_error.txt +0 -0
  296. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/smil +0 -0
  297. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/test.html +0 -0
  298. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/templates/medialib/testpicker.html +0 -0
  299. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/tests.py +0 -0
  300. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/tq.py +0 -0
  301. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/urls.py +0 -0
  302. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/utils.py +0 -0
  303. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/views.py +0 -0
  304. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/__init__.py +0 -0
  305. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/__init__.py +0 -0
  306. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/channel.py +0 -0
  307. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/discovery.py +0 -0
  308. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/errors.py +0 -0
  309. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/http.py +0 -0
  310. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/mimeparse.py +0 -0
  311. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/model.py +0 -0
  312. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/sample_tools.py +0 -0
  313. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/apiclient/schema.py +0 -0
  314. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/httplib2/__init__.py +0 -0
  315. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/httplib2/cacerts.txt +0 -0
  316. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/httplib2/iri2uri.py +0 -0
  317. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/httplib2/socks.py +0 -0
  318. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/__init__.py +0 -0
  319. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/anyjson.py +0 -0
  320. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/appengine.py +0 -0
  321. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/client.py +0 -0
  322. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
  323. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/crypt.py +0 -0
  324. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/django_orm.py +0 -0
  325. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/file.py +0 -0
  326. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/gce.py +0 -0
  327. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
  328. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/locked_file.py +0 -0
  329. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/multistore_file.py +0 -0
  330. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/old_run.py +0 -0
  331. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/tools.py +0 -0
  332. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/util.py +0 -0
  333. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
  334. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/upload.py +0 -0
  335. {django_restit-4.2.73 → django_restit-4.2.75}/medialib/youtube/uritemplate/__init__.py +0 -0
  336. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/README.md +0 -0
  337. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/__init__.py +0 -0
  338. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/client.py +0 -0
  339. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/eod.py +0 -0
  340. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/examples/eod_example.py +0 -0
  341. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/__init__.py +0 -0
  342. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/__init__.py +0 -0
  343. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/delete_gauge.py +0 -0
  344. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/delete_metric.py +0 -0
  345. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
  346. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/generate_test_metrics.py +0 -0
  347. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
  348. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/reset_weekly_metrics.py +0 -0
  349. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/management/commands/system_metric.py +0 -0
  350. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/0001_initial.py +0 -0
  351. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
  352. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/0003_metrics_expires.py +0 -0
  353. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/0004_eodmetrics.py +0 -0
  354. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
  355. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/migrations/__init__.py +0 -0
  356. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/models.py +0 -0
  357. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/periodic.py +0 -0
  358. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/providers/__init__.py +0 -0
  359. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/providers/aws.py +0 -0
  360. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/settings.py +0 -0
  361. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/tq.py +0 -0
  362. {django_restit-4.2.73 → django_restit-4.2.75}/metrics/utils.py +0 -0
  363. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/__init__.py +0 -0
  364. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/admin.py +0 -0
  365. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/migrations/0001_initial.py +0 -0
  366. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/migrations/__init__.py +0 -0
  367. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/models.py +0 -0
  368. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/rpc/__init__.py +0 -0
  369. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/rpc/githooks.py +0 -0
  370. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/rpc/legacy.py +0 -0
  371. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/rpc/products.py +0 -0
  372. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/static/js/models_pushit.js +0 -0
  373. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/tq.py +0 -0
  374. {django_restit-4.2.73 → django_restit-4.2.75}/pushit/utils.py +0 -0
  375. {django_restit-4.2.73 → django_restit-4.2.75}/rest/.gitignore +0 -0
  376. {django_restit-4.2.73 → django_restit-4.2.75}/rest/README.md +0 -0
  377. {django_restit-4.2.73 → django_restit-4.2.75}/rest/RemoteEvents.py +0 -0
  378. {django_restit-4.2.73 → django_restit-4.2.75}/rest/__init__.py +0 -0
  379. {django_restit-4.2.73 → django_restit-4.2.75}/rest/arc4.py +0 -0
  380. {django_restit-4.2.73 → django_restit-4.2.75}/rest/cache.py +0 -0
  381. {django_restit-4.2.73 → django_restit-4.2.75}/rest/crypto/__init__.py +0 -0
  382. {django_restit-4.2.73 → django_restit-4.2.75}/rest/crypto/aes.py +0 -0
  383. {django_restit-4.2.73 → django_restit-4.2.75}/rest/crypto/privpub.py +0 -0
  384. {django_restit-4.2.73 → django_restit-4.2.75}/rest/crypto/util.py +0 -0
  385. {django_restit-4.2.73 → django_restit-4.2.75}/rest/datem.py +0 -0
  386. {django_restit-4.2.73 → django_restit-4.2.75}/rest/decorators.py +0 -0
  387. {django_restit-4.2.73 → django_restit-4.2.75}/rest/encryption.py +0 -0
  388. {django_restit-4.2.73 → django_restit-4.2.75}/rest/errors.py +0 -0
  389. {django_restit-4.2.73 → django_restit-4.2.75}/rest/extra/__init__.py +0 -0
  390. {django_restit-4.2.73 → django_restit-4.2.75}/rest/extra/json_metadata.py +0 -0
  391. {django_restit-4.2.73 → django_restit-4.2.75}/rest/fields.py +0 -0
  392. {django_restit-4.2.73 → django_restit-4.2.75}/rest/forms.py +0 -0
  393. {django_restit-4.2.73 → django_restit-4.2.75}/rest/joke.py +0 -0
  394. {django_restit-4.2.73 → django_restit-4.2.75}/rest/jwtoken.py +0 -0
  395. {django_restit-4.2.73 → django_restit-4.2.75}/rest/log.py +0 -0
  396. {django_restit-4.2.73 → django_restit-4.2.75}/rest/mail.py +0 -0
  397. {django_restit-4.2.73 → django_restit-4.2.75}/rest/mailman.py +0 -0
  398. {django_restit-4.2.73 → django_restit-4.2.75}/rest/management/__init__.py +0 -0
  399. {django_restit-4.2.73 → django_restit-4.2.75}/rest/management/commands/__init__.py +0 -0
  400. {django_restit-4.2.73 → django_restit-4.2.75}/rest/management/commands/rpc.py +0 -0
  401. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/__init__.py +0 -0
  402. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/cors.py +0 -0
  403. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/db_router.py +0 -0
  404. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/jwt.py +0 -0
  405. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/request.py +0 -0
  406. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/session.py +0 -0
  407. {django_restit-4.2.73 → django_restit-4.2.75}/rest/middleware/session_store.py +0 -0
  408. {django_restit-4.2.73 → django_restit-4.2.75}/rest/models/__init__.py +0 -0
  409. {django_restit-4.2.73 → django_restit-4.2.75}/rest/models/base.py +0 -0
  410. {django_restit-4.2.73 → django_restit-4.2.75}/rest/models/cacher.py +0 -0
  411. {django_restit-4.2.73 → django_restit-4.2.75}/rest/models/metadata.py +0 -0
  412. {django_restit-4.2.73 → django_restit-4.2.75}/rest/net.py +0 -0
  413. {django_restit-4.2.73 → django_restit-4.2.75}/rest/regexes.yaml +0 -0
  414. {django_restit-4.2.73 → django_restit-4.2.75}/rest/requestex.py +0 -0
  415. {django_restit-4.2.73 → django_restit-4.2.75}/rest/rpc.py +0 -0
  416. {django_restit-4.2.73 → django_restit-4.2.75}/rest/search.py +0 -0
  417. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/__init__.py +0 -0
  418. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/collection.py +0 -0
  419. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/csv.py +0 -0
  420. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/excel.py +0 -0
  421. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/json.py +0 -0
  422. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/legacy.py +0 -0
  423. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/localizers.py +0 -0
  424. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/model.py +0 -0
  425. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/profiler.py +0 -0
  426. {django_restit-4.2.73 → django_restit-4.2.75}/rest/serializers/util.py +0 -0
  427. {django_restit-4.2.73 → django_restit-4.2.75}/rest/settings_helper.py +0 -0
  428. {django_restit-4.2.73 → django_restit-4.2.75}/rest/ssl_check.py +0 -0
  429. {django_restit-4.2.73 → django_restit-4.2.75}/rest/static/lib/jquery.js +0 -0
  430. {django_restit-4.2.73 → django_restit-4.2.75}/rest/static/rest/app.css +0 -0
  431. {django_restit-4.2.73 → django_restit-4.2.75}/rest/static/rest/app.js +0 -0
  432. {django_restit-4.2.73 → django_restit-4.2.75}/rest/static/rest/rest.js +0 -0
  433. {django_restit-4.2.73 → django_restit-4.2.75}/rest/static/rest/rest.scss +0 -0
  434. {django_restit-4.2.73 → django_restit-4.2.75}/rest/templates/email/error.html +0 -0
  435. {django_restit-4.2.73 → django_restit-4.2.75}/rest/templates/email/error.subject +0 -0
  436. {django_restit-4.2.73 → django_restit-4.2.75}/rest/templates/rest_docs.html +0 -0
  437. {django_restit-4.2.73 → django_restit-4.2.75}/rest/templates/rest_html.html +0 -0
  438. {django_restit-4.2.73 → django_restit-4.2.75}/rest/ua.py +0 -0
  439. {django_restit-4.2.73 → django_restit-4.2.75}/rest/uberdict.py +0 -0
  440. {django_restit-4.2.73 → django_restit-4.2.75}/rest/url_docs.py +0 -0
  441. {django_restit-4.2.73 → django_restit-4.2.75}/rest/urls.py +0 -0
  442. {django_restit-4.2.73 → django_restit-4.2.75}/rest/views.py +0 -0
  443. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/.gitignore +0 -0
  444. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/README.md +0 -0
  445. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/__init__.py +0 -0
  446. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/admin.py +0 -0
  447. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/migrations/0001_initial.py +0 -0
  448. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/migrations/__init__.py +0 -0
  449. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/models.py +0 -0
  450. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/tests.py +0 -0
  451. {django_restit-4.2.73 → django_restit-4.2.75}/sessionlog/views.py +0 -0
  452. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/README.md +0 -0
  453. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/__init__.py +0 -0
  454. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/admin.py +0 -0
  455. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/migrations/0001_initial.py +0 -0
  456. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/migrations/__init__.py +0 -0
  457. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/models.py +0 -0
  458. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/periodic.py +0 -0
  459. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/rpc.py +0 -0
  460. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/tq.py +0 -0
  461. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/__init__.py +0 -0
  462. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/email.py +0 -0
  463. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/http.py +0 -0
  464. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/s3.py +0 -0
  465. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/sftp.py +0 -0
  466. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/transports/sms.py +0 -0
  467. {django_restit-4.2.73 → django_restit-4.2.75}/taskqueue/worker.py +0 -0
  468. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/__init__.py +0 -0
  469. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/admin.py +0 -0
  470. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/decorators.py +0 -0
  471. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/migrations/0001_initial.py +0 -0
  472. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/migrations/0002_alter_sms_sid.py +0 -0
  473. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/migrations/__init__.py +0 -0
  474. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/models.py +0 -0
  475. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/phone_util.py +0 -0
  476. {django_restit-4.2.73 → django_restit-4.2.75}/telephony/rpc.py +0 -0
  477. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/__init__.py +0 -0
  478. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/migrations/0001_initial.py +0 -0
  479. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/migrations/__init__.py +0 -0
  480. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/models/__init__.py +0 -0
  481. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/models/faq.py +0 -0
  482. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/models/page.py +0 -0
  483. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/models/revision.py +0 -0
  484. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/periodic.py +0 -0
  485. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/__init__.py +0 -0
  486. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/__init__.py +0 -0
  487. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/highlight.py +0 -0
  488. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/math.py +0 -0
  489. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/media.py +0 -0
  490. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/meta.py +0 -0
  491. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/task_list.py +0 -0
  492. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/renderers/mistune/toc.py +0 -0
  493. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/rpc/__init__.py +0 -0
  494. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/rpc/wiki.py +0 -0
  495. {django_restit-4.2.73 → django_restit-4.2.75}/wiki/tq.py +0 -0
  496. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/README.md +0 -0
  497. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/__init__.py +0 -0
  498. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/client.py +0 -0
  499. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/connection.py +0 -0
  500. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/exceptions.py +0 -0
  501. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/redis.py +0 -0
  502. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/servers/__init__.py +0 -0
  503. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/servers/base.py +0 -0
  504. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/servers/django.py +0 -0
  505. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/servers/uwsgi.py +0 -0
  506. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/settings.py +0 -0
  507. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/utf8validator.py +0 -0
  508. {django_restit-4.2.73 → django_restit-4.2.75}/ws4redis/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.73
3
+ Version: 4.2.75
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -224,7 +224,11 @@ class Member(User, RestModel, MetaDataModel):
224
224
 
225
225
  @property
226
226
  def force_single_session(self):
227
- return self.getProperty("force_single_session", category="permissions", default=None)
227
+ return self.hasPermission("force_single_session")
228
+
229
+ @property
230
+ def email_disabled(self):
231
+ return self.hasPermission("email_disabled")
228
232
 
229
233
  @property
230
234
  def has_totp(self):
@@ -528,7 +532,7 @@ class Member(User, RestModel, MetaDataModel):
528
532
  body += "<br>\n".join(accounts)
529
533
  Member.notifyWithPermission("user_audit", subject, message=body, email_only=True)
530
534
 
531
- def locateByIP(self, ip):
535
+ def locateByIP(self, ip, security_check=True):
532
536
  loc = GeoIP.get(ip)
533
537
  if loc is not None:
534
538
  self.setProperty("last_ip", ip)
@@ -537,6 +541,26 @@ class Member(User, RestModel, MetaDataModel):
537
541
  self.setProperty("country", loc.country, "location")
538
542
  self.setProperty("lat", loc.lat, "location")
539
543
  self.setProperty("lng", loc.lng, "location")
544
+ if security_check:
545
+ self.checkLocationSecurity(loc)
546
+
547
+ def checkLocationSecurity(self, loc=None, ip=None):
548
+ if loc is None and ip is None:
549
+ return
550
+ if loc is None:
551
+ loc = GeoIP.get(ip)
552
+ auth_session = self.auth_sessions.last()
553
+ # check for state or country changes
554
+ if auth_session is not None and auth_session.location is not None:
555
+ try:
556
+ if auth_session.location.country != loc.country:
557
+ details = f"user login from new country {loc.country} vs previous {auth_session.location.country}"
558
+ self.reportIncident("account", details)
559
+ elif auth_session.location.state != loc.state:
560
+ details = f"user login from new state {loc.state} vs previous {auth_session.location.state}"
561
+ self.reportIncident("account", details)
562
+ except Exception:
563
+ rh.log_exception(self.username)
540
564
 
541
565
  def sendSMS(self, msg):
542
566
  from telephony.models import SMS
@@ -622,7 +646,11 @@ class Member(User, RestModel, MetaDataModel):
622
646
  email = self.email
623
647
  valid_email = email is not None and "@" in email and "invalid" not in email
624
648
  allow_sms = not email_only and phone and (force or via in ["all", "sms"])
625
- allow_email = valid_email and (force or via in ["all", "email"])
649
+ if not force:
650
+ allow_email = not self.email_disabled and valid_email and (force or via in ["all", "email"])
651
+ else:
652
+ allow_email = valid_email
653
+
626
654
  if not allow_email and not allow_sms:
627
655
  return False
628
656
 
@@ -1049,7 +1077,7 @@ class Member(User, RestModel, MetaDataModel):
1049
1077
  return Member.objects.filter(phone_number=phone_number.lower()).last()
1050
1078
 
1051
1079
  @staticmethod
1052
- def GetWithPermission(perm, email_list=False):
1080
+ def GetWithPermission(perm, email_list=False, ignore_disabled_email=True):
1053
1081
  if type(perm) is list:
1054
1082
  queries = [Q(properties__category="permissions", properties__key=p, properties__value="1") for p in perm]
1055
1083
  query = queries.pop()
@@ -1059,12 +1087,17 @@ class Member(User, RestModel, MetaDataModel):
1059
1087
  else:
1060
1088
  qset = Member.objects.filter(is_active=True).filter(properties__category="permissions", properties__key=perm, properties__value="1")
1061
1089
 
1090
+ if not ignore_disabled_email:
1091
+ qset = qset.exclude(
1092
+ properties__category="permissions",
1093
+ properties__key="email_disabled",
1094
+ properties__int_value=1)
1062
1095
  if email_list:
1063
1096
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1064
1097
  return qset
1065
1098
 
1066
1099
  @staticmethod
1067
- def GetWithNotification(perm, email_list=False, exclude_member=None):
1100
+ def GetWithNotification(perm, email_list=False, exclude_member=None, ignore_disabled_email=True):
1068
1101
  qset = Member.objects.filter(is_active=True)
1069
1102
  if exclude_member:
1070
1103
  qset = qset.exclude(pk=exclude_member.pk)
@@ -1087,6 +1120,11 @@ class Member(User, RestModel, MetaDataModel):
1087
1120
  properties__key=perm,
1088
1121
  properties__int_value=1)
1089
1122
 
1123
+ if not ignore_disabled_email:
1124
+ qset = qset.exclude(
1125
+ properties__category="permissions",
1126
+ properties__key="email_disabled",
1127
+ properties__int_value=1)
1090
1128
  if email_list:
1091
1129
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1092
1130
  return qset
@@ -1133,7 +1171,7 @@ class Member(User, RestModel, MetaDataModel):
1133
1171
  email_only=False, sms_msg=None, force=False, from_email=None):
1134
1172
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1135
1173
  NotificationRecord.notify(
1136
- Member.GetWithPermission(perm), subject, message,
1174
+ Member.GetWithPermission(perm, ignore_disabled_email=True), subject, message,
1137
1175
  template, context, email_only, sms_msg, force,
1138
1176
  from_email=from_email)
1139
1177
 
@@ -1143,7 +1181,8 @@ class Member(User, RestModel, MetaDataModel):
1143
1181
  exclude_member=None):
1144
1182
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1145
1183
  NotificationRecord.notify(
1146
- Member.GetWithNotification(setting, exclude_member=exclude_member), subject, message,
1184
+ Member.GetWithNotification(setting, exclude_member=exclude_member, ignore_disabled_email=True),
1185
+ subject, message,
1147
1186
  template, context, email_only, sms_msg, force,
1148
1187
  from_email=from_email)
1149
1188
 
@@ -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
@@ -58,7 +58,7 @@ def jwt_login(request):
58
58
 
59
59
 
60
60
  def on_complete_jwt(request, member):
61
- 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:
62
62
  member.refreshSecurityToken()
63
63
 
64
64
  member.log(
@@ -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,16 @@ 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
+ if request.DATA.get("format") == "json":
54
+ return restStatus(request, True)
55
+ 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"
@@ -0,0 +1,74 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unsubscription Successful</title>
7
+ <style>
8
+ body {
9
+ font-family: 'Arial', sans-serif;
10
+ background-color: #c6dde0;
11
+ margin: 0;
12
+ padding: 0;
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ height: 100vh;
17
+ color: #333;
18
+ }
19
+ .container {
20
+ /* background-color: white;*/
21
+ padding: 40px 60px;
22
+ /* border-radius: 10px;*/
23
+ /* box-shadow: 0 4px 8px rgba(0,0,0,0.1);*/
24
+ text-align: center;
25
+ max-width: 500px;
26
+ }
27
+ .footer {
28
+ padding: 40px 60px;
29
+ text-align: center;
30
+ }
31
+ h1 {
32
+ color: #4c79af;
33
+ margin: 0;
34
+ text-shadow: 1px 1px 1px #a7a7a7;
35
+ }
36
+ h2, h3, h4 {
37
+ color: #4CAF50;
38
+ margin-top: 5px;
39
+ }
40
+ p {
41
+ margin-top: 20px;
42
+ font-size: 16px;
43
+ font-weight: bold;
44
+ }
45
+
46
+ span {
47
+ text-decoration: underline;
48
+ }
49
+ </style>
50
+ </head>
51
+ <body>
52
+ <div>
53
+ <div class="container">
54
+ <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
55
+ <image id="Image-Layer" x="-1" y="-1" width="202" height="202" xlink:href="data:image/png;base64, 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"/>
56
+ </svg>
57
+ {% if member %}
58
+ <h1>{{member.display_name}}</h1>
59
+ {% else %}
60
+ <h2>Successfully Unsubscribed</h2>
61
+ {% endif %}
62
+
63
+ <p>You have been successfully <span>unsubscribed</span> from all notifications.</p>
64
+ <p>You will no longer receive any further communications from us. If this was a mistake, you can resubscribe at any time.</p>
65
+ </div>
66
+ <div class="footer">
67
+ <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center">
68
+ <div>Powered by {{SITE_LABEL}}</div>
69
+ <div>© 2023 {{COMPANY_LABEL}}</div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </body>
74
+ </html>
@@ -80,6 +80,7 @@ def renderTemplate(template, context, group=None):
80
80
  context["BASE_URL"] = settings.BASE_URL
81
81
  context["SITE_LOGO"] = settings.SITE_LOGO
82
82
  context["SERVER_NAME"] = settings.SERVER_NAME
83
+ context["UNSUBSCRIBE_URL"] = settings.get("UNSUBSCRIBE_URL", f"{settings.BASE_URL}/api/account/unsubscribe")
83
84
  context["version"] = settings.VERSION
84
85
  if "COMPANY_NAME" not in context and settings.COMPANY_NAME:
85
86
  context["COMPANY_NAME"] = settings.COMPANY_NAME
@@ -424,7 +424,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
424
424
  else:
425
425
  # notitfy everyone but the sender
426
426
  if history.by is None:
427
- members = Member.GetWithPermission(perm).exclude(pk=history.by.pk)
427
+ members = Member.GetWithPermission(perm, ignore_disabled_email=True).exclude(pk=history.by.pk)
428
428
  if members.count() == 0:
429
429
  return
430
430
  NotificationRecord = Incident.getModel("account", "NotificationRecord")
@@ -43,6 +43,21 @@ def extractUrlPath(text):
43
43
  return None
44
44
 
45
45
 
46
+ def extractMetaData(alert):
47
+ irule = int(alert.rule_id)
48
+ if irule == 31301:
49
+ patterns = {
50
+ "src_ip": re.compile(r"Src IP: (\S+)"),
51
+ "path": re.compile(r"request: (\S+ \S+)"),
52
+ "http_server": re.compile(r"server: (\S+)"),
53
+ "http_host": re.compile(r"host: (\S+)"),
54
+ "http_referrer": re.compile(r"referrer: (\S+)")
55
+ }
56
+ # Search for matches in the text
57
+ return {key: pattern.search(alert.text).group(1) for key, pattern in patterns.items() if pattern.search(alert.text)}
58
+ return {}
59
+
60
+
46
61
  def parseAlert(request, data):
47
62
  # helpers.log_print(data)
48
63
  try:
@@ -121,7 +136,7 @@ def parseAlert(request, data):
121
136
  alert.level = 8
122
137
  alert.username = m.group(1)
123
138
  alert.ssh_sig = ssh_sig
124
- alert.ssh_king = kind
139
+ alert.ssh_kind = kind
125
140
  alert.title = f"SSH LOGIN:{alert.username}@{alert.hostname} from {alert.src_ip}"
126
141
  # member = findUserBySshSig(ssh_sig)
127
142
  # if member:
@@ -158,9 +173,13 @@ def parseAlert(request, data):
158
173
  elif irule == 31101:
159
174
  m = re.search(r"GET\s+(http://[^\s]+)\s+HTTP/\d\.\d\s+(\d+)", data.text)
160
175
  if m and m.groups():
161
- code = m.groups(2)
176
+ code = m.group(2)
162
177
  request_path = m.group(1)
163
178
  alert.title = f"HTTP {code}: {request_path}"
179
+ elif irule == 31301:
180
+ m = re.search(r"(\[error\]|\[crit\])[^\*]*\*\d*\s+(.*?),", text)
181
+ if m and len(m.groups()) >=2:
182
+ alert.title = error
164
183
  elif irule == 100020:
165
184
  m = re.search(r"\[(\S+)\]", data.text)
166
185
  if m and m.groups():
@@ -78,6 +78,7 @@ def ossec_alert_creat_from_request(request):
78
78
  elif od.level <= 3:
79
79
  level = 8
80
80
  metadata = od.toDict(graph="default")
81
+ metadata.update(ossec.extractMetaData(od))
81
82
  # we reuse the ssh_sig because it is a text field to store urls
82
83
  ssh_sig = metadata.get("ssh_sig", None)
83
84
  if ssh_sig is not None and ssh_sig.startswith("http"):