* 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>
* fix: raw_id_fields for ReviewRequestDocEventAdmin
* fix: raw_id_fields for ReviewAssignmentDocEventAdmin
* fix: raw_id_fields for AddedMessageEventAdmin
* fix: raw_id_fields for SubmissionDocEventAdmin
* refactor: make inheritance clearer
* 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
* fix: check correct state machine when clearing status change ballots
Fixes#7335
* fix: Improve ballot clearing tests
* fix: look at the right state machines for defer state for a ballot
* fix: also do the right thing with conflrev defers
* feat: notify_event_to_subscribers_task
* fix: avoid circular import, handle error
* fix: don't queue task in test mode
* fix: don't even send mail in test mode
* test: separately test signal
* fix: if/else error
* test: better naming
* test: test the new task
* test: better test name
* test: refactor notify email test
* fix: save, not update
* test: restore template coverage
* chore: update add-django-cprofile-filter.patch
* fix: only use "draft" state when making aliases
* refactor: eliminate repeated get_state_slug()
On dev, reduces time for a draft-aliases api
call by by 10-15%
* refactor: only annotate inactive drafts
* refactor: de-lint
* refactor: speed up get_draft_authors_emails
Another 20% or so improvement in response time
* fix: guard against null person
* 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.
* refactor: generate group aliases on the fly
* chore: remove group alias file check
* chore: drop group alias settings, fix lint
* refactor: rename var to hint it's ignored
* test: update tests
* refactor: move utility to utils
* test: add test
---------
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* refactor: compute draft aliases on demand
n.b., very slow for full set of aliases
* refactor: simplify and cache email_aliases
The name != "" case is, as far as I can see, unused.
* chore: remove draft alias checks
* chore: remove draft alias/virtual settings
* chore: remove lint
* test: update tests
* test: better mocking
* refactor: move utility to utils
* test: add tests
* 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>
* fix: validate form in login()
* refactor: custom LoginView subclass for logins
Preserves old behavior, but avoids some hacks.
* test: reverse with strings, not view refs
* chore: remove unused imports
* fix: restore logout() call
This allows an exception to be raised if submission
files are missing, leading to a server error. That's
not pretty, but is better than ignoring the fail.
* feat: Add disclaimer banners for unadopted I-Ds and non-IETF RFCs
Fixes#6539
* Fixes
* Add test
* Use BofreqFactory
* Fix disclaimer logic
* fix: Wording changes from stream owners
* fix: Only insert <wbr> when there isn't a space before or after (#6821)
* fix: Only insert <wbr> when there isn't a space before or after.
* Fix @cabo's issue
* fix: Remove debug info from template (#6897)
Fixes#6895
* fix: remove link to Warren's draft from disclaimer text (#7429)
---------
Co-authored-by: Lars Eggert <lars@eggert.org>
* feat: disallow @ and : in name/ascii
@ has long been disallowed via validation in the
views and "/" has been disallowed for the name
field via a validator. This adds @ and : to the
validator and applies it to the name, plain,
ascii, and ascii_short fields. This should
apply everywhere we use a ModelForm.
* test: update test
* chore: migration
* feat: copy 1wg-charters* into other places
* test: update test
* test: test no-copy operation
* style: Black
* fix: Skip copy if dest is a non-dir
* chore: de-lint
* 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
* feat: IANA review email ingestor API
* refactor: Replace iana email api with generic one
* chore: Add type hint
* feat: Ingest ipr responses
* feat: Ingest nomcom feedback
* refactor: message -> msg
* fix: Typo
* feat: Send email on nomcom ingestion failure
* feat: Send email on IPR mail ingestion error
* feat: Check content type, handle more errs
* fix: drop additionalProperties: false
Unfortunately this does not mix well with
the conditional "year" property.
* test: Test ingest_email view
* Revert "test: Test ingest_email view"
This reverts commit e498022829f834a0d3cebcb0dafb0d5f5a5d162e.
* test: Test ingest_email view
* fix: pass new test
* test: Test ingest_review_email
* fix: Pass new test
* test: Test ipr ingest_response_email
* fix: pass new test
* test: test nomcom ingest_feedback_email
* chore: fix typo found in code reviw
* fix: De-lint
* 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: API to list role-holder addresses
* test: Test new API endpoint
* fix: role_holder_addresses gets own API token
* refactor: Move role_holder_addresses to ietf.api.views
* test: test for group.utils.role_holder_emails
* test: Clean up test_role_holder_addresses
* fix: Missed a change in urls.py
* refactor: Remove old view
* chore: Remove unused import
* chore: Remove unused import
* Redirect /help/state/draft/* to /doc/help/state/draft-*
* Adjust document state index to use /doc/help/state for URLs
* Move all state help to /doc. Fixes#3802
* Move state index redirect into urls file.
* ci: Update build-base-app.yml workflow
* Do not list PS in build_file_urls
* Update ietf/doc/utils.py
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
---------
Co-authored-by: Nicolas Giard <github@ngpixel.com>
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* chore: Remove generate_draft_aliases.py
Also remove test and update some now-stale help strings.
These are not very helpful, but will not exist for long
in their updated incarnation.
* chore: Remove generate_group_aliases.py
... and its test.
* chore: Remove unused import
* chore: Remove unused import
* feat: Remove trailing period from photo title, etc
For consistency, in email and photo tooltips, remove the trailing
period.
* feat: Remove email link in NomCom feedback
Seeing "User Name {envelope}" seems to confuse people; it's two links,
not one. So don't show the envelope-icon,
Also change text to say "current nomcom" when saying who gets it.
Fixes: #7032
* 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>
* chore: Bump version to 12 in a couple places
* ci: use semver-action to set dev major version
* feat: Extract version at runtime for dev
* fix: Use version/branch/hash vars
---------
Co-authored-by: Nicolas Giard <github@ngpixel.com>
* refactor: Remove Google from document history search
"Search lists" dropdown menu devolves into a single button
(two buttons for ADs).
* refactor: Remove unused ARO search
---------
Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
* feat: Add Announcements link to nomcom home page
* refactor: Move announcements link to top of page, outside nomcom_content
* refactor: Don't code URL path into template
* fix: Revert "Email authors" link for RFCs to the draft that it came from (#6856)
* refactor: Move mailto_name calculation to the view
* fix: Fully revert document_draft.html
* feat: Group admin form accepts acronyms starting with numbers for SDO groups (#6825)
* fix: Acronym can't start with hyphen
* fix: Restore some tests
* chore: remove unused setting
* feat: initial import of iesg minutes
* fix: let the meetings view show older iesg meetings
* feat: iesg narrative minutes
* feat: import bof coordination call minutes
* wip: import commands for iesg appeals and statements
* feat: import iesg statements.
* feat: import iesg artifacts
* feat: many fewer n+1 queries for the group meetings view
* fix: restore chain of elifs in views_doc
* fix: use self.stdout.write vs print in mgmt commands
* fix: use replace instead of astimezone when appropriate
* chore: refactor new migrations into one
* fix: transcode some old files into utf8
* fix: repair overzealous replace
* chore: black
* fix: address minro review comments
* fix: actually capture transcoding work
* fix: handle multiple iesg statements on the same day
* fix: better titles
* feat: pill badge replaced statements
* fix: consolodate source repos to one
* feat: liberal markdown for secretariat controlled content
* fix: handle (and clean) html narrative minutes
* feat: scrub harder
* fix: simplify and improve a scrubber
* chore: reorder migrations
* feat: Links to chatlogs and session recordings on proceedings page (#6791)
* refactor: Add a url template and convenience function for session_recording url
* refactor: Avoid using the walrus operator
* feat: DraftAliasGenerator class
Encapsulates logic from generate_draft_aliases.py
* refactor: Avoid circular imports
* feat: Add draft_aliases API endpoint
* feat: Add @requires_api_token decorator
Stolen from feat/rpc-api
* feat: Add token auth to draft_aliases endpoint
* feat: draft-aliases-from-json.py script
Parses output from the draft_aliases API call
* chore: Remove unused cruft
* refactor: Avoid shadowing "draft" name
* fix: Suppress empty lists from DraftAliasGenerator
* refactor: Use a GET instead of POST
* feat: GroupAliasGenerator class
* feat: group aliases API view
* fix: Handle domains array correctly
* fix: Suppress empty group aliases
* refactor: Generalize aliases-from-json.py script
* refactor: Same output fmt for draft and group alias apis
* feat: Sort addresses for stability
* fix: Add "anything" virtual alias
* test: Test requires_api_token decorator
* feat: Harden is_valid_token against misconfig
* test: Test is_valid_token
* test: Test draft_aliases view
* test: Test group_aliases view
* test: Test DraftAliasGenerator
* fix: ise group is type "ise" in test data
* test: Fix logic in testManagementCommand
The test was incorrect - and fails when fixed. :-(
* test: Test GroupAliasGenerator
Test currently fails
* fix: Suppress empty -ads alias
* test: Fix group acronym copy/paste error
I *think* this must be what had been intended. The
code does not look like it ever dealt with GroupHistory,
so I'm pretty sure it wasn't meant to have the same
acronym used by two different Groups at different
times.
* test: Check draft .notify alias generation
* test: Cover get_draft_notify_emails()
* fix: remove synchronization with mailman2
* feat: manage non wg mailing lists explicitly
* chore: black
* fix: update tests for new nonwg view
* feat: drop unused models
* refactor: Change import style for clarity
* feat: Add iana_changes_updates_task()
* chore: Squelch lint warning
My linter does not like variables defined outside
of __init__()
* feat: Add PeriodicTask for iana_changes_updates_task
* refactor: tasks instead of scripts on sync.views.notify()
* test: Test iana_changes_updates_task
* refactor: rename task for consistency
* feat: Add iana_protocols_update_task
* feat: Add PeriodicTask for iana protocols sync
* refactor: Use protocol sync task instead of script in view
* refactor: itertools.batched() not available until py312
* test: test iana_protocols_update_task
* feat: Add idindex_update_task()
Calls idindex generation functions and does the file
update dance to put them in place.
* chore: Add comments to bin/hourly
* fix: annotate types and fix bug
* feat: Create PeriodicTask for idindex_update_task
* refactor: Move helpers into a class
More testable this way
* refactor: Make TempFileManager a context mgr
* test: Test idindex_update_task
* test: Test TempFileManager
* fix: Fix bug in TestFileManager
yay testing
* feat: Add expire_ids_task()
* feat: Create PeriodicTask for expire_ids_task
* test: Test expire_ids_task
* test: Test request timeout in iana_protocols_update_task
* refactor: do not re-raise timeout exception
Not sure this is the right thing to do, but it's the
same as rfc_editor_index_update_task
* feat: Add notify_expirations_task
* feat: Add "weekly" celery beat crontab
* refactor: Reorder crontab fields
This matches the crontab file field order
* feat: Add PeriodicTask for notify_expirations
* test: Test notify_expirations_task
* test: Add annotation to satisfy mypy
* refactor: change references from User to Person (#5821)
* refactor: Change CommunityList reference from User to Person
* refactor: Convert more user references to person
* refactor: Change augment_docs_and_user_with_user_info to person
* refactor: Change Nomination and Feedback references from User to Person
* refactor: Change a few test case function signatures to be more pythonic
* refactor: Harmonize how profile and photo views look up email_or_name
* refactor: Rework community views to operate on Person instead of User (#5859)
* test: Update tests to try all of the person's emails and aliases
* fix: Recode a test case to avoid an exception if there's Unicode in the URL
This only happens using the form-filling and submission feature of
WebTest, which is only used in this one test case, so just it rip out.
* test: Add duplicate-person tests
* fix: If there are multiple matching users, prefer the logged-in one.
* chore: We no longer use WebTest, so don't include it.
* fix: Address review comments
* fix: case-insensitive person name or email matching (#6096)
* chore: Renumber migrations
* fix: Update merged code so tests pass (#6887)
* fix: Use refactored method
* fix: Don't assume user has person
* fix: Use new view param name
* chore: Drop community lists w/o person; cleanup (#6896)
* fix: Don't assume user has person
* fix: user->person in update_community_list_index.py
* feat: Remove CommunityLists without Person
* refactor: Speed up nomcom migrations
---------
Co-authored-by: Paul Selkirk <paul@painless-security.com>
Co-authored-by: Jennifer Richards <jennifer@staff.ietf.org>
* test: Test rfc_editor_index_update_task
* chore: Add docstring to test
* fix: Reuse stats instead of fetching twice
* test: Test fetch_meeting_attendance_task
* chore: Remove outdated tasks
* Revert "chore: Add docstring to test"
This reverts commit 0395410d665c0d310248fd151386f013357c5d13.
* Revert "test: Test rfc_editor_index_update_task"
This reverts commit 4dd9dd131723497db3d2aa76166169fd32c42fdd.
* test: Test rfc_editor_index_update_task
This time without reformatting the entire file...
* chore: Remove accidentally committed fragment
* test: Annotate function to satisfy mypy
* chore: Remove unused imports
* refactor: Factor out helper from fetch_meeting_attendance.py
* feat: Define fetch_meeting_attendance_task task
Equivalent to the fetch_meeting_attendance management command
* chore: Disable fetch_meeting_attendance in bin/daily
* feat: Log errors in fetch_meeting_attendance_task
* feat: Enable a result backend for celery
Ignore results by default, but enable the backend so we
can manage tasks
* feat: Define daily task in ietf.utils.tasks
* refactor: Make bin/send-review-reminders into a task
* refactor: Make bin/send-scheduled-mail into a task
* chore: Update copyright years
* refactor: Make bin/rfc-editor-index-updates into a task
* refactor: Accept date type in rfc index update fn
* chore: Update comment
* fix: Annotate param as Optional
* fix: Revert treating skip_older_than_date as str
Misunderstood the comment, "fixed" a non-bug. Oops.
* feat: mgmt command to create periodic tasks
* feat: add summary of tasks to mgmt cmd
* style: black
* fix: Remove debug statements
* feat: Enable/disable tasks
* chore: Disable periodic tasks by default
* chore: Revert changes to daily and every15m
* fix: Call intended function
* chore: Add task descriptions
* fix: Pass ad as Person instead of name
* refactor: Remove redundant AD check
Results being shown are already filtered by AD if the `ad`
variable is not `None`
* refactor: Add show_ad... flag to prepare_document_table
* refactor: Expose show_ad_and_shepherd flag
* chore: Unpin django-stubs / update mypy
* test: Use "app.model" for ManyToManyField
django-stubs requires "app.model" instead of just "model" for
ManyToManyField lazy model references.
See https://github.com/typeddjango/django-stubs/issues/1802
* fix: Properly set AD as action holder when submitting to IESG for publication (#5227)
The clear intent of `to_iesg` is that
a) the document AD should be the group AD, if not already set, and
b) the document Action Holder should be the document AD;
but there was an order-of-operation error,
such that the Action Holder remained empty.
* refactor: Don't take values out of the parent scope, don't insert values into the parent scope
* refactor: Streamline DocEvent creation