* feat: catch and report any <date> parsing error
* refactor: error handling in a more testable way
* fix: no bare `except`
* test: exception cases for test_parse_creation_date
* fix: explicitly reject non-numeric day/year
* test: suppress xml2rfc output in test
* refactor: context manager to capture xml2rfc output
* refactor: more capture_xml2rfc_output usage
* fix: capture_xml2rfc_output exception handling
* feat: basic blobstore infrastructure for dev
* refactor: (broken) attempt to put minio console behind nginx
* feat: initialize blobstore with boto3
* fix: abandon attempt to proxy minio. Use docker compose instead.
* feat: beginning of blob writes
* feat: storage utilities
* feat: test buckets
* chore: black
* chore: remove unused import
* chore: avoid f string when not needed
* fix: inform all settings files about blobstores
* fix: declare types for some settings
* ci: point to new target base
* ci: adjust test workflow
* fix: give the tests debug environment a blobstore
* fix: "better" name declarations
* ci: use devblobstore container
* chore: identify places to write to blobstorage
* chore: remove unreachable code
* feat: store materials
* feat: store statements
* feat: store status changes
* feat: store liaison attachments
* feat: store agendas provided with Interim session requests
* chore: capture TODOs
* feat: store polls and chatlogs
* chore: remove unneeded TODO
* feat: store drafts on submit and post
* fix: handle storage during doc expiration and resurrection
* fix: mirror an unlink
* chore: add/refine TODOs
* feat: store slide submissions
* fix: structure slide test correctly
* fix: correct sense of existence check
* feat: store some indexes
* feat: BlobShadowFileSystemStorage
* feat: shadow floorplans / host logos to the blob
* chore: remove unused import
* feat: strip path from blob shadow names
* feat: shadow photos / thumbs
* refactor: combine photo and photothumb blob kinds
The photos / thumbs were already dropped in the same
directory, so let's not add a distinction at this point.
* style: whitespace
* refactor: use kwargs consistently
* chore: migrations
* refactor: better deconstruct(); rebuild migrations
* fix: use new class in mack patch
* chore: add TODO
* feat: store group index documents
* chore: identify more TODO
* feat: store reviews
* fix: repair merge
* chore: remove unnecessary TODO
* feat: StoredObject metadata
* fix: deburr some debugging code
* fix: only set the deleted timestamp once
* chore: correct typo
* fix: get_or_create vs get and test
* fix: avoid the questionable is_seekable helper
* chore: capture future design consideration
* chore: blob store cfg for k8s
* chore: black
* chore: copyright
* ci: bucket name prefix option + run Black
Adds/uses DATATRACKER_BLOB_STORE_BUCKET_PREFIX option. Other changes
are just Black styling.
* ci: fix typo in bucket name expression
* chore: parameters in app-configure-blobstore
Allows use with other blob stores.
* ci: remove verify=False option
* fix: don't return value from __init__
* feat: option to log timing of S3Storage calls
* chore: units
* fix: deleted->null when storing a file
* style: Black
* feat: log as JSON; refactor to share code; handle exceptions
* ci: add ietf_log_blob_timing option for k8s
* test: --no-manage-blobstore option for running tests
* test: use blob store settings from env, if set
* test: actually set a couple more storage opts
* feat: offswitch (#8541)
* feat: offswitch
* fix: apply ENABLE_BLOBSTORAGE to BlobShadowFileSystemStorage behavior
* chore: log timing of blob reads
* chore: import Config from botocore.config
* chore(deps): import boto3-stubs / botocore
botocore is implicitly imported, but make it explicit
since we refer to it directly
* chore: drop type annotation that mypy loudly ignores
* refactor: add storage methods via mixin
Shares code between Document and DocHistory without
putting it in the base DocumentInfo class, which
lacks the name field. Also makes mypy happy.
* feat: add timeout / retry limit to boto client
* ci: let k8s config the timeouts via env
* chore: repair merge resolution typo
* chore: tweak settings imports
* chore: simplify k8s/settings_local.py imports
---------
Co-authored-by: Jennifer Richards <jennifer@staff.ietf.org>
* fix: correctly disconnect post_save signal
* chore: remove dumprelated.py and loadrelated.py
These have not been used in quite some time and would need
a careful review before trusting. Taking them out to avoid
accidents.
* style: Black
* chore: type hints
* refactor: % to f-string
* refactor: helper to decode header values
* fix: decode header fields for pop-up msg
* test: add tests
* fix: use truthiness check
We want to suppress empty strings, too...
* refactor: use f-string for time formatting
* test: clarify side_effect intention
* chore: Prevent test suite artifact creation in work directory
Also remove a few other stale test assets while I'm here.
* Try and fix CI
* Change IDSUBMIT_REPOSITORY_PATH
* Make the dir
* test: clean up media/nomcom directories
* test: de-dup settings_temp_path_overrides
* chore: remove debug
* refactor: avoid premature import of test_utils
* refactor: drop useless lambda wrapper
---------
Co-authored-by: Jennifer Richards <jennifer@staff.ietf.org>
* chore: nginx log is s, not ms
* chore: log seconds from gunicorn too
* chore: drop X-Real-IP header / log
* style: Black
* style: single -> double quotes
* feat: add is-authenticated header
* feat: log is-authenticated header
* chore: update nginx-auth.conf to match
* fix: #7287 ballot return params
* fix: Moving Ballot edit position ballot_edit_return_point from session to query param
* fix: tests for return_to_path param
* chore: removing Playwright tests until we can figure out a plan
* feat: return_to path utility refactoring
* fix: throw HTTP 400 in view rather than bubbling up a 500
* fix: return http400 rather than raising
* feat: style admin site in dev mode
* refactor: eliminate base_site.html
* fix: remove debug
* fix: commit missing __init__.py
* refactor: make method static; fix tests
* refactor: move api init to AppConfig.ready()
Avoids interacting with the app registry before
it's ready.
* fix: Explicitly set `executable_path` for Selenium
So it finds `geckodriver` again.
* Minimize diff
* fix: use existing executable_name
Co-authored-by: Lars Eggert <lars@eggert.org>
---------
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* feat: nginx + robots.txt
* feat: minimal /health/ endpoint
* ci: startupProbe for datatracker pod
* ci: probe auth pod; set timeoutSeconds
* feat: add CSP and other headers to nginx
* fix: typo in nginx.conf
* feat: split auth/dt nginx confs
* test: test health endpoint
* ci: auth service on port 80
We'll remove http-old (8080) in the future.
* ci: rename auth container/nginx cfg
* refactor: always use console log handler
* refactor: json for k8s, plain otherwise
* chore: remove syslog from wsgi.py
* chore: remove debug.log()
* chore: drop syslog from settings.py
* refactor: use log.log() in person.utils
* refactor: fetch_meeting_attendance->log.log()
* chore: gunicorn logs as JSON (wip)
* feat: better json log formatting
* refactor: improve log config
* feat: gunicorn access log fields
* fix: remove type hints
The gunicorn logger plays tricks with the
LogRecord args parameter to let it have string
keys instead of being a simple tuple.
The mypy tests rightly flag this. Rather
than fighting the typing, just remove the
hints and leave a comment warning not to
use the gunicorn-specific formatter with
other loggers.
* feat: generate_wg_summary_files_task()
* refactor: wg summaries from filesys for view
* refactor: use new helper for charter views
* refactor: use FileResponse
* refactor: don't use FileResponse
FileResponse generates a StreamingHttpResponse
which brings with it differences I don't fully
understand, so let's stay with HttpResponse
* test: update view tests
* test: test_generate_wg_summary_files_task()
* chore: create PeriodicTask
N.B. that this makes it hourly instead of daily
* feat: send_apikey_usage_emails_task
* chore: update test to use task instead of cmd
* chore: add PeriodicTask
* chore: remove old command + empty management dir
* chore: remove now-empty bin/weekly
* refactor: only consider keys that might have events
---------
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* feat: get tool versions without VersionInfo model
* chore: remove update_external_command_info call
* feat: get tool version without VersionInfo
* chore: Remove VersionInfo model
* chore: Migration to remove VersionInfo
* fix: handle errors better; ignore stderr
* fix: type annotation
* fix: log to stdout/stderr in json format
* chore: remove UTILS_LOGGER_LEVELS
This is not used (there _is_ a setting for the
django.security logger in settings_local.py on
production, but it is redundant with the
settings.LOGGING configuration and is not doing
anything).
* chore: revert to debug_console django logging
* chore: log.log to syslog via datatracker logger
* chore: remove unused imports
---------
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* feat: use gunicorn
* fix: let gunicorn emit logs to stdout/stderr
* fix: log to stdout/stderr in json format
* fix: run collectstatic for the local copy of the statics
* wip: identify whats needed to obviate ghostlinkd
* fix: hardlink new charter files to ftp directory
* fix: hardlink new charter files to ftp directory (continued)
* chore: bring settings comment up to date
* chore: add archive and ftp dirs to setup of various environments
* fix: test charter submits write to ftp dir
* chore: remove debug
* fix: test charter approval writes to ftp dir
* fix: link review revisions into ftp dir
* fix: link to all archive and ftp on submission post
* chore: clean comments, move action to github issue
* fix: link idindex files to all archive and ftp
* chore: deflake
* chore: remove TODO comment
* fix: use settings
* chore: rename new setting
* feat: Show bluesheets using Attended tables (#7094)
* feat: Show bluesheets using Attended tables (#6898)
* feat: Allow users to add themselves to session attendance (#6454)
* chore: Correct copyright year
* fix: Address review comments
* fix: Don't try to generate empty bluesheets
* refactor: Complete rewrite of bluesheet.html
* refactor: Fill in a few gaps, close a few holes
- Rename the live "bluesheet" to "attendance", add some explanatory text.
- Add attendance links in materials view and pre-finalized proceedings view.
- Don't allow users to add themselves after the corrections cutoff date.
* fix: Report file-save errors to caller
* fix: Address review comments
* fix: typo
* refactor: if instead of except; refactor gently
* refactor: Rearrange logic a little, add comment
* style: Black
* refactor: auto_now_add->default to allow override
* refactor: jsonschema to validate API payload
* feat: Handle new API data format
Not yet tested except that it falls back when the old
format is used.
* test: Split test into deprecated/new version
Have not yet touched the new version
* style: Black
* test: Test new add_session_attendees API
* fix: Fix bug uncovered by test
* refactor: Refactor affiliation lookup a bit
* fix: Order bluesheet by Attended.time
* refactor: Move helpers from views.py to utils.py
* test: Test that finalize calls generate_bluesheets
* test: test_bluesheet_data()
* fix: Clean up merge
* fix: Remove debug statement
* chore: comments
* refactor: Renumber migrations
---------
Co-authored-by: Paul Selkirk <paul@painless-security.com>
* chore: Remove unused import
* style: Black
* feat: Stub session update notify API
* feat: Add order & rev to slides JSON
* style: Black
* feat: Stub actual Meetecho slide deck mgmt API
* refactor: Limit reordering to type="slides"
* chore: Remove repository from meetecho API
(API changed on their end)
* feat: update Meetecho on slide reorder
* refactor: drop pytz from meetecho.py
* chore: Remove more repository refs
* refactor: Eliminate more pytz
* test: Test add_slide_deck api
* fix: Allow 202 status code / absent Content-Type
* test: Test delete_slide_deck api
* test: Test update_slide_decks api
* refactor: sessionpresentation_set -> presentations
* test: Test send_update()
* fix: Debug send_update()
* test: ajax_reorder_slides calls Meetecho API
* test: Test SldesManager.add()
* feat: Implement SlidesManager.add()
* test: Test that ajax_add_slides... calls API
* feat: Call Meetecho API when slides added to session
* test: Test SlidesManager.delete()
* feat: Implement SlidesManager.delete()
* test: ajax_remove_slides... calls Meetecho API
* feat: Call Meetecho API when slides removed
* chore: Update docstring
* feat: rudimentary debug mode for Meetecho API
* test: remove_sessionpresentation() calls Meetecho API
* feat: Call Meetecho API from remove_sessionpresentation()
* test: upload_slides() calls Meetecho API
* style: Black
* fix: Refactor/debug upload_session_slides
Avoids double-save of a SessionPresentation for the session
being updated and updates other sessions when apply_to_all
is set (previously it only created ones that did not exist,
so rev would never be updated).
* test: Fix test bug
* feat: Call Meetecho API when uploading session slides
* fix: Only replace slides actually linked to session
* fix: Delint
Removed some type checking rather than debugging it
* fix: Send get_versionless_href() as url for slides
* test: TZ-aware timestamps, please
* chore: Add comments
* feat: Call Meetecho API in edit_sessionpresentation
* feat: Call Meetecho API in remove_sessionpresentation
* feat: Call Meetecho API from add_sessionpresentation
* fix: Set order in add_sessionpresentation
* fix: Restrict API calls to "slides" docs
* feat: Call Meetecho API on title changes
* test: Check meetecho API calls in test_revise()
* fix: better Meetecho API "order" management
* fix: no PUT if there are no slides after DELETE
* feat: Catch exceptions from SlidesManager
Don't let errors in the MeetEcho slides API interfere with
the ability to modify slides for a session.
* feat: Limit which sessions we send notifications for
* fix: handle absence of request_timeout in api config
* test: always send slide notifications in tests
* fix: save slides before sending notification (#7172)
* fix: save slides before sending notification
* style: fix indentation
It's not a bug, it's a flourish!
---------
Co-authored-by: Jennifer Richards <jennifer@staff.ietf.org>
Co-authored-by: Paul Selkirk <paul@painless-security.com>