Catalog PyPI
PACKAGE EXPLORERView in registry

aa-freelance-tracker

PyPI

Alliance Auth plugin to track corporation Freelance Jobs from the EVE Online ESI

allianceautheveonlinefreelance
Versions collected1
Direct dependencies3From release 0.0.1
Last observed20 Oct, 16:55 UTC

README

Version 0.0.1 documentation

AA Freelance Tracker

An Alliance Auth plugin that tracks corporation "Freelance Jobs" from the EVE Online ESI.

Features

  • A searchable, sortable board of every Freelance Job tracked across your linked corporations, with a status filter (Active, Closed, Completed, Expired, ...) and sorting by expiry or ISK remaining.
  • A job detail page with progress, reward, configuration, and a participants list.
  • A "My Jobs" screen showing the Freelance Jobs the logged-in user's own characters are personally participating in, live from ESI.
  • Visibility scoped to what a user is permitted to see: their own corporation, their alliance, and/or their faction, in any combination.
  • Corp-wide syncing runs as a chain of Celery tasks per corporation (see How syncing works below), so a slow or failing job doesn't block the rest of that corp's sync.

Job board with status filter, sorting, and search

Job detail page with progress, reward, configuration, and participants

Installation

  1. Install the app:

    pip install aa-freelance-tracker
    
  2. 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".

  3. Run migrations and collect static files:

    python manage.py migrate
    python manage.py collectstatic
    
  4. 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.

  5. Restart your Auth (gunicorn, Celery worker, and Celery beat).

  6. Run the post-install setup command below to schedule the periodic sync.

ESI Scopes

  • 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).

Permissions

PermissionDescription
basic_accessCan access the app at all.
add_corp_ownerCan link (or refresh the ESI token for) a corporation.
view_corpCan see Freelance Jobs for their own corporation.
view_allianceCan see Freelance Jobs for every corporation in their alliance (their own corp is included automatically).
view_factionCan see Freelance Jobs for every corporation in their faction.
view_participantsCan 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.

