django-restit 4.2.173__tar.gz → 4.2.175__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.173 → django_restit-4.2.175}/PKG-INFO +1 -1
- django_restit-4.2.175/account/migrations/0023_authsession_method.py +18 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/group.py +16 -19
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/session.py +3 -2
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/auth.py +13 -12
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/oauth.py +16 -15
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/passkeys.py +1 -1
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/models.py +3 -2
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/event.py +8 -9
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/incident.py +6 -6
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/ossec.py +2 -2
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/models.py +11 -10
- {django_restit-4.2.173 → django_restit-4.2.175}/pyproject.toml +1 -1
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/__init__.py +1 -1
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/models/base.py +19 -7
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/requestex.py +3 -4
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/response.py +37 -5
- django_restit-4.2.175/rest/service.py +135 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/urls.py +0 -4
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/worker.py +23 -23
- {django_restit-4.2.173 → django_restit-4.2.175}/LICENSE.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/fcm/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/fcm/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/fcm/v1.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0003_member_phone_number.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0004_group_modified_alter_group_created.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0005_member_auth_code_expires.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0006_member_security_token.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0007_authtoken_signature_authsession.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0008_memberdevice_memberdevicemetadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0009_alter_member_phone_number.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0010_delete_authtoken.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0011_authtoken.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0012_settings_settingsmetadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0013_memberdevice_ip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0014_alter_notificationmemberrecord_member.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0015_memberdevice_buid.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0016_authsession_buid.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0017_rename_requires_topt_member_requires_totp.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0018_userpasskey.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0019_group_location.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0021_alter_cloudcredentials_group.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/0022_alter_memberdevice_modified.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/device.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/feeds.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/member.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/membership.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/notify.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/passkeys.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/models/settings.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/oauth/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/oauth/google.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/passkeys/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/passkeys/core.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/device.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/group.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/member.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/notify.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/rpc/settings.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/settings.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/base.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/invite.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/plain/base.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/plain/invite.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/plain/reset_code.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/reset_code.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/simple/invite.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/email/simple/reset_code.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/account/templates/unsubscribed.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/README +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/cloudwatch.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/decorators.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/middleware.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/migrations/0002_alter_persistentlog_session.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/auditlog/urls.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/handlers.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/0002_alter_message_cc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/0003_attachment_content_type.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/0004_mailtemplate.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/0005_alter_mailbox_state.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/models/bounce.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/models/complaint.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/models/message.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/models/template.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/utils/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/utils/parsing.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/utils/render.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/inbox/utils/sending.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0002_event_component_event_component_id.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0003_rule_action.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0004_serverossecalert_ssh_sig_alter_rulecheck_parent.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0005_incident_component_alter_incident_state.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0006_delete_eventmetadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0007_event_metadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0008_incident_action_sent_incident_hostname_and_more.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0009_incident_reporter_ip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0010_incident_category_incident_component_id.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0011_ticket.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0012_rule_match_by.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0013_rulecheck_is_required.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0014_event_group_alter_rulecheck_index.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0015_rule_title_template_alter_incident_state.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/0016_rule_notify_template.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/rules.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/models/ticket.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/parsers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/parsers/ossec.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/templates/email/incident_change.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/templates/email/incident_msg.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/templates/email/incident_new.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/templates/email/incident_plain.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/incident/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/geolocate.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/migrations/0002_geoip_subnet_alter_geoip_ip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/migrations/0003_address_postalcode_suffix.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/migrations/0004_remove_address_modified_by_address_group_and_more.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/address.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/ip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/location.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/models/track.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/abstractapi.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/abuse.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/extremeip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/geoplugin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/ipapi.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/ipinfo.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/iplookup/restit.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/location/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/location/google.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/timezones/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/timezones/google.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/providers/zillow.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/rpc/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/rpc/address.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/rpc/ip.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/rpc/location.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/location/rpc/track.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/caching.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/cvutil/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/cvutil/contours.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/cvutil/images.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/cvutil/misc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/cvutil/text.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/fixtures/initial_data.json +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/fixtures/medialib.json +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/fixtures/medialib_test_fixture.json +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/forms.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/migrations/0002_alter_mediaitemrendition_bytes.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/models.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/ocr.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/pdf.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/qrcode.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/anigif.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/ffmpeg.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/gifsicle.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/hls.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/mp4box.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/rtmp/Makefile +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/rtmp/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/rtmp/rtmp.i +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/rtmpdump.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/rtmpsink.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/video_getinfo.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/engines/websnap.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/exceptions.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/akamai.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/animated_thumbnail.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/ffmpeg.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/flv.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/hls.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/image_transcode.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/image_validate.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/mp4.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/video_still.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/video_validate.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/websnap.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/presets/youtube.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/render_utils.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/render/schedule.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/rpc/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/rpc/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/rpc/media.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/rpc/tools.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/scripts/init_config +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/css/base_medialibui.css +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/css/base_widgets.css +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/css/jquery.jcrop.css +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/arrow-down-white.png +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/bg-body.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/cancel.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/icon-generic.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/icon-image.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/icon-media.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/icon-zip.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/loading.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/noimage.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/render_err.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/rendering.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/star_off.png +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/star_on.png +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/img/unknown.gif +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/caman.full.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/hammer.min.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/jquery.Jcrop.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/jquery.hammer.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/load-image.min.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/swiper.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/tinymce/plugins/medialib/editor_plugin_src.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/tinymce/plugins/medialib/js/dialog.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/static/lib/tinymce/plugins/medialib/medialib.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/channel.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/discovery.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/errors.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/http.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/model.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/apiclient/schema.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/filestore.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/httplib2/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/httplib2/socks.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/httpstore.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/nullstore.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/appengine.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/client.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/crypt.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/gce.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/old_run.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/tools.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/util.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/rtmpstore.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/s3.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/s3store.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/uritemplate/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/stores/youtubestore.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/base.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/instances.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/items.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/library.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_error.subject +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_error.to +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_error.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_ready.subject +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_ready.to +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_ready.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_render_error.subject +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_render_error.to +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_render_error.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_validate_error.subject +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_validate_error.to +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/notify_validate_error.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/smil +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/test.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/templates/medialib/testpicker.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/tests.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/urls.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/utils.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/views.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/channel.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/discovery.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/errors.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/http.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/mimeparse.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/model.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/sample_tools.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/apiclient/schema.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/httplib2/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/httplib2/cacerts.txt +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/httplib2/iri2uri.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/httplib2/socks.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/anyjson.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/appengine.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/client.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/clientsecrets.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/crypt.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/django_orm.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/gce.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/keyring_storage.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/locked_file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/multistore_file.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/old_run.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/tools.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/util.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/oauth2client/xsrfutil.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/upload.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/medialib/youtube/uritemplate/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/client.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/eod.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/examples/eod_example.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/delete_gauge.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/delete_metric.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/fix_redis_metrics_keys.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/generate_test_metrics.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/redis_metrics_send_mail.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/reset_weekly_metrics.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/management/commands/system_metric.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/0002_metrics_k11_metrics_k12_metrics_k13_metrics_k14_and_more.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/0003_metrics_expires.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/0004_eodmetrics.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/providers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/providers/aws.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/settings.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/metrics/utils.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/models.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/rpc/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/rpc/githooks.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/rpc/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/rpc/products.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/static/js/models_pushit.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/pushit/utils.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/.gitignore +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/RemoteEvents.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/arc4.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/cache.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/crypto/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/crypto/aes.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/crypto/privpub.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/crypto/util.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/datem.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/decorators.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/encryption.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/errors.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/extra/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/extra/hostinfo.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/extra/json_metadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/fields.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/forms.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/helpers.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/joke.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/jwtoken.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/log.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/mail.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/mailman.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/management/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/management/commands/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/management/commands/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/cors.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/db_router.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/jwt.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/request.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/session.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/middleware/session_store.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/models/cacher.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/models/metadata.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/net.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/regexes.yaml +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/search.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/collection.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/csv.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/excel.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/json.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/legacy.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/localizers.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/model.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/profiler.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/serializers/util.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/settings_helper.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/ssl_check.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/static/lib/jquery.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/static/rest/app.css +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/static/rest/app.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/static/rest/rest.js +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/static/rest/rest.scss +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/templates/email/error.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/templates/email/error.subject +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/templates/rest_docs.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/templates/rest_html.html +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/ua.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/uberdict.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/url_docs.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/rest/views.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/.gitignore +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/models.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/tests.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/sessionlog/views.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/models.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/email.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/http.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/s3.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/sftp.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/taskqueue/transports/sms.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/admin.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/decorators.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/migrations/0002_alter_sms_sid.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/models.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/phone_util.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/telephony/rpc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/migrations/0001_initial.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/migrations/0002_alter_pagemedia_entry.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/migrations/0003_page_perms.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/migrations/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/models/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/models/faq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/models/page.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/models/revision.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/periodic.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/highlight.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/math.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/media.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/meta.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/task_list.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/renderers/mistune/toc.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/rpc/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/rpc/wiki.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/wiki/tq.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/README.md +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/client.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/connection.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/exceptions.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/redis.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/servers/__init__.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/servers/base.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/servers/django.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/servers/uwsgi.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/settings.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/utf8validator.py +0 -0
- {django_restit-4.2.173 → django_restit-4.2.175}/ws4redis/websocket.py +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated by Django 4.2.18 on 2025-03-23 19:54
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('account', '0022_alter_memberdevice_modified'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AddField(
|
14
|
+
model_name='authsession',
|
15
|
+
name='method',
|
16
|
+
field=models.CharField(blank=True, db_index=True, default=None, max_length=127, null=True),
|
17
|
+
),
|
18
|
+
]
|
@@ -118,6 +118,7 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
118
118
|
"kind",
|
119
119
|
("metadata__timezone", "timezone"),
|
120
120
|
("metadata__eod", "end_of_day"),
|
121
|
+
("parent__pk", "parent_id"),
|
121
122
|
("parent__name", "parent"),
|
122
123
|
("location.line1", "address_line1"),
|
123
124
|
("location.line2", "address_line2"),
|
@@ -171,7 +172,7 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
171
172
|
if item:
|
172
173
|
return item.thumbnail_url()
|
173
174
|
return None
|
174
|
-
|
175
|
+
|
175
176
|
@classmethod
|
176
177
|
def on_rest_list_filter(cls, request, qset=None):
|
177
178
|
if not request.member.hasPermission("view_all_groups"):
|
@@ -231,7 +232,7 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
231
232
|
raise RestValidationError("cannot set self as parent", 1101)
|
232
233
|
value = Group.objects.filter(pk=value).last()
|
233
234
|
self.parent = value
|
234
|
-
|
235
|
+
|
235
236
|
def set_child_of(self, value):
|
236
237
|
# this is a helper to add this group to another group
|
237
238
|
parent = Group.objects.filter(pk=value).last()
|
@@ -321,7 +322,7 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
321
322
|
return True
|
322
323
|
return False
|
323
324
|
|
324
|
-
def notifyMembers(self, subject, message=None, template=None, context=None,
|
325
|
+
def notifyMembers(self, subject, message=None, template=None, context=None,
|
325
326
|
email_only=False, sms_msg=None, perms=None, force=False,
|
326
327
|
from_email=None, exclude_member=None):
|
327
328
|
if perms is not None:
|
@@ -436,19 +437,19 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
436
437
|
qset = self.memberships.filter(state__gte=-10)
|
437
438
|
if perms:
|
438
439
|
qset = qset.filter(
|
439
|
-
Q(properties__category="permissions",
|
440
|
-
properties__key__in=perms,
|
441
|
-
properties__value__in=TRUE_VALUES) |
|
442
|
-
Q(member__properties__category="permissions",
|
443
|
-
member__properties__key__in=perms,
|
440
|
+
Q(properties__category="permissions",
|
441
|
+
properties__key__in=perms,
|
442
|
+
properties__value__in=TRUE_VALUES) |
|
443
|
+
Q(member__properties__category="permissions",
|
444
|
+
member__properties__key__in=perms,
|
444
445
|
member__properties__value__in=TRUE_VALUES))
|
445
446
|
if notify:
|
446
447
|
qset = qset.filter(
|
447
|
-
Q(properties__category="notify",
|
448
|
-
properties__key__in=notify,
|
449
|
-
properties__value__in=TRUE_VALUES) |
|
450
|
-
Q(member__properties__category="notify",
|
451
|
-
member__properties__key__in=notify,
|
448
|
+
Q(properties__category="notify",
|
449
|
+
properties__key__in=notify,
|
450
|
+
properties__value__in=TRUE_VALUES) |
|
451
|
+
Q(member__properties__category="notify",
|
452
|
+
member__properties__key__in=notify,
|
452
453
|
member__properties__value__in=TRUE_VALUES))
|
453
454
|
|
454
455
|
if role:
|
@@ -495,7 +496,7 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
495
496
|
# enable again?
|
496
497
|
ms.set_state(0)
|
497
498
|
ms.save()
|
498
|
-
|
499
|
+
|
499
500
|
if MEMBERSHIP_ROLES:
|
500
501
|
perms = MEMBERSHIP_ROLES.get(role, [])
|
501
502
|
for k in perms:
|
@@ -601,12 +602,8 @@ class Group(models.Model, RestModel, MetaDataModel):
|
|
601
602
|
if credentials.kind == "member":
|
602
603
|
if msg.pk is not None:
|
603
604
|
return credentials.instance.isMemberOf(msg.pk)
|
604
|
-
return False
|
605
|
+
return False
|
605
606
|
|
606
607
|
|
607
608
|
class GroupMetaData(MetaDataBase):
|
608
609
|
parent = models.ForeignKey(Group, related_name="properties", on_delete=models.CASCADE)
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
@@ -42,6 +42,7 @@ class AuthSession(models.Model, RestModel):
|
|
42
42
|
signature = models.CharField(max_length=127, db_index=True)
|
43
43
|
ip = models.CharField(max_length=127, null=True, blank=True, db_index=True)
|
44
44
|
buid = models.CharField(max_length=127, null=True, blank=True, default=None)
|
45
|
+
method = models.CharField(max_length=127, null=True, blank=True, db_index=True, default=None)
|
45
46
|
|
46
47
|
member = models.ForeignKey("account.Member", null=True, blank=True, related_name="auth_sessions", on_delete=models.CASCADE)
|
47
48
|
location = models.ForeignKey("location.GeoIP", related_name="auth_sessions", blank=True, null=True, default=None, on_delete=models.CASCADE)
|
@@ -72,8 +73,9 @@ class AuthSession(models.Model, RestModel):
|
|
72
73
|
return f"{self.member.username} - {self.ip} - {self.os} - {self.browser}"
|
73
74
|
|
74
75
|
@classmethod
|
75
|
-
def NewSession(cls, request):
|
76
|
+
def NewSession(cls, request, method="jwt"):
|
76
77
|
obj = cls(ip=request.ip, member=request.member, signature=request.signature)
|
78
|
+
obj.method = method
|
77
79
|
obj.user_agent = request.META.get('HTTP_USER_AGENT', None)
|
78
80
|
obj.last_activity = datetime.now()
|
79
81
|
obj.buid = request.POST.get("__buid__", request.GET.get("__buid__", None))
|
@@ -92,4 +94,3 @@ class AuthSession(models.Model, RestModel):
|
|
92
94
|
session.touch()
|
93
95
|
return session
|
94
96
|
return None
|
95
|
-
|
@@ -37,6 +37,7 @@ def member_login(request):
|
|
37
37
|
@rd.never_cache
|
38
38
|
def jwt_login(request):
|
39
39
|
# poor mans JWT, carried over
|
40
|
+
auth_method = "basic"
|
40
41
|
username = request.DATA.get('username', None)
|
41
42
|
if not username:
|
42
43
|
return rv.restPermissionDenied(request, "Password and/or Username is incorrect", error_code=422)
|
@@ -45,29 +46,31 @@ def jwt_login(request):
|
|
45
46
|
return rv.restPermissionDenied(request, error=f"Password and/or Username is incorrect for {username}", error_code=422)
|
46
47
|
auth_code = request.DATA.get(["auth_code", "code", "invite_token"], None)
|
47
48
|
if username and auth_code:
|
49
|
+
# this is typically used for OAUTH (final)
|
48
50
|
return member_login_uname_code(request, username, auth_code)
|
49
51
|
password = request.DATA.get('password', None)
|
50
52
|
member.canLogin(request) # throws exception if cannot login
|
51
53
|
if member.requires_totp or member.has_totp:
|
54
|
+
auth_method = "basic+totp"
|
52
55
|
resp = checkForTOTP(request, member)
|
53
56
|
if resp is not None:
|
54
57
|
return resp
|
55
58
|
if not member.login(request=request, password=password, use_jwt=True):
|
56
59
|
# we do not want permission denied catcher invoked as it is already handled in login method
|
57
60
|
return rv.restStatus(request, False, error=f"Invalid Credentials {username}", error_code=401)
|
58
|
-
return on_complete_jwt(request, member)
|
61
|
+
return on_complete_jwt(request, member, auth_method)
|
59
62
|
|
60
63
|
|
61
|
-
def on_complete_jwt(request, member):
|
64
|
+
def on_complete_jwt(request, member, method="basic"):
|
62
65
|
if member.security_token is None or member.security_token == JWT_KEY or member.force_single_session:
|
63
66
|
member.refreshSecurityToken()
|
64
67
|
|
65
68
|
member.log(
|
66
|
-
"jwt_login", "jwt login succesful",
|
69
|
+
"jwt_login", "jwt login succesful",
|
67
70
|
request, method="login", level=7)
|
68
71
|
|
69
72
|
device_id = request.DATA.get(["device_id", "deviceID"])
|
70
|
-
|
73
|
+
|
71
74
|
token = JWToken(
|
72
75
|
user_id=member.pk,
|
73
76
|
key=member.security_token,
|
@@ -80,13 +83,13 @@ def on_complete_jwt(request, member):
|
|
80
83
|
request.signature = token.session_id
|
81
84
|
request.device_id = device_id
|
82
85
|
request.buid = request.DATA.get("__buid__", None)
|
83
|
-
request.auth_session = am.AuthSession.NewSession(request)
|
86
|
+
request.auth_session = am.AuthSession.NewSession(request, method)
|
84
87
|
if bool(device_id):
|
85
88
|
am.MemberDevice.register(request, member, device_id)
|
86
|
-
|
89
|
+
|
87
90
|
request.jwt_token = token.access_token # this tells the middleware to store in cookie
|
88
91
|
return rv.restGet(
|
89
|
-
request,
|
92
|
+
request,
|
90
93
|
dict(
|
91
94
|
access=token.access_token,
|
92
95
|
refresh=token.refresh_token,
|
@@ -221,9 +224,9 @@ def member_login_uname_code(request, username, auth_code):
|
|
221
224
|
member.login(request=request)
|
222
225
|
member.save()
|
223
226
|
member.log("code_login", "code login", request, method="login", level=8)
|
224
|
-
if request.DATA.get("auth_method") == "basic":
|
227
|
+
if request.DATA.get("auth_method") == "basic" and ALLOW_BASIC_LOGIN:
|
225
228
|
return rv.restGet(request, dict(id=member.pk, session_key=request.session.session_key))
|
226
|
-
return on_complete_jwt(request, member)
|
229
|
+
return on_complete_jwt(request, member, "auth_code")
|
227
230
|
|
228
231
|
|
229
232
|
@rd.url(r'^logout$')
|
@@ -296,7 +299,7 @@ def get_member_from_request(request):
|
|
296
299
|
request.member = member
|
297
300
|
member.log("login_blocked", "account is locked out", request, method="login", level=31)
|
298
301
|
return member, rv.restPermissionDenied(request, error=f"{member.username} Account locked out", error_code=411)
|
299
|
-
return member, None
|
302
|
+
return member, None
|
300
303
|
|
301
304
|
|
302
305
|
@rd.urlPOST('forgot')
|
@@ -408,5 +411,3 @@ def totp_verify(request):
|
|
408
411
|
return rv.restPermissionDenied(request, "invalid code")
|
409
412
|
request.member.setProperty("totp_verified", 1)
|
410
413
|
return rv.restStatus(request, True)
|
411
|
-
|
412
|
-
|
@@ -20,37 +20,43 @@ def oauth_google_login(request):
|
|
20
20
|
state = request.DATA.get("state")
|
21
21
|
app_url = settings.DEFAULT_LOGIN_URL
|
22
22
|
|
23
|
-
rh.log_print("google/login", request.DATA.toDict(), request.session.get("state"))
|
23
|
+
# rh.log_print("google/login", request.DATA.toDict(), request.session.get("state"))
|
24
24
|
|
25
25
|
if state:
|
26
|
+
# this is where we should pull out the passed in state and get the proper URL
|
26
27
|
state = objict.fromJSON(rh.hexToString(state))
|
27
28
|
rh.log_print("state", state)
|
28
29
|
app_url = state.url
|
29
30
|
|
30
31
|
if not code:
|
31
32
|
params = urlencode({'error': error})
|
32
|
-
|
33
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
34
|
+
return redirect(f"{app_url}{separator}{params}")
|
33
35
|
|
34
|
-
redirect_uri = f"{
|
36
|
+
redirect_uri = f"{request.scheme}://{request.get_host()}/{REST_PREFIX}account/oauth/google/login"
|
35
37
|
auth_data = google.getAccessToken(code, redirect_uri)
|
36
38
|
if auth_data is None or auth_data.access_token is None:
|
37
39
|
params = urlencode({'error': "failed to get access token from google"})
|
38
|
-
|
40
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
41
|
+
return redirect(f"{app_url}{separator}{params}")
|
39
42
|
|
40
43
|
user_data = google.getUserInfo(auth_data.access_token)
|
41
44
|
if user_data is None:
|
42
45
|
params = urlencode({'error': "failed to get user data from google"})
|
43
|
-
|
46
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
47
|
+
return redirect(f"{app_url}{separator}{params}")
|
44
48
|
|
45
49
|
if not user_data.email:
|
46
50
|
params = urlencode({'error': "no email with account"})
|
47
|
-
|
51
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
52
|
+
return redirect(f"{app_url}{separator}{params}")
|
48
53
|
|
49
54
|
# TODO allow new accounts?
|
50
55
|
member = Member.objects.filter(email=user_data.email).last()
|
51
56
|
if member is None:
|
52
57
|
params = urlencode({'error': "user not found"})
|
53
|
-
|
58
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
59
|
+
return redirect(f"{app_url}{separator}{params}")
|
54
60
|
|
55
61
|
member.setProperties(auth_data, category="google_auth")
|
56
62
|
member.setProperties(user_data, category="google")
|
@@ -69,13 +75,8 @@ def oauth_google_login(request):
|
|
69
75
|
member.save()
|
70
76
|
member.auditLog("user succesfully authenticated with google", "google_oauth", level=17)
|
71
77
|
|
72
|
-
params = urlencode({'oauth_code': member.auth_code, "username":member.username})
|
78
|
+
params = urlencode({'oauth_code': member.auth_code, "username":member.username, "auth_method":"google_oauth"})
|
73
79
|
rurl = None
|
74
|
-
if
|
75
|
-
|
76
|
-
rurl = f"{app_url}{params}"
|
77
|
-
else:
|
78
|
-
rurl = f"{app_url}&{params}"
|
79
|
-
else:
|
80
|
-
rurl = f"{app_url}?{params}"
|
80
|
+
separator = '&' if '?' in app_url and app_url[-1] != '?' else '?'
|
81
|
+
rurl = f"{app_url}{separator}{params}"
|
81
82
|
return redirect(rurl)
|
@@ -51,4 +51,4 @@ def rest_on_passkeys_auth_complete(request):
|
|
51
51
|
request.session.pop("fido2_state"),
|
52
52
|
request.session.pop("fido2_rp_id"))
|
53
53
|
# we now want to handle the JWT or basic login flow
|
54
|
-
return on_complete_jwt(request, uk.member)
|
54
|
+
return on_complete_jwt(request, uk.member, "passkey")
|
@@ -55,10 +55,11 @@ class PersistentLog(models.Model, RestModel):
|
|
55
55
|
class RestMeta:
|
56
56
|
DEFAULT_SORT = "-when"
|
57
57
|
CAN_SAVE = False
|
58
|
+
ESTIMATE_COUNTS = True
|
58
59
|
GROUP_FIELD = None # do this so when we sort by group it is always exact
|
59
60
|
QUERY_FIELDS = [
|
60
|
-
"level", "component", "pkey", "action",
|
61
|
-
"request_method", "request_path",
|
61
|
+
"level", "component", "pkey", "action",
|
62
|
+
"request_method", "request_path",
|
62
63
|
"session__ip", "user",
|
63
64
|
"tid", "group", "user__username"]
|
64
65
|
SEARCH_FIELDS = ["user__username", "user__last_name", "message", "session__ip", "request_path"]
|
@@ -18,8 +18,8 @@ INCIDENT_EVENT_GRANULARITY = settings.get("INCIDENT_EVENT_GRANULARITY", "hourly"
|
|
18
18
|
EVENT_TO_INCIDENT_LEVEL = settings.get("EVENT_TO_INCIDENT_LEVEL", 4)
|
19
19
|
EVENT_DETAIL_TEMPLATES = settings.get("EVENT_DETAIL_TEMPLATES", None)
|
20
20
|
EVENT_META_KEYWORDS = settings.get("EVENT_META_KEYWORDS", [
|
21
|
-
"path", "ip", "reporter_ip", "code",
|
22
|
-
"reason", "buid", "merchant", "tid",
|
21
|
+
"path", "ip", "reporter_ip", "code",
|
22
|
+
"reason", "buid", "merchant", "tid",
|
23
23
|
"group", "http_user_agent", "user_agent",
|
24
24
|
"app_url", "isp", "city", "state", "country",
|
25
25
|
"username"
|
@@ -28,7 +28,7 @@ EVENT_META_KEYWORDS = settings.get("EVENT_META_KEYWORDS", [
|
|
28
28
|
logger = log.getLogger("incident", filename="incident.log")
|
29
29
|
|
30
30
|
"""
|
31
|
-
very generic
|
31
|
+
very generic
|
32
32
|
external system can post an event
|
33
33
|
{
|
34
34
|
"description": "Critical Test Event",
|
@@ -77,15 +77,15 @@ class Event(JSONMetaData, rm.RestModel):
|
|
77
77
|
# code = models.IntegerField(default=0, db_index=True)
|
78
78
|
|
79
79
|
group = models.ForeignKey(
|
80
|
-
"account.Group", on_delete=models.SET_NULL,
|
80
|
+
"account.Group", on_delete=models.SET_NULL,
|
81
81
|
related_name="+", null=True, default=None)
|
82
|
-
|
82
|
+
|
83
83
|
component = models.SlugField(max_length=250, null=True, blank=True, default=None)
|
84
84
|
component_id = models.IntegerField(null=True, blank=True, default=None)
|
85
85
|
|
86
86
|
# this allows us to bundle multiple events to an incident
|
87
87
|
incident = models.ForeignKey(
|
88
|
-
Incident, null=True, default=None,
|
88
|
+
Incident, null=True, default=None,
|
89
89
|
related_name="events", on_delete=models.SET_NULL)
|
90
90
|
|
91
91
|
def runRules(self):
|
@@ -170,14 +170,14 @@ class Event(JSONMetaData, rm.RestModel):
|
|
170
170
|
# logger.info(f"ignore event {self.pk} {self.description}")
|
171
171
|
return
|
172
172
|
|
173
|
-
# always create an incident
|
173
|
+
# always create an incident
|
174
174
|
if incident is None:
|
175
175
|
incident = Incident(
|
176
176
|
rule=hit_rule, priority=priority,
|
177
177
|
reporter_ip=self.reporter_ip,
|
178
178
|
category=self.category,
|
179
179
|
group=self.group,
|
180
|
-
component=self.component,
|
180
|
+
component=self.component,
|
181
181
|
component_id=self.component_id,
|
182
182
|
hostname=self.hostname)
|
183
183
|
if self.group is None and hit_rule is not None:
|
@@ -211,4 +211,3 @@ class Event(JSONMetaData, rm.RestModel):
|
|
211
211
|
incident.triggerAction()
|
212
212
|
except Exception:
|
213
213
|
logger.exception()
|
214
|
-
|
@@ -92,7 +92,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
92
92
|
|
93
93
|
group = models.ForeignKey("account.Group", on_delete=models.SET_NULL, null=True, default=None)
|
94
94
|
assigned_to = models.ForeignKey("account.Member", on_delete=models.SET_NULL, null=True, default=None)
|
95
|
-
|
95
|
+
|
96
96
|
priority = models.IntegerField(default=0) # 1-10, 1 being the highest
|
97
97
|
# 0=new, 1=opened, 2=paused, 3=ignore, 4=resolved, 5=pending
|
98
98
|
state = models.IntegerField(default=0, choices=INCIDENT_STATES)
|
@@ -160,7 +160,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
160
160
|
|
161
161
|
if event.details:
|
162
162
|
self.setProperty("details", event.details)
|
163
|
-
|
163
|
+
|
164
164
|
if event.metadata.geoip and event.metadata.geoip.city:
|
165
165
|
self.setProperty("city", event.metadata.geoip.city)
|
166
166
|
self.setProperty("state", event.metadata.geoip.state)
|
@@ -209,7 +209,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
209
209
|
self.save()
|
210
210
|
elif self.rule.action.startswith("firewall_block"):
|
211
211
|
if settings.FIREWALL_GLOBAL_BLOCK:
|
212
|
-
Task.Publish("incident", "firewall_block",
|
212
|
+
Task.Publish("incident", "firewall_block",
|
213
213
|
dict(ip=self.reporter_ip),
|
214
214
|
channel="tq_broadcast")
|
215
215
|
|
@@ -348,7 +348,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
348
348
|
member.sendSMS(sms_msg)
|
349
349
|
members = group.getMembers(perms=email_perms, as_member=True)
|
350
350
|
for member in members:
|
351
|
-
member.sendEmail(subject, body)
|
351
|
+
member.sendEmail(subject, body)
|
352
352
|
|
353
353
|
def notifyWith(self, perm):
|
354
354
|
# logger.info("notifyWith", perm)
|
@@ -407,7 +407,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
407
407
|
if request != None and "DATA" in request and "note" in request.DATA:
|
408
408
|
self.logHistory(kind="note", note=request.DATA.get("note"), request=request)
|
409
409
|
|
410
|
-
def logHistory(self, kind="history", note=None, media=None,
|
410
|
+
def logHistory(self, kind="history", note=None, media=None,
|
411
411
|
request=None, member=None, notify=True):
|
412
412
|
if request is None:
|
413
413
|
request = self.getActiveRequest()
|
@@ -493,7 +493,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
|
|
493
493
|
email_only=True,
|
494
494
|
from_email=INCIDENT_EMAIL_FROM)
|
495
495
|
else:
|
496
|
-
# notitfy everyone but the sender
|
496
|
+
# notitfy everyone but the sender
|
497
497
|
if history.by is None:
|
498
498
|
members = Member.GetWithPermission(perm, ignore_disabled_email=True).exclude(pk=history.by.pk)
|
499
499
|
if members.count() == 0:
|
@@ -46,8 +46,8 @@ class ServerOssecAlert(models.Model, rm.RestModel):
|
|
46
46
|
level = models.IntegerField(default=0)
|
47
47
|
title = models.CharField(max_length=200, blank=True, null=True, default=None)
|
48
48
|
geoip = models.ForeignKey("location.GeoIP", blank=True, null=True, default=None, on_delete=models.DO_NOTHING)
|
49
|
-
|
49
|
+
|
50
50
|
metadata = None
|
51
|
-
|
51
|
+
|
52
52
|
def __str__(self):
|
53
53
|
return f'{self.hostname}: {self.title}'
|
@@ -43,14 +43,14 @@ def metric(
|
|
43
43
|
elif granularity in ["minutes", "seconds"]:
|
44
44
|
expires = datetime.now() + timedelta(days=7)
|
45
45
|
m, created = Metrics.objects.get_or_create(
|
46
|
-
uuid=key,
|
46
|
+
uuid=key,
|
47
47
|
defaults=dict(
|
48
48
|
granularity=granularity, slug=slug, expires=expires,
|
49
49
|
group=group, start=utils.date_for_granulatiry(date, granularity)))
|
50
50
|
m.updateMetrics(keys, data, created)
|
51
51
|
|
52
52
|
|
53
|
-
def gauge(slug, keys, data, granularity="daily", group=None, date=None,
|
53
|
+
def gauge(slug, keys, data, granularity="daily", group=None, date=None,
|
54
54
|
timezone=None, slug_append=None, max_granularity=None):
|
55
55
|
# guage does not accumulate but just stores the data like a cache
|
56
56
|
# if calledf on the same time period it will just update the current numbers
|
@@ -72,7 +72,7 @@ def gauge(slug, keys, data, granularity="daily", group=None, date=None,
|
|
72
72
|
elif gran == "daily":
|
73
73
|
expires = datetime.now() + timedelta(days=METRICS_EXPIRE_DAILY)
|
74
74
|
m, created = Metrics.objects.get_or_create(
|
75
|
-
uuid=key,
|
75
|
+
uuid=key,
|
76
76
|
defaults=dict(
|
77
77
|
granularity=gran, slug=slug, expires=expires,
|
78
78
|
group=group, start=utils.date_for_granulatiry(date, gran)))
|
@@ -99,7 +99,7 @@ def get_qset(slug, granularity, start=None, end=None,
|
|
99
99
|
start = group.getLocalTime(start)
|
100
100
|
elif settings.METRICS_TIMEZONE:
|
101
101
|
start = date_util.convertToLocalTime(settings.METRICS_TIMEZONE, start)
|
102
|
-
|
102
|
+
|
103
103
|
start = utils.date_for_granulatiry(start, granularity)
|
104
104
|
if end is None:
|
105
105
|
if granularity == "hourly":
|
@@ -133,7 +133,7 @@ def get_totals(slug, keys, granularity, start=None, end=None, group=None):
|
|
133
133
|
start = group.getLocalTime(start)
|
134
134
|
elif settings.METRICS_TIMEZONE:
|
135
135
|
start = date_util.convertToLocalTime(settings.METRICS_TIMEZONE, start)
|
136
|
-
|
136
|
+
|
137
137
|
start = utils.date_for_granulatiry(start, granularity)
|
138
138
|
if end is None:
|
139
139
|
end = start + timedelta(minutes=5)
|
@@ -141,7 +141,7 @@ def get_totals(slug, keys, granularity, start=None, end=None, group=None):
|
|
141
141
|
end = group.getLocalTime(end)
|
142
142
|
elif settings.METRICS_TIMEZONE:
|
143
143
|
end = date_util.convertToLocalTime(settings.METRICS_TIMEZONE, end)
|
144
|
-
|
144
|
+
|
145
145
|
qset = Metrics.objects.filter(
|
146
146
|
slug=slug, granularity=granularity,
|
147
147
|
group=group, start__gte=start, start__lte=end)
|
@@ -162,7 +162,7 @@ def get_metric(slug, granularity, start, group=None):
|
|
162
162
|
start = group.getLocalTime(start)
|
163
163
|
elif settings.METRICS_TIMEZONE:
|
164
164
|
start = date_util.convertToLocalTime(settings.METRICS_TIMEZONE, start)
|
165
|
-
|
165
|
+
|
166
166
|
start = utils.date_for_granulatiry(start, granularity)
|
167
167
|
qset = Metrics.objects.filter(
|
168
168
|
slug=slug, granularity=granularity, start__gte=start, start__lte=start, group=group)
|
@@ -226,7 +226,7 @@ def get_metrics(slug, granularity, start, end=None, group=None, samples=None):
|
|
226
226
|
for k in keys:
|
227
227
|
data[k].append(0)
|
228
228
|
continue
|
229
|
-
for k in keys:
|
229
|
+
for k in keys:
|
230
230
|
data[k].append(result["values"].get(k, 0))
|
231
231
|
period_values.remove(result)
|
232
232
|
return objict(periods=periods, data=data)
|
@@ -241,7 +241,7 @@ def get_chart_periods(slug, granularity, start, end=None, group=None):
|
|
241
241
|
periods.append(period)
|
242
242
|
if granularity != "weekly":
|
243
243
|
periods.reverse()
|
244
|
-
return periods
|
244
|
+
return periods
|
245
245
|
|
246
246
|
|
247
247
|
def get_adjusted_date_range(granularity, start, end, group=None, samples=None):
|
@@ -282,6 +282,7 @@ def generate_uuid(slug, group, slug_append=None):
|
|
282
282
|
class Metrics(models.Model, rm.RestModel):
|
283
283
|
class RestMeta:
|
284
284
|
QUERY_FIELDS = ["group__kind", "all_fields"]
|
285
|
+
ESTIMATE_COUNTS = True
|
285
286
|
GRAPHS = {
|
286
287
|
"detailed": {
|
287
288
|
"fields": [
|
@@ -310,7 +311,7 @@ class Metrics(models.Model, rm.RestModel):
|
|
310
311
|
# allow to group metrics by a group
|
311
312
|
group = models.ForeignKey("account.Group", related_name="+", on_delete=models.CASCADE, null=True, default=None)
|
312
313
|
|
313
|
-
# now we create a set of k/v
|
314
|
+
# now we create a set of k/v
|
314
315
|
k1 = models.SlugField(max_length=64, null=True, default=None)
|
315
316
|
v1 = models.BigIntegerField(default=0)
|
316
317
|
|
@@ -7,6 +7,7 @@ import importlib
|
|
7
7
|
from django.db import models as dm
|
8
8
|
from django.db.transaction import atomic
|
9
9
|
from django.apps import apps
|
10
|
+
from django.db import connection
|
10
11
|
|
11
12
|
from rest import helpers as rh
|
12
13
|
from rest import errors as re
|
@@ -876,7 +877,7 @@ class RestModel(object):
|
|
876
877
|
if not graph and request is not None:
|
877
878
|
graph = request.DATA.get("graph", "default")
|
878
879
|
return GRAPH_HELPERS.restList(
|
879
|
-
request, qset, sort=sort, totals=totals,
|
880
|
+
request, qset, sort=sort, totals=totals,
|
880
881
|
return_httpresponse=return_httpresponse,
|
881
882
|
response_params=dict(graph=graph),
|
882
883
|
**cls.getGraph(graph))
|
@@ -896,6 +897,17 @@ class RestModel(object):
|
|
896
897
|
request = cls.getActiveRequest()
|
897
898
|
return cls.restList(request, qset, graph, totals, False)
|
898
899
|
|
900
|
+
@classmethod
|
901
|
+
def restListEstimatedCount(cls, request, qset):
|
902
|
+
# TODO attempt to make this work with the qset,
|
903
|
+
# right now it gets an estimated count of the entire table
|
904
|
+
if getattr(cls.RestMeta, "ESTIMATE_COUNTS", False):
|
905
|
+
if connection.vendor == 'postgresql':
|
906
|
+
with connection.cursor() as cursor:
|
907
|
+
cursor.execute(f"SELECT reltuples::bigint FROM pg_class WHERE relname = '{cls._meta.db_table}'")
|
908
|
+
return cursor.fetchone()[0]
|
909
|
+
return qset.count()
|
910
|
+
|
899
911
|
def restStatus(self, request, status, **kwargs):
|
900
912
|
RestModel._setupGraphHelpers()
|
901
913
|
return GRAPH_HELPERS.restStatus(request, status, **kwargs)
|
@@ -959,7 +971,7 @@ class RestModel(object):
|
|
959
971
|
has_perms = True
|
960
972
|
if perms is not None:
|
961
973
|
has_perms = cls.on_rest_list_has_perms(request, perms, qset)
|
962
|
-
|
974
|
+
|
963
975
|
if request.group:
|
964
976
|
qset = cls.on_rest_filter_children(request, qset)
|
965
977
|
if not has_perms:
|
@@ -1040,7 +1052,7 @@ class RestModel(object):
|
|
1040
1052
|
elif dr_offset > 0:
|
1041
1053
|
dr_start = dr_start + timedelta(minutes=dr_offset)
|
1042
1054
|
dr_end = dr_end + timedelta(minutes=dr_offset)
|
1043
|
-
|
1055
|
+
|
1044
1056
|
rh.debug("tr_end changing", str(dr_start), str(dr_end))
|
1045
1057
|
dr_field = request.DATA.get("dr_field", getattr(cls.RestMeta, "DATE_RANGE_FIELD", "created"))
|
1046
1058
|
q = dict()
|
@@ -1145,7 +1157,7 @@ class RestModel(object):
|
|
1145
1157
|
cls._boundRest()
|
1146
1158
|
if format.startswith("json"):
|
1147
1159
|
return GRAPH_HELPERS.views.restJSON(
|
1148
|
-
request, qset, fields,
|
1160
|
+
request, qset, fields,
|
1149
1161
|
name, format_size, localize=localize)
|
1150
1162
|
elif format.startswith("csv"):
|
1151
1163
|
return GRAPH_HELPERS.views.restCSV(
|
@@ -1159,7 +1171,7 @@ class RestModel(object):
|
|
1159
1171
|
return GRAPH_HELPERS.views.restFlat(
|
1160
1172
|
request, qset, fields,
|
1161
1173
|
name, format_size, localize=localize)
|
1162
|
-
|
1174
|
+
|
1163
1175
|
@classmethod
|
1164
1176
|
def on_rest_list_summary(cls, request, qset):
|
1165
1177
|
cls._boundRest()
|
@@ -1589,7 +1601,7 @@ class RestModel(object):
|
|
1589
1601
|
"group": "group__kind"
|
1590
1602
|
}
|
1591
1603
|
|
1592
|
-
QUERY_FIELDS can be used to restrict what fields can be queried
|
1604
|
+
QUERY_FIELDS can be used to restrict what fields can be queried
|
1593
1605
|
and add special fields:
|
1594
1606
|
|
1595
1607
|
?group__kind=iso
|
@@ -1600,7 +1612,7 @@ class RestModel(object):
|
|
1600
1612
|
or
|
1601
1613
|
<field_name>__<operator>=value
|
1602
1614
|
|
1603
|
-
You cannot do <field_name>__<sub_field>__<operator> unless
|
1615
|
+
You cannot do <field_name>__<sub_field>__<operator> unless
|
1604
1616
|
<field_name>__<sub_field> is
|
1605
1617
|
|
1606
1618
|
allowed <operator>s
|