Observed since 20 Oct, 16:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Alliance Auth plugin to track corporation Freelance Jobs from the EVE Online ESI
An Alliance Auth plugin that tracks corporation "Freelance Jobs" from the EVE Online ESI.
![]()
![]()
Install the app:
pip install aa-freelance-tracker
This app depends on django-eveonline-sde
for Freelance Job schema/label data, which requires modeltranslation to be
first in INSTALLED_APPS:
INSTALLED_APPS = [
"modeltranslation",
] + INSTALLED_APPS
INSTALLED_APPS += [
"eve_sde",
"freelance_tracker",
]
If you already have eve_sde installed for another plugin, just add
"freelance_tracker".
Run migrations and collect static files:
python manage.py migrate
python manage.py collectstatic
Make sure eve_sde's SDE data is loaded (python manage.py esde_load_sde) and
kept up to date - see django-eveonline-sde's README
for the periodic update task. Job type titles/descriptions fall back to the
raw ESI key if this data isn't loaded yet.
Restart your Auth (gunicorn, Celery worker, and Celery beat).
Run the post-install setup command below to schedule the periodic sync.
esi-corporations.read_freelance_jobs.v1 - required from a director/manager
of a corporation before it can be linked for corp-wide tracking (requested via
the "Add / Refresh Corp Token" button).esi-characters.read_freelance_jobs.v1 - required from a character before it
shows up on that user's "My Jobs" screen (requested via "Add / Refresh
Character" on that page).| Permission | Description |
|---|---|
basic_access | Can access the app at all. |
add_corp_owner | Can link (or refresh the ESI token for) a corporation. |
view_corp | Can see Freelance Jobs for their own corporation. |
view_alliance | Can see Freelance Jobs for every corporation in their alliance (their own corp is included automatically). |
view_faction | Can see Freelance Jobs for every corporation in their faction. |
view_participants | Can see a job's participants list on its detail page, and contribution totals on the leaderboard. |
A user can hold any combination of view_corp/view_alliance/view_faction and
sees the union of what they grant. basic_access is required in addition to at
least one of the view_* permissions to see anything on the job board; without
it, my_jobs (which only shows the user's own participation) still requires
basic_access too. view_participants is independent of those three - it only
gates whether the participants table is shown on a job a user can already see,
and whether the "Contributed" column is shown on the leaderboard; without it,
the rest of the job detail page and the leaderboard's rankings still render
normally.
add_corp_owner clicks
"Add / Refresh Corp Token" and authorizes with the required ESI scope. This
immediately queues a sync for that corporation and also re-authorizes an
already-linked corporation if its token has expired or lost the scope./admin/freelance_tracker/owner/),
select one or more corporations and use the "Force a full resync from ESI
(bypasses cache)" action. This re-fetches every job the corporation has ever
had tracked, ignoring ESI's ETag cache.Linking a corporation (via the "Add / Refresh Corp Token" button) syncs its jobs once immediately, but nothing refreshes them after that unless a periodic task is scheduled. Run this once after installing/upgrading:
python manage.py freelance_tracker_setup
This registers an hourly PeriodicTask (via django-celery-beat) that calls
freelance_tracker.tasks.update_all_corp_freelance_jobs for every tracked
corporation. It's safe to run again after upgrades - it just updates the
existing schedule rather than duplicating it.
Each corporation's sync is a small chain of Celery tasks, not one big task:
_fetch_freelance_job_listing) pages through the corp's
Freelance Job listing from ESI using cursor-based pagination, advancing and
persisting the corp's cursor (Owner.jobs_cursor) so the next sync only
looks at what's new. Jobs already tracked as Active are always rechecked
too, since a job's detail and its participants have their own ESI caching
independent of the listing._dispatch_freelance_job_syncs) chains one task per job to
sync, in sequence._sync_freelance_job) fetches that job's detail, updates
it in the database, and syncs its participants if it's Active. This is
the task an ESI rate limit is applied to, since it's the one making the
per-job ESI calls._finalize_corp_sync) stamps Owner.last_update once every
job in that corp's sync has finished.update_all_corp_freelance_jobs (the periodic task) queues one such chain per
active corporation; different corporations' chains run independently and
concurrently of one another. Both update_all_corp_freelance_jobs and
update_corp_freelance_jobs accept a force=True option that bypasses ESI's
ETag cache and re-fetches every job ever tracked, rather than just what
changed - this is what the admin's "Force a full resync" action uses.
pypistats · 51 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-17 – 2026-10-17 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-16 – 2026-10-16 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-15 – 2026-10-15 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-13 – 2026-10-13 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-11 – 2026-10-11 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-10 – 2026-10-10 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-09 – 2026-10-09 | 4 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-07 – 2026-10-07 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-06 – 2026-10-06 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-10-03 – 2026-10-03 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-30 – 2026-09-30 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-29 – 2026-09-29 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-27 – 2026-09-27 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-26 – 2026-09-26 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-24 – 2026-09-24 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-23 – 2026-09-23 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-22 – 2026-09-22 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-21 – 2026-09-21 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-20 – 2026-09-20 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-18 – 2026-09-18 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-16 – 2026-09-16 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-14 – 2026-09-14 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-12 – 2026-09-12 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-09 – 2026-09-09 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-07 – 2026-09-07 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-05 – 2026-09-05 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-03 – 2026-09-03 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-09-02 – 2026-09-02 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-31 – 2026-08-31 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-24 – 2026-08-24 | 9 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-23 – 2026-08-23 | 5 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-22 – 2026-08-22 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-20 – 2026-08-20 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-18 – 2026-08-18 | 18 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-17 – 2026-08-17 | 4 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-14 – 2026-08-14 | 6 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-13 – 2026-08-13 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-09 – 2026-08-09 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-06 – 2026-08-06 | 5 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-04 – 2026-08-04 | 3 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-03 – 2026-08-03 | 7 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-02 – 2026-08-02 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-08-01 – 2026-08-01 | 1 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-29 – 2026-07-29 | 13 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-27 – 2026-07-27 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-23 – 2026-07-23 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-22 – 2026-07-22 | 5 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-21 – 2026-07-21 | 2 | 2026-10-20T17:20:51.8425026Z |
| 2026-07-20 – 2026-07-20 | 2 | 2026-10-20T17:20:51.8425026Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.0.1 | 5 Jul 2026 | 3 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Public sponsor counts have not been collected. These signals belong to the repository owner.
github · 1 observations shown. Missing days are unknown.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-21 | 1 | 2026-10-21T09:09:26.4108031Z |
Observed since 20 Oct, 16:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:1adc594567b56303cdba6e459adf8a00e324c42246ebff51b0d3ef31c8b085c2