Usage

  • Link a corporation: a director or manager with 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.
  • Browse jobs: the main job board supports free-text search (name, corporation, career, status), a status dropdown (defaults to Active), and sorting by soonest expiry or highest ISK remaining.
  • My Jobs: any user can link a character (via "Add / Refresh Character") to see the Freelance Jobs that character is personally contributing to, fetched live from ESI on page load.
  • Force a full resync: from Django admin (/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.

Post-install setup

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.

How syncing works

Each corporation's sync is a small chain of Celery tasks, not one big task:

  1. Listing (_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.
  2. Dispatch (_dispatch_freelance_job_syncs) chains one task per job to sync, in sequence.
  3. Per-job sync (_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.
  4. Finalize (_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.

Downloads & popularity

1downloads
1-day window · source-reported counts17 Oct 2026
1890
2026-07-20: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-20–2026-07-202026-07-21: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-21–2026-07-212026-07-22: 5 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-22–2026-07-222026-07-23: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-23–2026-07-232026-07-27: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-27–2026-07-272026-07-29: 13 · observed 2026-10-20T17:20:51.8425026Z · period 2026-07-29–2026-07-292026-08-01: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-01–2026-08-012026-08-02: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-02–2026-08-022026-08-03: 7 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-03–2026-08-032026-08-04: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-04–2026-08-042026-08-06: 5 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-06–2026-08-062026-08-09: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-09–2026-08-092026-08-13: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-13–2026-08-132026-08-14: 6 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-14–2026-08-142026-08-17: 4 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-17–2026-08-172026-08-18: 18 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-18–2026-08-182026-08-20: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-20–2026-08-202026-08-22: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-22–2026-08-222026-08-23: 5 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-23–2026-08-232026-08-24: 9 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-24–2026-08-242026-08-28: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-28–2026-08-282026-08-31: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-08-31–2026-08-312026-09-02: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-02–2026-09-022026-09-03: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-03–2026-09-032026-09-05: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-05–2026-09-052026-09-07: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-07–2026-09-072026-09-09: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-10–2026-09-102026-09-12: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-12–2026-09-122026-09-14: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-14–2026-09-142026-09-16: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-16–2026-09-162026-09-18: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-18–2026-09-182026-09-20: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-20–2026-09-202026-09-21: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-21–2026-09-212026-09-22: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-22–2026-09-222026-09-23: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-23–2026-09-232026-09-24: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-24–2026-09-242026-09-26: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-27–2026-09-272026-09-29: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-29–2026-09-292026-09-30: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-09-30–2026-09-302026-10-03: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-03–2026-10-032026-10-06: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-06–2026-10-062026-10-07: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-07–2026-10-072026-10-09: 4 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-09–2026-10-092026-10-10: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-10–2026-10-102026-10-11: 2 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-11–2026-10-112026-10-13: 3 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-13–2026-10-132026-10-15: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-15–2026-10-152026-10-16: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-16–2026-10-162026-10-17: 1 · observed 2026-10-20T17:20:51.8425026Z · period 2026-10-17–2026-10-17
20 Jul17 Oct

pypistats · 51 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-17 – 2026-10-1712026-10-20T17:20:51.8425026Z
2026-10-16 – 2026-10-1612026-10-20T17:20:51.8425026Z
2026-10-15 – 2026-10-1512026-10-20T17:20:51.8425026Z
2026-10-13 – 2026-10-1332026-10-20T17:20:51.8425026Z
2026-10-11 – 2026-10-1122026-10-20T17:20:51.8425026Z
2026-10-10 – 2026-10-1022026-10-20T17:20:51.8425026Z
2026-10-09 – 2026-10-0942026-10-20T17:20:51.8425026Z
2026-10-07 – 2026-10-0712026-10-20T17:20:51.8425026Z
2026-10-06 – 2026-10-0622026-10-20T17:20:51.8425026Z
2026-10-03 – 2026-10-0312026-10-20T17:20:51.8425026Z
2026-09-30 – 2026-09-3032026-10-20T17:20:51.8425026Z
2026-09-29 – 2026-09-2912026-10-20T17:20:51.8425026Z
2026-09-27 – 2026-09-2712026-10-20T17:20:51.8425026Z
2026-09-26 – 2026-09-2622026-10-20T17:20:51.8425026Z
2026-09-24 – 2026-09-2412026-10-20T17:20:51.8425026Z
2026-09-23 – 2026-09-2322026-10-20T17:20:51.8425026Z
2026-09-22 – 2026-09-2222026-10-20T17:20:51.8425026Z
2026-09-21 – 2026-09-2112026-10-20T17:20:51.8425026Z
2026-09-20 – 2026-09-2032026-10-20T17:20:51.8425026Z
2026-09-18 – 2026-09-1822026-10-20T17:20:51.8425026Z
2026-09-16 – 2026-09-1622026-10-20T17:20:51.8425026Z
2026-09-14 – 2026-09-1412026-10-20T17:20:51.8425026Z
2026-09-12 – 2026-09-1232026-10-20T17:20:51.8425026Z
2026-09-10 – 2026-09-1012026-10-20T17:20:51.8425026Z
2026-09-09 – 2026-09-0922026-10-20T17:20:51.8425026Z
2026-09-07 – 2026-09-0732026-10-20T17:20:51.8425026Z
2026-09-05 – 2026-09-0532026-10-20T17:20:51.8425026Z
2026-09-03 – 2026-09-0312026-10-20T17:20:51.8425026Z
2026-09-02 – 2026-09-0212026-10-20T17:20:51.8425026Z
2026-08-31 – 2026-08-3132026-10-20T17:20:51.8425026Z
2026-08-28 – 2026-08-2812026-10-20T17:20:51.8425026Z
2026-08-24 – 2026-08-2492026-10-20T17:20:51.8425026Z
2026-08-23 – 2026-08-2352026-10-20T17:20:51.8425026Z
2026-08-22 – 2026-08-2222026-10-20T17:20:51.8425026Z
2026-08-20 – 2026-08-2012026-10-20T17:20:51.8425026Z
2026-08-18 – 2026-08-18182026-10-20T17:20:51.8425026Z
2026-08-17 – 2026-08-1742026-10-20T17:20:51.8425026Z
2026-08-14 – 2026-08-1462026-10-20T17:20:51.8425026Z
2026-08-13 – 2026-08-1322026-10-20T17:20:51.8425026Z
2026-08-09 – 2026-08-0912026-10-20T17:20:51.8425026Z
2026-08-06 – 2026-08-0652026-10-20T17:20:51.8425026Z
2026-08-04 – 2026-08-0432026-10-20T17:20:51.8425026Z
2026-08-03 – 2026-08-0372026-10-20T17:20:51.8425026Z
2026-08-02 – 2026-08-0212026-10-20T17:20:51.8425026Z
2026-08-01 – 2026-08-0112026-10-20T17:20:51.8425026Z
2026-07-29 – 2026-07-29132026-10-20T17:20:51.8425026Z
2026-07-27 – 2026-07-2722026-10-20T17:20:51.8425026Z
2026-07-23 – 2026-07-2322026-10-20T17:20:51.8425026Z
2026-07-22 – 2026-07-2252026-10-20T17:20:51.8425026Z
2026-07-21 – 2026-07-2122026-10-20T17:20:51.8425026Z
2026-07-20 – 2026-07-2022026-10-20T17:20:51.8425026Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.0.15 Jul 20263

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

ACCESSIBLE
solar-helix-independent-transport/aa-freelance-tracker

Shared repository data · GitHub

License detected in repository
GPL-3.0
License branch / ref
main
Last push
6 Jul 2026
Archived
No
Contributor identities
— · partial collection

Public sponsor counts have not been collected. These signals belong to the repository owner.

Downloads & popularity

1count
Gauge · observed snapshots21 Oct 2026
10.50
2026-10-21: 1 · observed 2026-10-21T09:09:26.4108031Z
21 Oct21 Oct

github · 1 observations shown. Missing days are unknown.

View observed values
Date / source periodValueObserved at
2026-10-2112026-10-21T09:09:26.4108031Z

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:55 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:1adc594567b56303cdba6e459adf8a00e324c42246ebff51b0d3ef31c8b085c2