• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

akvo / akvo-mis / #1326
90%

Build:
DEFAULT BRANCH: main
Ran 01 Oct 2026 04:36AM UTC
Jobs 1
Files 145
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

01 Oct 2026 04:09AM UTC coverage: 90.399% (+0.001%) from 90.398%
#1326

push

coveralls-python

web-flow
Send operators an invitation, not an activation link, and keep console resets on the console (#499)

* Send operators an invitation, not an activation link

Two defects in the console's invite and reset paths, both reported from
akvotest.

**The invitation signed the invitee in without asking for a password.**
`_invite_operator` reused `send_activation_email`, which is the
*registration* flow: someone who signed up chose a password at signup
and only has to prove the address is theirs, so the link legitimately
ends in a session. An invited account has no password -- the console
creates it with `set_unusable_password()` -- so following that link
activated it and handed over a session for an account that could never
be signed into again. The invitee discovered this on their next visit.

Invitations now end in the set-password form, the same `/login/<token>`
link an invited workspace member already gets, and accepting one is
what activates the account. That last part is narrowed to accounts that
never had a usable password, because the same endpoint completes a
password *reset*: without the narrowing, an account an administrator had
deactivated could let itself back in through "forgot password".

**A reset started on the console was sent to a workspace.** The lookup
scoped by tenant only when there was one, and the console has none -- so
it matched every account sharing that address in every workspace and
`.first()` picked one. For an operator who also had a workspace account,
the link was built for that workspace instead, where completing the
reset yields a session that cannot open the console. That is the
reported `default.mis.akvotest.org`.

The scoping could not simply become `tenant=None`: that reads the same
on the console, on the base domain, and on every single-host deployment,
where accounts do have workspaces -- it broke the existing resend test
immediately. The console is identified by its host instead, and only
there does the lookup narrow to... (continued)

8166 of 9278 branches covered (88.01%)

Branch coverage included in aggregate %.

15203 of 16573 relevant lines covered (91.73%)

0.92 hits per line

Coverage Regressions

Lines Coverage ∆ File
38
92.21
0.02% api/v1/v1_users/serializers.py
26
91.78
0.0% api/v1/v1_users/views.py
Jobs
ID Job ID Ran Files Coverage
1 #1326.1 01 Oct 2026 04:36AM UTC 145
90.4
Source Files on build #1326
  • Tree
  • List 145
  • Changed 2
  • Source Changed 0
  • Coverage Changed 2
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • d85bad6d on github
  • Prev Build on main
  • Next Build on main
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc