aa-fitting-mastery 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aa_fitting_mastery-0.1.0/.coveragerc +18 -0
- aa_fitting_mastery-0.1.0/.gitattributes +2 -0
- aa_fitting_mastery-0.1.0/.github/workflows/main.yml +55 -0
- aa_fitting_mastery-0.1.0/.github/workflows/publish.yml +33 -0
- aa_fitting_mastery-0.1.0/.gitignore +181 -0
- aa_fitting_mastery-0.1.0/.readthedocs.yml +19 -0
- aa_fitting_mastery-0.1.0/AGENTS.md +41 -0
- aa_fitting_mastery-0.1.0/CHANGELOG.md +25 -0
- aa_fitting_mastery-0.1.0/LICENSE +21 -0
- aa_fitting_mastery-0.1.0/Makefile +30 -0
- aa_fitting_mastery-0.1.0/PKG-INFO +304 -0
- aa_fitting_mastery-0.1.0/README.md +269 -0
- aa_fitting_mastery-0.1.0/docs/edit-fitting-skill-plans.png +0 -0
- aa_fitting_mastery-0.1.0/docs/view-character-progress.png +0 -0
- aa_fitting_mastery-0.1.0/mastery/__init__.py +7 -0
- aa_fitting_mastery-0.1.0/mastery/app_settings.py +8 -0
- aa_fitting_mastery-0.1.0/mastery/apps.py +7 -0
- aa_fitting_mastery-0.1.0/mastery/auth_hooks.py +29 -0
- aa_fitting_mastery-0.1.0/mastery/management/commands/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/mastery/management/commands/import_sde_masteries.py +69 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0001_initial.py +133 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0002_doctrineskillsetgroupmap_default_mastery_level_and_more.py +23 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0003_make_fitting_mastery_override_nullable.py +25 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0004_fittingskillcontrol_recommended_level_override.py +20 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0005_fittingskillsetmap_last_synced_at.py +17 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0006_fittingskillcontrol_is_manual.py +17 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0007_general.py +26 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/0008_summary_audience_groups.py +56 -0
- aa_fitting_mastery-0.1.0/mastery/migrations/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/mastery/models/__init__.py +11 -0
- aa_fitting_mastery-0.1.0/mastery/models/certificate_skill.py +20 -0
- aa_fitting_mastery-0.1.0/mastery/models/doctrine_skill_snapshot.py +68 -0
- aa_fitting_mastery-0.1.0/mastery/models/doctrine_skillsetgroup_map.py +29 -0
- aa_fitting_mastery-0.1.0/mastery/models/fitting_skill_control.py +58 -0
- aa_fitting_mastery-0.1.0/mastery/models/fitting_skill_override.py +27 -0
- aa_fitting_mastery-0.1.0/mastery/models/fitting_skillset_map.py +47 -0
- aa_fitting_mastery-0.1.0/mastery/models/general.py +20 -0
- aa_fitting_mastery-0.1.0/mastery/models/sde_version.py +11 -0
- aa_fitting_mastery-0.1.0/mastery/models/ship_mastery.py +11 -0
- aa_fitting_mastery-0.1.0/mastery/models/ship_mastery_certificate.py +16 -0
- aa_fitting_mastery-0.1.0/mastery/models/summary_group.py +51 -0
- aa_fitting_mastery-0.1.0/mastery/services/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/mastery/services/doctrine/__init__.py +1 -0
- aa_fitting_mastery-0.1.0/mastery/services/doctrine/doctrine_map_service.py +47 -0
- aa_fitting_mastery-0.1.0/mastery/services/doctrine/doctrine_skill_service.py +164 -0
- aa_fitting_mastery-0.1.0/mastery/services/fittings/__init__.py +2 -0
- aa_fitting_mastery-0.1.0/mastery/services/fittings/fitting_map_service.py +33 -0
- aa_fitting_mastery-0.1.0/mastery/services/fittings/skill_extractor.py +135 -0
- aa_fitting_mastery-0.1.0/mastery/services/pilots/__init__.py +5 -0
- aa_fitting_mastery-0.1.0/mastery/services/pilots/pilot_access_service.py +58 -0
- aa_fitting_mastery-0.1.0/mastery/services/pilots/pilot_progress_service.py +1025 -0
- aa_fitting_mastery-0.1.0/mastery/services/sde/__init__.py +3 -0
- aa_fitting_mastery-0.1.0/mastery/services/sde/importer.py +105 -0
- aa_fitting_mastery-0.1.0/mastery/services/sde/mastery_service.py +47 -0
- aa_fitting_mastery-0.1.0/mastery/services/sde/version_service.py +37 -0
- aa_fitting_mastery-0.1.0/mastery/services/skills/__init__.py +3 -0
- aa_fitting_mastery-0.1.0/mastery/services/skills/skill_control_service.py +114 -0
- aa_fitting_mastery-0.1.0/mastery/services/skills/skillcheck_service.py +58 -0
- aa_fitting_mastery-0.1.0/mastery/services/skills/suggestion_service.py +165 -0
- aa_fitting_mastery-0.1.0/mastery/tasks.py +29 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/base.html +48 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/doctrine_detail.html +172 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/doctrine_list.html +116 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/fitting_skills.html +315 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/index.html +313 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/ajax_messages.html +7 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/fitting_skill_preview.html +101 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/fitting_skills_editor.html +356 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/pilot_fitting_detail.html +747 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_doctrine_detail.html +92 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_fitting_detail.html +199 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_list_view.html +126 -0
- aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_settings.html +200 -0
- aa_fitting_mastery-0.1.0/mastery/templatetags/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/mastery/templatetags/skill_render.py +63 -0
- aa_fitting_mastery-0.1.0/mastery/tests/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/mastery/tests/test_auth_hooks.py +27 -0
- aa_fitting_mastery-0.1.0/mastery/tests/test_pilot_progress_service.py +167 -0
- aa_fitting_mastery-0.1.0/mastery/tests/test_services.py +616 -0
- aa_fitting_mastery-0.1.0/mastery/tests/test_tasks.py +55 -0
- aa_fitting_mastery-0.1.0/mastery/tests/test_views.py +1334 -0
- aa_fitting_mastery-0.1.0/mastery/urls.py +67 -0
- aa_fitting_mastery-0.1.0/mastery/views/__init__.py +72 -0
- aa_fitting_mastery-0.1.0/mastery/views/common.py +569 -0
- aa_fitting_mastery-0.1.0/mastery/views/deps.py +34 -0
- aa_fitting_mastery-0.1.0/mastery/views/doctrine.py +150 -0
- aa_fitting_mastery-0.1.0/mastery/views/fitting.py +499 -0
- aa_fitting_mastery-0.1.0/mastery/views/pilot.py +319 -0
- aa_fitting_mastery-0.1.0/mastery/views/summary.py +277 -0
- aa_fitting_mastery-0.1.0/mastery/views/summary_helpers.py +526 -0
- aa_fitting_mastery-0.1.0/pyproject.toml +96 -0
- aa_fitting_mastery-0.1.0/runtests.py +22 -0
- aa_fitting_mastery-0.1.0/testauth/__init__.py +1 -0
- aa_fitting_mastery-0.1.0/testauth/celery.py +42 -0
- aa_fitting_mastery-0.1.0/testauth/settings_aa4/__init__.py +0 -0
- aa_fitting_mastery-0.1.0/testauth/settings_aa4/base.py +319 -0
- aa_fitting_mastery-0.1.0/testauth/settings_aa4/local.py +91 -0
- aa_fitting_mastery-0.1.0/testauth/urls.py +12 -0
- aa_fitting_mastery-0.1.0/testauth/wsgi.py +14 -0
- aa_fitting_mastery-0.1.0/tox.ini +35 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[run]
|
|
2
|
+
branch = True
|
|
3
|
+
source = mastery
|
|
4
|
+
|
|
5
|
+
[report]
|
|
6
|
+
exclude_lines =
|
|
7
|
+
if self.debug:
|
|
8
|
+
pragma: no cover
|
|
9
|
+
raise NotImplementedError
|
|
10
|
+
if __name__ == .__main__.:
|
|
11
|
+
ignore_errors = True
|
|
12
|
+
omit =
|
|
13
|
+
setup.py
|
|
14
|
+
tests.py
|
|
15
|
+
*/test_*.py
|
|
16
|
+
*/tests/*
|
|
17
|
+
*/migrations/*
|
|
18
|
+
doc/*
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# This is a basic workflow to help you get started with Actions
|
|
2
|
+
name: CI
|
|
3
|
+
|
|
4
|
+
# Controls when the workflow will run
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches:
|
|
8
|
+
- "**"
|
|
9
|
+
tags-ignore:
|
|
10
|
+
- "**"
|
|
11
|
+
pull_request:
|
|
12
|
+
branches:
|
|
13
|
+
- "**"
|
|
14
|
+
tags-ignore:
|
|
15
|
+
- "**"
|
|
16
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
17
|
+
workflow_dispatch:
|
|
18
|
+
|
|
19
|
+
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
20
|
+
jobs:
|
|
21
|
+
test:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
strategy:
|
|
24
|
+
matrix:
|
|
25
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
- uses: shogo82148/actions-setup-redis@v1
|
|
30
|
+
with:
|
|
31
|
+
redis-version: "latest"
|
|
32
|
+
|
|
33
|
+
- run: redis-cli ping
|
|
34
|
+
|
|
35
|
+
- uses: actions/setup-python@v5
|
|
36
|
+
with:
|
|
37
|
+
python-version: ${{ matrix.python-version }}
|
|
38
|
+
|
|
39
|
+
- name: install dependencies
|
|
40
|
+
run: make dev
|
|
41
|
+
|
|
42
|
+
- name: Run Tests
|
|
43
|
+
run: make test
|
|
44
|
+
|
|
45
|
+
- name: Upload test coverage
|
|
46
|
+
if: ${{ !env.ACT }}
|
|
47
|
+
uses: actions/upload-artifact@v4
|
|
48
|
+
with:
|
|
49
|
+
# Artifact name
|
|
50
|
+
name: Python${{ matrix.python-version }} Test Coverage
|
|
51
|
+
# A file, directory or wildcard pattern that describes what to upload
|
|
52
|
+
path: htmlcov/
|
|
53
|
+
|
|
54
|
+
- name: Build Projects
|
|
55
|
+
run: make package
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Deploy to PyPi
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [released, prereleased]
|
|
6
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
release:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- uses: actions/setup-python@v4
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.11"
|
|
18
|
+
|
|
19
|
+
- name: install dependencies
|
|
20
|
+
run: make dev
|
|
21
|
+
|
|
22
|
+
- name: clean up
|
|
23
|
+
run: make clean
|
|
24
|
+
|
|
25
|
+
- name: Build Python
|
|
26
|
+
run: make package
|
|
27
|
+
|
|
28
|
+
- name: Upload Package
|
|
29
|
+
if: ${{ !env.ACT }} # Don't run in a local test environment
|
|
30
|
+
env:
|
|
31
|
+
TWINE_USERNAME: __token__
|
|
32
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
|
|
33
|
+
run: make deploy
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py,cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
|
|
110
|
+
# pdm
|
|
111
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
112
|
+
#pdm.lock
|
|
113
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
114
|
+
# in version control.
|
|
115
|
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
|
116
|
+
.pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
121
|
+
__pypackages__/
|
|
122
|
+
|
|
123
|
+
# Celery stuff
|
|
124
|
+
celerybeat-schedule
|
|
125
|
+
celerybeat.pid
|
|
126
|
+
|
|
127
|
+
# SageMath parsed files
|
|
128
|
+
*.sage.py
|
|
129
|
+
|
|
130
|
+
# Environments
|
|
131
|
+
.env
|
|
132
|
+
.venv
|
|
133
|
+
env/
|
|
134
|
+
venv/
|
|
135
|
+
ENV/
|
|
136
|
+
env.bak/
|
|
137
|
+
venv.bak/
|
|
138
|
+
|
|
139
|
+
# Spyder project settings
|
|
140
|
+
.spyderproject
|
|
141
|
+
.spyproject
|
|
142
|
+
|
|
143
|
+
# Rope project settings
|
|
144
|
+
.ropeproject
|
|
145
|
+
|
|
146
|
+
# mkdocs documentation
|
|
147
|
+
/site
|
|
148
|
+
|
|
149
|
+
# mypy
|
|
150
|
+
.mypy_cache/
|
|
151
|
+
.dmypy.json
|
|
152
|
+
dmypy.json
|
|
153
|
+
|
|
154
|
+
# Pyre type checker
|
|
155
|
+
.pyre/
|
|
156
|
+
|
|
157
|
+
# pytype static type analyzer
|
|
158
|
+
.pytype/
|
|
159
|
+
|
|
160
|
+
# Cython debug symbols
|
|
161
|
+
cython_debug/
|
|
162
|
+
|
|
163
|
+
# PyCharm
|
|
164
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
165
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
166
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
167
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
168
|
+
#.idea/
|
|
169
|
+
|
|
170
|
+
# Ruff stuff:
|
|
171
|
+
.ruff_cache/
|
|
172
|
+
|
|
173
|
+
# PyPI configuration file
|
|
174
|
+
.pypirc
|
|
175
|
+
|
|
176
|
+
# Cursor
|
|
177
|
+
# Cursor is an AI-powered code editor.`.cursorignore` specifies files/directories to
|
|
178
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
179
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
180
|
+
.cursorignore
|
|
181
|
+
.cursorindexingignore
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
build:
|
|
4
|
+
os: "ubuntu-22.04"
|
|
5
|
+
apt_packages:
|
|
6
|
+
- redis
|
|
7
|
+
tools:
|
|
8
|
+
python: "3.11"
|
|
9
|
+
|
|
10
|
+
# Build from the docs/ directory with Sphinx
|
|
11
|
+
sphinx:
|
|
12
|
+
configuration: docs/conf.py
|
|
13
|
+
|
|
14
|
+
# Explicitly set the version of Python and its requirements
|
|
15
|
+
python:
|
|
16
|
+
install:
|
|
17
|
+
- method: pip
|
|
18
|
+
path: .
|
|
19
|
+
- requirements: docs/requirements.txt
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Scope and mental model
|
|
4
|
+
- This file is for work in `working/aa-fitting-mastery/` only. Treat other plugins as external dependencies unless a task explicitly crosses repo boundaries.
|
|
5
|
+
- `aa-fitting-mastery` is a Django app for Alliance Auth that bridges `fittings` and `memberaudit`: it turns doctrines/fittings into `SkillSetGroup` + `SkillSet` data, then augments them with EVE SDE masteries/certificates.
|
|
6
|
+
- The core flow is: doctrine -> doctrine map -> fitting map -> extracted required skills -> recommended mastery skills -> optional blacklist/suggestions.
|
|
7
|
+
|
|
8
|
+
## Read these files first
|
|
9
|
+
- Start with `README.md`, `pyproject.toml`, and `mastery/apps.py` for package identity and hard dependencies.
|
|
10
|
+
- Read `mastery/urls.py`, `mastery/views.py`, and `mastery/api.py` to see the actual UI/API surface.
|
|
11
|
+
- For the main business logic, read `mastery/services/doctrine/doctrine_map_service.py` and `mastery/services/doctrine/doctrine_skill_service.py`.
|
|
12
|
+
- Then read `mastery/services/fittings/skill_extractor.py`, `mastery/services/sde/mastery_service.py`, and `mastery/services/skills/{skill_control_service.py,suggestion_service.py}`.
|
|
13
|
+
- Use `mastery/models/` and `mastery/migrations/` as the source of truth for persistence shape.
|
|
14
|
+
|
|
15
|
+
## Architecture and data flow you should preserve
|
|
16
|
+
- `DoctrineMapService.create_doctrine_map()` creates one `memberaudit.SkillSetGroup` per `fittings.Doctrine`, stores it in `DoctrineSkillSetGroupMap`, then immediately calls `sync()`.
|
|
17
|
+
- `FittingMapService.create_fitting_map()` creates one `memberaudit.SkillSet` per `fittings.Fitting`, attaches it to the doctrine’s skillset group, and stores the mapping in `FittingSkillsetMap`.
|
|
18
|
+
- `DoctrineSkillService.generate_for_doctrine()` is the core orchestrator: it reads doctrine fittings, extracts hard requirements from `eve_sde.TypeDogma`, merges them with mastery recommendations from imported SDE data, wipes existing `skillset.skills`, bulk-creates new `SkillSetSkill` rows, then records suggestions in `FittingSkillControl`.
|
|
19
|
+
- Blacklist state is stored in `FittingSkillControl.is_blacklisted`; suggestion metadata also lives in `FittingSkillControl`, not in transient view state.
|
|
20
|
+
- `DoctrineSkillSnapshot` exists as persisted snapshot data for doctrine/fitting/skill combinations; inspect current usage before changing or deleting it.
|
|
21
|
+
|
|
22
|
+
## Project-specific conventions
|
|
23
|
+
- Views in `mastery/views.py` are thin and instantiate service objects at module scope. Preserve that pattern unless you have a strong reason to change initialization behavior.
|
|
24
|
+
- This plugin uses service classes, not fat models, for most business logic. New behavior usually belongs under `mastery/services/`, not directly in views/API handlers.
|
|
25
|
+
- Data creation is intentionally idempotent-ish: `filter().first()`, `create()`, and `update_or_create()` are used heavily to avoid duplicate maps/control rows.
|
|
26
|
+
- `mastery/api.py` is minimal right now: `toggle_blacklist` is the real mutating endpoint; `update_skill_level` currently parses JSON and returns `{"status": "ok"}` without persistence.
|
|
27
|
+
- `auth_hooks.py` is the navigation/URL integration point: menu entry uses `mastery.basic_access`, while management screens require `mastery.manage_fittings`.
|
|
28
|
+
- `character_portrait_url` does not reliably support arbitrary sizes (e.g. 24). Use supported portrait sizes in templates (this plugin standardises on `32`).
|
|
29
|
+
|
|
30
|
+
## External dependencies and integration points
|
|
31
|
+
- Hard package dependencies are declared in `pyproject.toml`: `allianceauth`, `aa-memberaudit`, `fittings`, `allianceauth-app-utils`, `django-esi`, and `django-eveonline-sde`.
|
|
32
|
+
- `skill_extractor.py` depends on `eve_sde` dogma attributes for skill requirements; changes there can alter every generated skillset.
|
|
33
|
+
- SDE mastery recommendations are imported from CCP static data by `mastery/services/sde/importer.py` and exposed through `MasteryService.get_ship_skills()`.
|
|
34
|
+
- If a task touches installation/runtime integration, check `working/myauth/myauth/settings/local.py`: this workspace already enables `'mastery'` and schedules `mastery.tasks.import_sde_masteries` under `CELERYBEAT_SCHEDULE['update_sde_masteries']`.
|
|
35
|
+
|
|
36
|
+
## Testing and developer workflow
|
|
37
|
+
- `Makefile` assumes an active virtualenv; `make dev` installs editable mode and `make test` runs `tox`.
|
|
38
|
+
- `tox.ini` expects `testauth.settings_aa4.local` and `runtests.py`; keep those files in sync when changing test setup.
|
|
39
|
+
- For real validation, prefer focused checks in the integrated AA instance or targeted Django shell/management-command smoke tests over guessing from `tox.ini`.
|
|
40
|
+
- If you change SDE import logic, validate both the management command `python manage.py import_sde_masteries --dry-run` and the Celery task path in `mastery/tasks.py`.
|
|
41
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|
6
|
+
and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
7
|
+
|
|
8
|
+
## [Unreleased] - yyyy-mm-dd
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Nothing yet.
|
|
13
|
+
|
|
14
|
+
## [0.1.0] - 2026-04-15
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Initial public release of the Fitting Mastery plugin for Alliance Auth.
|
|
19
|
+
- Doctrine skill plan generation based on `fittings` doctrines and fittings.
|
|
20
|
+
- Mastery recommendation merge using imported EVE SDE certificates/masteries.
|
|
21
|
+
- Pilot-facing readiness views and skill plan export helpers.
|
|
22
|
+
- Summary/audience views to review readiness across selected member scopes.
|
|
23
|
+
- Skill control tooling: blacklist, manual skill overrides, and recommendation overrides.
|
|
24
|
+
- SDE import tooling with management command (`import_sde_masteries`) and Celery update task (`update_sde_masteries`).
|
|
25
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jay's
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
.PHONY: help clean dev package test deploy
|
|
2
|
+
|
|
3
|
+
help:
|
|
4
|
+
@echo "This project assumes that an active Python virtualenv is present."
|
|
5
|
+
@echo "The following make targets are available:"
|
|
6
|
+
@echo " dev install all deps for dev environment"
|
|
7
|
+
@echo " clean remove all old packages"
|
|
8
|
+
@echo " test run tests"
|
|
9
|
+
@echo " package build the python package"
|
|
10
|
+
@echo " deploy Configure the PyPi config file in CI"
|
|
11
|
+
|
|
12
|
+
clean:
|
|
13
|
+
rm -rf dist/*
|
|
14
|
+
|
|
15
|
+
dev:
|
|
16
|
+
pip install --upgrade pip
|
|
17
|
+
pip install wheel -U
|
|
18
|
+
pip install tox -U
|
|
19
|
+
pip install -e .
|
|
20
|
+
|
|
21
|
+
test:
|
|
22
|
+
tox
|
|
23
|
+
|
|
24
|
+
deploy:
|
|
25
|
+
pip install twine
|
|
26
|
+
twine upload dist/*
|
|
27
|
+
|
|
28
|
+
package:
|
|
29
|
+
pip install flit
|
|
30
|
+
flit build
|