django-restit 4.2.83__tar.gz → 4.2.84__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.
- {django_restit-4.2.83 → django_restit-4.2.84}/PKG-INFO +1 -1
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/notify.py +3 -2
- django_restit-4.2.84/auditlog/cloudwatch.py +213 -0
- django_restit-4.2.84/auditlog/rpc.py +156 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pyproject.toml +1 -1
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/datem.py +74 -0
- django_restit-4.2.83/auditlog/cloudwatch.py +0 -93
- django_restit-4.2.83/auditlog/rpc.py +0 -59
- {django_restit-4.2.83 → django_restit-4.2.84}/LICENSE.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/fcm/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/fcm/google.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/fcm/v1.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0003_member_phone_number.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0005_member_auth_code_expires.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0006_member_security_token.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0009_alter_member_phone_number.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0010_delete_authtoken.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0011_authtoken.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0012_settings_settingsmetadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0013_memberdevice_ip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0015_memberdevice_buid.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0016_authsession_buid.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0018_userpasskey.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0019_group_location.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/device.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/feeds.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/group.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/legacy.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/member.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/membership.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/passkeys.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/session.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/models/settings.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/oauth/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/oauth/google.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/passkeys/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/passkeys/core.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/auth.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/device.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/group.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/member.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/notify.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/oauth.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/passkeys.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/rpc/settings.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/settings.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/base.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/invite.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/plain/base.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/plain/invite.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/plain/reset_code.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/reset_code.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/simple/invite.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/email/simple/reset_code.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/account/templates/unsubscribed.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/README +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/decorators.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/middleware.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/migrations/0002_alter_persistentlog_session.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/auditlog/urls.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/handlers.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/0002_alter_message_cc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/0003_attachment_content_type.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/0004_mailtemplate.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/0005_alter_mailbox_state.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/models/bounce.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/models/complaint.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/models/message.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/models/template.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/utils/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/utils/parsing.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/utils/render.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/inbox/utils/sending.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0002_event_component_event_component_id.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0003_rule_action.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0006_delete_eventmetadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0007_event_metadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0009_incident_reporter_ip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0011_ticket.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0012_rule_match_by.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0013_rulecheck_is_required.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/0015_rule_title_template_alter_incident_state.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/event.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/incident.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/ossec.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/rules.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/models/ticket.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/parsers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/parsers/ossec.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/templates/email/incident_change.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/templates/email/incident_msg.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/templates/email/incident_new.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/templates/email/incident_plain.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/incident/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/geolocate.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/migrations/0003_address_postalcode_suffix.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/address.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/ip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/legacy.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/location.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/models/track.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/abstractapi.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/extremeip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/geoplugin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/ipapi.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/ipinfo.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/iplookup/restit.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/location/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/location/google.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/timezones/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/timezones/google.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/providers/zillow.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/rpc/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/rpc/address.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/rpc/ip.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/rpc/location.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/location/rpc/track.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/cvutil/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/cvutil/contours.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/cvutil/images.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/cvutil/misc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/cvutil/text.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/fixtures/initial_data.json +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/fixtures/medialib.json +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/fixtures/medialib_test_fixture.json +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/forms.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/ocr.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/pdf.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/qrcode.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/anigif.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/ffmpeg.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/gifsicle.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/hls.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/mp4box.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/rtmp/Makefile +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/rtmp/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/rtmp/rtmp.i +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/rtmpdump.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/rtmpsink.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/video_getinfo.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/engines/websnap.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/exceptions.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/akamai.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/animated_thumbnail.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/ffmpeg.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/flv.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/hls.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/image_transcode.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/image_validate.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/mp4.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/video_still.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/video_validate.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/websnap.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/presets/youtube.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/render_utils.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/render/schedule.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/rpc/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/rpc/legacy.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/rpc/media.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/rpc/tools.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/scripts/init_config +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/css/base_medialibui.css +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/css/base_widgets.css +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/css/jquery.jcrop.css +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/arrow-down-white.png +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/bg-body.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/cancel.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/icon-generic.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/icon-image.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/icon-media.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/icon-zip.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/loading.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/noimage.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/render_err.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/rendering.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/star_off.png +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/star_on.png +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/img/unknown.gif +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/caman.full.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/hammer.min.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/jquery.Jcrop.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/jquery.hammer.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/load-image.min.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/swiper.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/channel.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/discovery.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/errors.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/http.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/model.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/apiclient/schema.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/filestore.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/httplib2/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/httplib2/socks.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/httpstore.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/nullstore.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/appengine.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/client.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/crypt.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/gce.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/old_run.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/tools.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/util.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/rtmpstore.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/s3store.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/uritemplate/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/stores/youtubestore.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/base.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/instances.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/items.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/library.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_error.subject +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_error.to +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_error.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_ready.subject +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_ready.to +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_ready.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_render_error.subject +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_render_error.to +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_render_error.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_validate_error.subject +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_validate_error.to +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/notify_validate_error.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/smil +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/test.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/templates/medialib/testpicker.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/tests.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/urls.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/utils.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/views.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/channel.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/discovery.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/errors.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/http.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/model.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/apiclient/schema.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/httplib2/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/httplib2/socks.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/appengine.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/client.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/crypt.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/gce.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/old_run.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/tools.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/util.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/upload.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/medialib/youtube/uritemplate/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/client.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/eod.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/examples/eod_example.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/delete_gauge.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/delete_metric.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/generate_test_metrics.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/reset_weekly_metrics.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/management/commands/system_metric.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/0003_metrics_expires.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/0004_eodmetrics.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/providers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/providers/aws.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/settings.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/metrics/utils.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/rpc/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/rpc/githooks.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/rpc/legacy.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/rpc/products.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/static/js/models_pushit.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/pushit/utils.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/.gitignore +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/RemoteEvents.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/arc4.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/cache.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/crypto/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/crypto/aes.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/crypto/privpub.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/crypto/util.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/decorators.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/encryption.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/errors.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/extra/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/extra/json_metadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/fields.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/forms.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/helpers.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/joke.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/jwtoken.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/log.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/mail.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/mailman.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/management/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/management/commands/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/management/commands/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/cors.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/db_router.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/jwt.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/request.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/session.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/middleware/session_store.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/models/base.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/models/cacher.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/models/metadata.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/net.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/regexes.yaml +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/requestex.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/search.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/collection.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/csv.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/excel.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/json.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/legacy.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/localizers.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/model.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/profiler.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/response.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/serializers/util.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/settings_helper.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/ssl_check.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/static/lib/jquery.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/static/rest/app.css +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/static/rest/app.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/static/rest/rest.js +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/static/rest/rest.scss +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/templates/email/error.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/templates/email/error.subject +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/templates/rest_docs.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/templates/rest_html.html +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/ua.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/uberdict.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/url_docs.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/urls.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/rest/views.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/.gitignore +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/tests.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/sessionlog/views.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/email.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/http.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/s3.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/sftp.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/transports/sms.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/taskqueue/worker.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/admin.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/decorators.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/migrations/0002_alter_sms_sid.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/models.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/phone_util.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/telephony/rpc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/migrations/0001_initial.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/migrations/0002_alter_pagemedia_entry.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/migrations/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/models/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/models/faq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/models/page.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/models/revision.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/periodic.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/highlight.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/math.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/media.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/meta.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/task_list.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/renderers/mistune/toc.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/rpc/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/rpc/wiki.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/wiki/tq.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/README.md +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/client.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/connection.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/exceptions.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/redis.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/servers/__init__.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/servers/base.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/servers/django.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/servers/uwsgi.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/settings.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/utf8validator.py +0 -0
- {django_restit-4.2.83 → django_restit-4.2.84}/ws4redis/websocket.py +0 -0
@@ -228,10 +228,11 @@ class NotificationRecord(models.Model, RestModel):
|
|
228
228
|
body=message)
|
229
229
|
try:
|
230
230
|
email_record.save()
|
231
|
-
|
231
|
+
if attachments:
|
232
|
+
email_record.addAttachments(attachments)
|
232
233
|
email_record.send([nr])
|
233
234
|
except Exception as err:
|
234
|
-
rh.log_exception("email send failed",
|
235
|
+
rh.log_exception("email send failed", member.username, subject)
|
235
236
|
|
236
237
|
@classmethod
|
237
238
|
def notifyLegacy(cls, notify_users, subject, message=None,
|
@@ -0,0 +1,213 @@
|
|
1
|
+
import boto3
|
2
|
+
from datetime import datetime, timedelta
|
3
|
+
import re
|
4
|
+
import time
|
5
|
+
import json
|
6
|
+
from objict import objict
|
7
|
+
from rest import settings
|
8
|
+
from rest import datem
|
9
|
+
from rest import helpers as rh
|
10
|
+
from concurrent.futures import ThreadPoolExecutor
|
11
|
+
|
12
|
+
|
13
|
+
LOG_CACHE = objict()
|
14
|
+
|
15
|
+
|
16
|
+
def getClient():
|
17
|
+
if LOG_CACHE.client is None:
|
18
|
+
key = settings.AWS_KEY
|
19
|
+
secret = settings.AWS_SECRET
|
20
|
+
region = settings.AWS_REGION
|
21
|
+
LOG_CACHE.client = boto3.client("logs", aws_access_key_id=key, aws_secret_access_key=secret, region_name=region)
|
22
|
+
return LOG_CACHE.client
|
23
|
+
|
24
|
+
|
25
|
+
def log(data, log_group, log_stream):
|
26
|
+
if LOG_CACHE.pool is None:
|
27
|
+
LOG_CACHE.pool = ThreadPoolExecutor(max_workers=1)
|
28
|
+
LOG_CACHE.pool.submit(logToCloudWatch, data, log_group, log_stream)
|
29
|
+
return True
|
30
|
+
|
31
|
+
|
32
|
+
def get(log_group, log_stream, size=20):
|
33
|
+
client = getClient()
|
34
|
+
if log_stream is None:
|
35
|
+
log_stream = DEFAULT_LOG_STREAMS
|
36
|
+
if isinstance(log_stream, list):
|
37
|
+
log_events = client.get_log_events(
|
38
|
+
logGroupName=log_group,
|
39
|
+
logStreamNames=log_stream,
|
40
|
+
limit=size,
|
41
|
+
startFromHead=False
|
42
|
+
)
|
43
|
+
else:
|
44
|
+
log_events = client.get_log_events(
|
45
|
+
logGroupName=log_group,
|
46
|
+
logStreamName=log_stream,
|
47
|
+
limit=size,
|
48
|
+
startFromHead=False
|
49
|
+
)
|
50
|
+
|
51
|
+
return log_events
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
def logToCloudWatch(message, log_group, log_stream):
|
56
|
+
if isinstance(message, dict):
|
57
|
+
message = json.dumps(message)
|
58
|
+
return logBatchToCloudWatch([
|
59
|
+
dict(
|
60
|
+
timestamp=int(datetime.utcnow().timestamp() * 1000),
|
61
|
+
message=message)
|
62
|
+
], log_group, log_stream)
|
63
|
+
|
64
|
+
|
65
|
+
def logBatchToCloudWatch(batch, log_group, log_stream):
|
66
|
+
return getClient().put_log_events(
|
67
|
+
logGroupName=log_group,
|
68
|
+
logStreamName=log_stream,
|
69
|
+
logEvents=batch
|
70
|
+
)
|
71
|
+
|
72
|
+
|
73
|
+
def getLogGroups(names_only=True):
|
74
|
+
response = getClient().describe_log_groups()
|
75
|
+
groups = response.get('logGroups', [])
|
76
|
+
if names_only:
|
77
|
+
return [item["logGroupName"] for item in groups]
|
78
|
+
return groups
|
79
|
+
|
80
|
+
|
81
|
+
def getLogStreams(log_group):
|
82
|
+
log_streams = client.describe_log_streams(
|
83
|
+
logGroupName=log_group_name
|
84
|
+
)
|
85
|
+
return log_streams['logStreams']
|
86
|
+
|
87
|
+
|
88
|
+
def createLogStream(log_group, log_stream):
|
89
|
+
try:
|
90
|
+
getClient().create_log_stream(logGroupName=log_group, logStreamName=log_stream)
|
91
|
+
except Exception:
|
92
|
+
pass # Log stream already exists, no need to create it
|
93
|
+
|
94
|
+
|
95
|
+
def filter(log_group, log_streams, pattern, start_time="1h", end_time=None, resp_format=None):
|
96
|
+
if log_streams is None:
|
97
|
+
log_streams = DEFAULT_LOG_STREAMS
|
98
|
+
|
99
|
+
start_time, end_time = datem.convert_to_epoch_range(start_time, end_time)
|
100
|
+
rh.debug("filter", start_time, end_time, pattern, log_group, log_streams)
|
101
|
+
client = getClient()
|
102
|
+
response =client.filter_log_events(
|
103
|
+
logGroupName=log_group,
|
104
|
+
logStreamNames=log_streams,
|
105
|
+
filterPattern=f'"{pattern}"',
|
106
|
+
startTime=start_time,
|
107
|
+
endTime=end_time,
|
108
|
+
limit=1000
|
109
|
+
)
|
110
|
+
rh.debug("filter_log_events", response)
|
111
|
+
out = []
|
112
|
+
out.extend(response["events"])
|
113
|
+
prev_next = None
|
114
|
+
while "nextToken" in response and response["nextToken"]:
|
115
|
+
if prev_next == response["nextToken"]:
|
116
|
+
break
|
117
|
+
prev_next = response["nextToken"]
|
118
|
+
response = client.filter_log_events(
|
119
|
+
logGroupName=log_group,
|
120
|
+
logStreamNames=log_streams,
|
121
|
+
filterPattern=f'"{pattern}"',
|
122
|
+
startTime=start_time,
|
123
|
+
endTime=end_time,
|
124
|
+
nextToken=response["nextToken"]
|
125
|
+
)
|
126
|
+
rh.debug("filter_log_events", response)
|
127
|
+
out.extend(response["events"])
|
128
|
+
if resp_format == "nginx":
|
129
|
+
return dict(events=parseNginxEvents(out))
|
130
|
+
return dict(events=out)
|
131
|
+
|
132
|
+
|
133
|
+
QUERY_BY_IP = """fields @message
|
134
|
+
| filter @logStream in {log_streams}
|
135
|
+
| filter @message like /^{ip}/"""
|
136
|
+
|
137
|
+
QUERY_BY_TEXT = """fields @message
|
138
|
+
| filter @logStream in {log_streams}
|
139
|
+
| filter @message like "{text}" """
|
140
|
+
|
141
|
+
DEFAULT_LOG_STREAMS = ["access.log", "ui_access.log"]
|
142
|
+
|
143
|
+
def startSearch(log_groups, start_time, end_time=None,
|
144
|
+
text=None, ip=None, query_string=None,
|
145
|
+
log_streams=DEFAULT_LOG_STREAMS):
|
146
|
+
if log_streams is None:
|
147
|
+
log_streams = DEFAULT_LOG_STREAMS
|
148
|
+
# 173\.196\.133\.90
|
149
|
+
if ip is not None and "." in ip:
|
150
|
+
query_string = QUERY_BY_IP.format(ip=ip.replace('.', '\.'), log_streams=log_streams)
|
151
|
+
elif text is not None:
|
152
|
+
query_string = QUERY_BY_TEXT.format(text=text, log_streams=log_streams)
|
153
|
+
return startInsights(log_groups, start_time, end_time, query_string)
|
154
|
+
|
155
|
+
|
156
|
+
def startInsights(log_groups, start_time, end_time, query_string):
|
157
|
+
"""
|
158
|
+
Executes a CloudWatch Logs Insights query and returns the results.
|
159
|
+
|
160
|
+
:param log_group: The name of the log group to query.
|
161
|
+
:param start_time: The start time of the query (epoch time in seconds).
|
162
|
+
:param end_time: The end time of the query (epoch time in seconds).
|
163
|
+
:param query_string: The query string to use.
|
164
|
+
:param region_name: AWS region name.
|
165
|
+
:return: The query results.
|
166
|
+
"""
|
167
|
+
# Create a CloudWatch Logs client
|
168
|
+
client = getClient()
|
169
|
+
start_time, end_time = datem.convert_to_epoch_range(start_time, end_time)
|
170
|
+
|
171
|
+
if log_groups is None:
|
172
|
+
log_groups = getLogGroups()
|
173
|
+
|
174
|
+
# Start the query
|
175
|
+
start_query_response = client.start_query(
|
176
|
+
logGroupNames=log_groups,
|
177
|
+
startTime=start_time,
|
178
|
+
endTime=end_time,
|
179
|
+
queryString=query_string,
|
180
|
+
)
|
181
|
+
return dict(query_id=start_query_response['queryId'], query=query_string)
|
182
|
+
|
183
|
+
|
184
|
+
def getInsightResults(query_id, resp_format=None):
|
185
|
+
# Wait for the query to complete
|
186
|
+
resp = getClient().get_query_results(queryId=query_id)
|
187
|
+
status = resp["status"].lower()
|
188
|
+
results = insightsToMessage(resp["results"])
|
189
|
+
stats = resp["statistics"]
|
190
|
+
if status == "complete" and resp_format == "nginx":
|
191
|
+
results = parseNginxEvents(results)
|
192
|
+
return dict(status=True, state=status, stats=stats, data=results, count=len(results))
|
193
|
+
|
194
|
+
|
195
|
+
def insightsToMessage(events):
|
196
|
+
out = []
|
197
|
+
for fields in events:
|
198
|
+
obj = {}
|
199
|
+
for field in fields:
|
200
|
+
if "field" in field and field["field"][0] == "@":
|
201
|
+
obj[field["field"][1:]] = field["value"]
|
202
|
+
if obj:
|
203
|
+
out.append(obj)
|
204
|
+
return out
|
205
|
+
|
206
|
+
def parseNginxEvents(events):
|
207
|
+
pattern = re.compile(
|
208
|
+
r'(?P<ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<time>.+?)\] '
|
209
|
+
r'"(?P<method>\w+) (?P<url>.+?) (?P<protocol>[\w/.]+)" '
|
210
|
+
r'(?P<status>\d+) (?P<bytes>\d+) "(?P<referer>.+?)" '
|
211
|
+
r'"(?P<user_agent>.+?)" (?P<request_time>\S+) (?P<server_port>\d+)'
|
212
|
+
)
|
213
|
+
return [pattern.match(line["message"]).groupdict() for line in events]
|
@@ -0,0 +1,156 @@
|
|
1
|
+
from . import models as auditlog
|
2
|
+
from . import cloudwatch
|
3
|
+
|
4
|
+
from rest import views as rv
|
5
|
+
from rest import decorators as rd
|
6
|
+
from datetime import datetime
|
7
|
+
|
8
|
+
|
9
|
+
@rd.url(r'^plog$')
|
10
|
+
@rd.url(r'^plog/(?P<plog_id>\d+)$')
|
11
|
+
@rd.perm_required('view_logs')
|
12
|
+
def plog_handler(request, plog_id=None):
|
13
|
+
if not plog_id:
|
14
|
+
min_pk = getattr(auditlog.settings, "PLOG_STALE_ID", 0)
|
15
|
+
return auditlog.PersistentLog.on_rest_list(request, qset=auditlog.PersistentLog.objects.filter(pk__gte=min_pk))
|
16
|
+
return auditlog.PersistentLog.on_rest_request(request, plog_id)
|
17
|
+
|
18
|
+
|
19
|
+
@rd.urlGET(r'^plog_old$')
|
20
|
+
@rd.perm_required('view_logs')
|
21
|
+
def plogList(request):
|
22
|
+
auditlog.PersistentLog.on_request_handle()
|
23
|
+
|
24
|
+
graph = request.DATA.get("graph", "default")
|
25
|
+
qset = auditlog.PersistentLog.objects.all()
|
26
|
+
if request.group:
|
27
|
+
qset = qset.filter(group=request.group)
|
28
|
+
|
29
|
+
ip = request.DATA.get("ip")
|
30
|
+
if ip:
|
31
|
+
qset = qset.filter(session__ip=ip)
|
32
|
+
|
33
|
+
path = request.DATA.get("path")
|
34
|
+
if path:
|
35
|
+
qset = qset.filter(remote_path__icontains=path)
|
36
|
+
|
37
|
+
method = request.DATA.get("method")
|
38
|
+
if method:
|
39
|
+
qset = qset.filter(method=method)
|
40
|
+
|
41
|
+
action = request.DATA.get("action")
|
42
|
+
if action:
|
43
|
+
qset = qset.filter(action=action)
|
44
|
+
|
45
|
+
component = request.DATA.get("component")
|
46
|
+
if component:
|
47
|
+
qset = qset.filter(component=component)
|
48
|
+
|
49
|
+
pkey = request.DATA.get("pkey")
|
50
|
+
if pkey:
|
51
|
+
qset = qset.filter(pkey=pkey)
|
52
|
+
|
53
|
+
username = request.DATA.get("username")
|
54
|
+
if username:
|
55
|
+
qset = qset.filter(user__username=username)
|
56
|
+
|
57
|
+
term = request.DATA.get("term")
|
58
|
+
if term:
|
59
|
+
qset = qset.filter(message__icontains=term)
|
60
|
+
|
61
|
+
return rv.restList(request, qset.order_by('-when'), **auditlog.PersistentLog.getGraph(graph))
|
62
|
+
|
63
|
+
|
64
|
+
@rd.url('server/logs')
|
65
|
+
@rd.perm_required('view_logs')
|
66
|
+
@rd.requires_params(["log_group", "log_streams"])
|
67
|
+
def cloudwatch_logs(request):
|
68
|
+
log_group = request.DATA.get("log_group")
|
69
|
+
log_streams = request.DATA.get("log_streams").split(',')
|
70
|
+
pattern = request.DATA.get("search")
|
71
|
+
if not pattern:
|
72
|
+
data = dict(status=True, data=[], count=0)
|
73
|
+
return rv.restResult(request, data)
|
74
|
+
start = request.DATA.get("dr_start", "1d")
|
75
|
+
end = request.DATA.get("dr_end", field_type=datetime)
|
76
|
+
resp = cloudwatch.filter(log_group, log_streams, pattern,
|
77
|
+
start_time=start, end_time=end,
|
78
|
+
resp_format="nginx")
|
79
|
+
# else:
|
80
|
+
# resp = cloudwatch.get(log_group, log_streams, resp_format="nginx")
|
81
|
+
lst = resp["events"]
|
82
|
+
count = len(lst)
|
83
|
+
data = dict(status=True, data=lst, count=len(lst), size=count)
|
84
|
+
if "nextBackwardToken" in resp:
|
85
|
+
data["backward"] = resp["nextBackwardToken"]
|
86
|
+
data["forword"] = resp["nextForwardToken"]
|
87
|
+
return rv.restResult(request, data)
|
88
|
+
|
89
|
+
@rd.urlPOST('cloudwatch/log')
|
90
|
+
@rd.perm_required('view_logs')
|
91
|
+
@rd.requires_params(["log_group", "log_stream", "event"])
|
92
|
+
def cloudwatch_log_groups(request):
|
93
|
+
log_group = request.DATA.get("log_group")
|
94
|
+
log_stream = request.DATA.get("log_stream")
|
95
|
+
event = request.DATA.get("event")
|
96
|
+
resp = cloudwatch.logToCloudWatch(event, log_group, log_stream)
|
97
|
+
return rv.restResult(request, dict(status=True, data=resp))
|
98
|
+
|
99
|
+
|
100
|
+
@rd.urlGET('cloudwatch/log')
|
101
|
+
@rd.perm_required('cloudwatch')
|
102
|
+
@rd.requires_params(["log_group", "log_stream"])
|
103
|
+
def cloudwatch_log_groups(request):
|
104
|
+
log_group = request.DATA.get("log_group")
|
105
|
+
log_stream = request.DATA.get("log_stream")
|
106
|
+
pattern = request.DATA.get("pattern")
|
107
|
+
if pattern:
|
108
|
+
start = request.DATA.get("dr_start", "6d")
|
109
|
+
end = request.DATA.get("dr_end", field_type=datetime)
|
110
|
+
resp = cloudwatch.filter(log_group, [log_stream], pattern,
|
111
|
+
start_time=start, end_time=end,
|
112
|
+
resp_format=request.DATA.get("format"))
|
113
|
+
else:
|
114
|
+
resp = cloudwatch.get(log_group, log_stream)
|
115
|
+
lst = resp["events"]
|
116
|
+
data = dict(status=True, data=lst, count=len(lst))
|
117
|
+
if "nextBackwardToken" in resp:
|
118
|
+
data["backward"] = resp["nextBackwardToken"]
|
119
|
+
data["forword"] = resp["nextForwardToken"]
|
120
|
+
data = dict(status=True, data=lst, count=len(lst))
|
121
|
+
return rv.restResult(request, data)
|
122
|
+
|
123
|
+
|
124
|
+
@rd.urlGET('cloudwatch/groups')
|
125
|
+
@rd.perm_required('cloudwatch')
|
126
|
+
def cloudwatch_log_groups(request):
|
127
|
+
return rv.restList(request, cloudwatch.getLogGroups(request.DATA.get("graph", None) is None))
|
128
|
+
|
129
|
+
|
130
|
+
@rd.urlPOST('cloudwatch/insights/start')
|
131
|
+
@rd.perm_required('cloudwatch')
|
132
|
+
@rd.requires_params(["log_groups"])
|
133
|
+
def cloudwatch_insights_start(request):
|
134
|
+
log_groups = request.DATA.get("log_groups")
|
135
|
+
log_streams = request.DATA.get("log_streams")
|
136
|
+
start = request.DATA.get("dr_start", "6h")
|
137
|
+
end = request.DATA.get("dr_end", field_type=datetime)
|
138
|
+
ip = request.DATA.get("ip")
|
139
|
+
text = request.DATA.get("text")
|
140
|
+
query = request.DATA.get("query")
|
141
|
+
if ip is None and text is None and query is None:
|
142
|
+
return rv.restPermissionDenied(request)
|
143
|
+
resp = cloudwatch.startSearch(log_groups, start, end,
|
144
|
+
ip=ip, text=text, query_string=query,
|
145
|
+
log_streams=log_streams)
|
146
|
+
return rv.restResult(request, dict(status=True, data=resp))
|
147
|
+
|
148
|
+
|
149
|
+
@rd.urlGET(r'cloudwatch/insights/results')
|
150
|
+
@rd.perm_required('cloudwatch')
|
151
|
+
@rd.requires_params(["query_id"])
|
152
|
+
def cloudwatch_insights_results(request):
|
153
|
+
query_id = request.DATA.get("query_id")
|
154
|
+
results = cloudwatch.getInsightResults(query_id, request.DATA.get("format"))
|
155
|
+
return rv.restResult(request, results)
|
156
|
+
|
@@ -312,3 +312,77 @@ def getDateRange(start, end=None, kind=None, zone=None, hour=0, eod=None, end_eo
|
|
312
312
|
if offset:
|
313
313
|
end = end + timedelta(hours=offset)
|
314
314
|
return start, end
|
315
|
+
|
316
|
+
|
317
|
+
def convert_to_epoch_range(start, end=None):
|
318
|
+
"""
|
319
|
+
Convert start and end times to epoch timestamps in milliseconds.
|
320
|
+
|
321
|
+
Parameters:
|
322
|
+
start (int, datetime, or str): The start time, which can be:
|
323
|
+
- An int representing the epoch time in milliseconds.
|
324
|
+
- A datetime object representing the start time.
|
325
|
+
- A string representing a timedelta relative to the end time. The string can end with:
|
326
|
+
- 'm' for minutes (e.g., '30m' for 30 minutes ago)
|
327
|
+
- 'h' for hours (e.g., '5h' for 5 hours ago)
|
328
|
+
- 'd' for days (e.g., '2d' for 2 days ago)
|
329
|
+
end (datetime or None): The end time, which can be:
|
330
|
+
- A datetime object representing the end time.
|
331
|
+
- None, in which case the current time (UTC) is used.
|
332
|
+
|
333
|
+
Returns:
|
334
|
+
tuple: A tuple containing two integers:
|
335
|
+
- start_epoch: The epoch time of the start parameter in milliseconds.
|
336
|
+
- end_epoch: The epoch time of the end parameter in milliseconds.
|
337
|
+
|
338
|
+
Raises:
|
339
|
+
ValueError: If the end parameter is not a datetime object or None.
|
340
|
+
ValueError: If the start parameter is not an int, datetime object, or a valid timedelta string.
|
341
|
+
ValueError: If the start string does not end with 'm', 'h', or 'd'.
|
342
|
+
|
343
|
+
Examples:
|
344
|
+
>>> start = "30m"
|
345
|
+
>>> end = datetime(2024, 5, 13, 12, 30, tzinfo=timezone.utc)
|
346
|
+
>>> convert_to_epoch(start, end)
|
347
|
+
(1715676600000, 1715681400000)
|
348
|
+
|
349
|
+
>>> start = "1d"
|
350
|
+
>>> end = None
|
351
|
+
>>> convert_to_epoch(start, end)
|
352
|
+
(1715595000000, 1715681400000)
|
353
|
+
|
354
|
+
>>> start = "5h"
|
355
|
+
>>> end = datetime(2024, 5, 13, 12, 30, tzinfo=timezone.utc)
|
356
|
+
>>> convert_to_epoch(start, end)
|
357
|
+
(1715661000000, 1715681400000)
|
358
|
+
"""
|
359
|
+
if end is None:
|
360
|
+
end = datetime.utcnow()
|
361
|
+
|
362
|
+
if isinstance(end, datetime):
|
363
|
+
end_epoch = int(end.timestamp() * 1000)
|
364
|
+
else:
|
365
|
+
raise ValueError("End parameter must be a datetime object or None.")
|
366
|
+
|
367
|
+
if isinstance(start, int):
|
368
|
+
start_epoch = start
|
369
|
+
elif isinstance(start, datetime):
|
370
|
+
start_epoch = int(start.timestamp() * 1000)
|
371
|
+
elif isinstance(start, str):
|
372
|
+
if start.endswith('m'):
|
373
|
+
delta_minutes = int(start[:-1])
|
374
|
+
start_datetime = end - timedelta(minutes=delta_minutes)
|
375
|
+
elif start.endswith('h'):
|
376
|
+
delta_hours = int(start[:-1])
|
377
|
+
start_datetime = end - timedelta(hours=delta_hours)
|
378
|
+
elif start.endswith('d'):
|
379
|
+
delta_days = int(start[:-1])
|
380
|
+
start_datetime = end - timedelta(days=delta_days)
|
381
|
+
else:
|
382
|
+
raise ValueError("Start string must end with 'm' for minutes, 'h' for hours, or 'd' for days.")
|
383
|
+
|
384
|
+
start_epoch = int(start_datetime.timestamp() * 1000)
|
385
|
+
else:
|
386
|
+
raise ValueError("Start parameter must be an int, datetime object, or a string representing a timedelta.")
|
387
|
+
|
388
|
+
return start_epoch, end_epoch
|
@@ -1,93 +0,0 @@
|
|
1
|
-
import boto3
|
2
|
-
import datetime
|
3
|
-
import time
|
4
|
-
import json
|
5
|
-
from objict import objict
|
6
|
-
from rest import settings
|
7
|
-
from concurrent.futures import ThreadPoolExecutor
|
8
|
-
|
9
|
-
|
10
|
-
LOG_CACHE = objict()
|
11
|
-
|
12
|
-
|
13
|
-
def getClient():
|
14
|
-
if LOG_CACHE.client is None:
|
15
|
-
key = settings.AWS_KEY
|
16
|
-
secret = settings.AWS_SECRET
|
17
|
-
region = settings.AWS_REGION
|
18
|
-
LOG_CACHE.client = boto3.client("logs", aws_access_key_id=key, aws_secret_access_key=secret, region_name=region)
|
19
|
-
return LOG_CACHE.client
|
20
|
-
|
21
|
-
|
22
|
-
def log(data, log_group, log_stream):
|
23
|
-
if LOG_CACHE.pool is None:
|
24
|
-
LOG_CACHE.pool = ThreadPoolExecutor(max_workers=1)
|
25
|
-
LOG_CACHE.pool.submit(logToCloudWatch, data, log_group, log_stream)
|
26
|
-
return True
|
27
|
-
|
28
|
-
|
29
|
-
def logToCloudWatch(data, log_group, log_stream):
|
30
|
-
message = data
|
31
|
-
if isinstance(message, dict):
|
32
|
-
message = json.dumps(message)
|
33
|
-
return logBatchToCloudWatch([
|
34
|
-
dict(
|
35
|
-
timestamp=int(datetime.datetime.utcnow().timestamp() * 1000),
|
36
|
-
message=message)
|
37
|
-
], log_group, log_stream)
|
38
|
-
|
39
|
-
|
40
|
-
def logBatchToCloudWatch(batch, log_group, log_stream):
|
41
|
-
return getClient().put_log_events(
|
42
|
-
logGroupName=log_group,
|
43
|
-
logStreamName=log_stream,
|
44
|
-
logEvents=batch
|
45
|
-
)
|
46
|
-
|
47
|
-
|
48
|
-
def getLogGroups():
|
49
|
-
response = getClient().describe_log_groups()
|
50
|
-
return response.get('logGroups', [])
|
51
|
-
|
52
|
-
|
53
|
-
def createLogStream(log_group, log_stream):
|
54
|
-
try:
|
55
|
-
getClient().create_log_stream(logGroupName=log_group, logStreamName=log_stream)
|
56
|
-
except Exception:
|
57
|
-
pass # Log stream already exists, no need to create it
|
58
|
-
|
59
|
-
|
60
|
-
def getInsights(log_group, start_time, end_time, query_string):
|
61
|
-
"""
|
62
|
-
Executes a CloudWatch Logs Insights query and returns the results.
|
63
|
-
|
64
|
-
:param log_group: The name of the log group to query.
|
65
|
-
:param start_time: The start time of the query (epoch time in seconds).
|
66
|
-
:param end_time: The end time of the query (epoch time in seconds).
|
67
|
-
:param query_string: The query string to use.
|
68
|
-
:param region_name: AWS region name.
|
69
|
-
:return: The query results.
|
70
|
-
"""
|
71
|
-
# Create a CloudWatch Logs client
|
72
|
-
client = getClient()
|
73
|
-
|
74
|
-
# Start the query
|
75
|
-
start_query_response = client.start_query(
|
76
|
-
logGroupName=log_group,
|
77
|
-
startTime=start_time,
|
78
|
-
endTime=end_time,
|
79
|
-
queryString=query_string,
|
80
|
-
)
|
81
|
-
|
82
|
-
query_id = start_query_response['queryId']
|
83
|
-
|
84
|
-
# Wait for the query to complete
|
85
|
-
response = None
|
86
|
-
while response is None or response['status'] == 'Running':
|
87
|
-
time.sleep(1) # Sleep to rate limit the polling
|
88
|
-
response = client.get_query_results(queryId=query_id)
|
89
|
-
|
90
|
-
if response['status'] == 'Complete':
|
91
|
-
return response['results']
|
92
|
-
else:
|
93
|
-
raise Exception(f"Query did not complete successfully. Status: {response['status']}")
|
@@ -1,59 +0,0 @@
|
|
1
|
-
from . import models as auditlog
|
2
|
-
|
3
|
-
from rest import views as rv
|
4
|
-
from rest import decorators as rd
|
5
|
-
|
6
|
-
|
7
|
-
@rd.url(r'^plog$')
|
8
|
-
@rd.url(r'^plog/(?P<plog_id>\d+)$')
|
9
|
-
@rd.perm_required('view_logs')
|
10
|
-
def plog_handler(request, plog_id=None):
|
11
|
-
if not plog_id:
|
12
|
-
min_pk = getattr(auditlog.settings, "PLOG_STALE_ID", 0)
|
13
|
-
return auditlog.PersistentLog.on_rest_list(request, qset=auditlog.PersistentLog.objects.filter(pk__gte=min_pk))
|
14
|
-
return auditlog.PersistentLog.on_rest_request(request, plog_id)
|
15
|
-
|
16
|
-
|
17
|
-
@rd.urlGET(r'^plog_old$')
|
18
|
-
@rd.perm_required('view_logs')
|
19
|
-
def plogList(request):
|
20
|
-
auditlog.PersistentLog.on_request_handle()
|
21
|
-
|
22
|
-
graph = request.DATA.get("graph", "default")
|
23
|
-
qset = auditlog.PersistentLog.objects.all()
|
24
|
-
if request.group:
|
25
|
-
qset = qset.filter(group=request.group)
|
26
|
-
|
27
|
-
ip = request.DATA.get("ip")
|
28
|
-
if ip:
|
29
|
-
qset = qset.filter(session__ip=ip)
|
30
|
-
|
31
|
-
path = request.DATA.get("path")
|
32
|
-
if path:
|
33
|
-
qset = qset.filter(remote_path__icontains=path)
|
34
|
-
|
35
|
-
method = request.DATA.get("method")
|
36
|
-
if method:
|
37
|
-
qset = qset.filter(method=method)
|
38
|
-
|
39
|
-
action = request.DATA.get("action")
|
40
|
-
if action:
|
41
|
-
qset = qset.filter(action=action)
|
42
|
-
|
43
|
-
component = request.DATA.get("component")
|
44
|
-
if component:
|
45
|
-
qset = qset.filter(component=component)
|
46
|
-
|
47
|
-
pkey = request.DATA.get("pkey")
|
48
|
-
if pkey:
|
49
|
-
qset = qset.filter(pkey=pkey)
|
50
|
-
|
51
|
-
username = request.DATA.get("username")
|
52
|
-
if username:
|
53
|
-
qset = qset.filter(user__username=username)
|
54
|
-
|
55
|
-
term = request.DATA.get("term")
|
56
|
-
if term:
|
57
|
-
qset = qset.filter(message__icontains=term)
|
58
|
-
|
59
|
-
return rv.restList(request, qset.order_by('-when'), **auditlog.PersistentLog.getGraph(graph))
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0003_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
{django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0005_member_auth_code_expires.py
RENAMED
File without changes
|
{django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0006_member_security_token.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0009_alter_member_phone_number.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_restit-4.2.83 → django_restit-4.2.84}/account/migrations/0012_settings_settingsmetadata.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|