Metadata-Version: 2.4
Name: aa-shop
Version: 0.5.0
Summary: A public asset shop plugin for Alliance Auth.
Keywords: allianceauth,eveonline,django
Author-email: Daniel Onisoru <daniel.onisoru@gmail.com>
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.2
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
License-File: LICENSE
Requires-Dist: allianceauth>=5,<6
Requires-Dist: allianceauth-corptools>=3.2.0
Requires-Dist: django-eveuniverse>=2
Requires-Dist: markdown
Requires-Dist: requests
Requires-Dist: coverage ; extra == "test"
Requires-Dist: factory_boy ; extra == "test"
Project-URL: Changelog, https://gitlab.com/daniel.onisoru/aa-shop/-/blob/master/CHANGELOG.md
Project-URL: Homepage, https://gitlab.com/daniel.onisoru/aa-shop
Project-URL: Issues, https://gitlab.com/daniel.onisoru/aa-shop/-/issues
Project-URL: Source, https://gitlab.com/daniel.onisoru/aa-shop
Provides-Extra: test

# aa-shop

[![Discord](https://img.shields.io/discord/399006117012832262?label=AA%20Discord&logo=discord&logoColor=white)](https://discord.gg/fjnHAmk)

An [Alliance Auth](https://gitlab.com/allianceauth/allianceauth) plugin that lets auth
members run a public shop stocked automatically from their own EVE assets.

![aa-shop storefront](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/storefront-fitted.png)

## Features

**A public storefront, stocked from your assets.** Publish a shop and anyone gets a
clean, searchable storefront — no login required to browse. Stock and prices fill in
automatically from your
[allianceauth-corptools](https://pypi.org/project/allianceauth-corptools/) assets, so the
shop stays current with no manual upkeep. Unpublished shops stay private to you as a
preview until you're ready to share the link.

**Sell what you actually have:**

- **Ships** — hulls listed straight from your hangars, unlimited (build-to-order) or
  capped at what's in stock.
- **Modules, rigs, drones & implants** — auto-listed from a dedicated container or hangar.
- **Blueprint copies** — every ME / TE / runs variant listed on its own, each with its
  own price and stock.
- **Fitted ships** — mark an assembled ship in-game and it lists automatically with its
  fit reconstructed from your assets. The storefront shows the full fitting *and*
  everything that transfers with the ship (drones, fighters, fuel, ships in the
  maintenance bay), and shoppers copy an **EFT** export in one click.

**Pricing on your terms.** A fixed price, "Ask" (negotiate / contract in-game), or a live
**percentage of Jita** that refreshes on a schedule.

**Real orders, not just a catalogue.** Shoppers build a cart and send a request — logging
in with their EVE character only at checkout. You get an Alliance Auth notification (and an
optional **Discord** ping), then work the order from a back-office queue with a status
workflow and click-to-copy buyer contact.

**Personal and corporation shops.** Run a shop from your own characters, or a corp shop
sourced from corp hangar divisions (with the relevant corptools access).

**Curate the shopfront.** Feature items to pin them up top, hide what you don't want
shown, and give each shop a Markdown description.

## Screenshots

Every listing gets a detail page — and a fitted ship's page reconstructs the whole fit
from your assets, lists everything that transfers with it, and exports **EFT** in one
click:

![A fitted ship's detail page — the reconstructed fit, the "Also included" manifest, and Copy EFT](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/storefront-fitted-detail.png)

Featured items lead each section — from titans to officer modules:

![Featured hulls: Avatar, Azariel and Nyx](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/storefront-hulls.png)

![Modules: featured officer mods over a searchable grid](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/storefront-modules.png)

And the back-office, where you manage each section's listings and work incoming orders:

![Managing hull listings — stock, pricing and featuring](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/backoffice-manage-hulls.png)

![The order queue](https://gitlab.com/daniel.onisoru/aa-shop/-/raw/master/docs/img/backoffice-orders.png)

## Requirements

- Alliance Auth >= 5
- [allianceauth-corptools](https://pypi.org/project/allianceauth-corptools/) >= 3.2.0,
  installed and syncing character (and, for corp shops, corporation) assets
  (3.2.0 adds the blueprint ME/TE/runs the BPC section reads)

## Installation

1. Install into your Alliance Auth virtual environment:

   ```bash
   pip install aa-shop
   ```

2. Add `"shop"` to `INSTALLED_APPS` in your auth project's `local.py`:

   ```python
   INSTALLED_APPS += ["shop"]
   ```

3. Let the storefront serve its public pages — **required**, or anonymous visitors are
   redirected to login:

   ```python
   APPS_WITH_PUBLIC_VIEWS = ["storefront"]
   ```

4. Run migrations and collect static files, then restart your AA services:

   ```bash
   python manage.py migrate
   python manage.py collectstatic
   ```

5. **EVE universe data:** the ship and blueprint pickers read from
   [django-eveuniverse](https://gitlab.com/ErikKalkoken/django-eveuniverse), so make sure
   its data is populated (load the full EVE universe, or at least the Ship category, with
   eveuniverse's load tooling). Types that aren't loaded won't be selectable.

6. Grant the `shop.basic_access` permission (Django admin, or via groups/states) to
   members who should be able to run shops.

7. Selling **blueprint copies** additionally needs a `read_blueprints` ESI token: the
   character's `esi-characters.read_blueprints.v1` for personal shops, or a director's
   `esi-corporations.read_blueprints.v1` for corporation shops. Registering the character
   with corptools already covers the character scope.

## Scheduled tasks

Add these to your `local.py` so stock and prices stay current:

```python
from celery.schedules import crontab

# Recompute stock for every shop, hourly (ships, modules, blueprint copies).
CELERYBEAT_SCHEDULE["shop_refresh_all_stock"] = {
    "task": "shop.tasks.refresh_all_stock",
    "schedule": crontab(minute=0),
}
# Re-price anything set to a percentage of Jita, every 6 hours.
CELERYBEAT_SCHEDULE["shop_refresh_pct_prices"] = {
    "task": "shop.tasks.refresh_pct_prices",
    "schedule": crontab(minute=0, hour="*/6"),
}
```

Stock is read from your corptools assets; the hourly task also nudges corptools to pull
fresh assets first, so you don't need to tune its update rings. ESI caches assets and
blueprints for about an hour, so hourly is as often as is useful. Optional settings:
`SHOP_REFRESH_CORPTOOLS_ASSETS = False` skips the asset nudge, and `SHOP_TASKS_PRIORITY`
(1 = urgent … 9 = idle, default 7) sets the priority of these background tasks.

## Usage

Members with access get a **Shop** entry in the auth sidebar. From there you can create a
personal or corporation shop, name it and give it a short link, choose what it sells
(ships, modules, blueprint copies, fitted ships), and publish it. While a shop is
unpublished only you can see it, as a preview; once published, share its link with anyone.

Stock and prices fill in automatically from your assets on the schedule above — you just
set your pricing rules and pick which items to feature or hide.

## Support

Feedback is very welcome — if you're running aa-shop, I'd love to hear how it's going.

- **Bugs & feature requests:** [open an issue on GitLab](https://gitlab.com/daniel.onisoru/aa-shop/-/issues).
- **Questions & chat:** find the community on the
  [Alliance Auth Discord](https://discord.gg/fjnHAmk).

## License

MIT

