NEMO Bulk Upload
Plugin for NEMO (and NEMO-CE) that lets billing staff and facility managers bulk-create records from Excel or CSV using friendly names (not IDs). Staff pick a record type, drop a spreadsheet, click Check for errors, fix anything red, then click Create records.
Requires NEMO or NEMO-CE ≥ 7.3.0 and Python ≥ 3.10.
Features (v1.1)
- Tool usage (
UsageEvent) uploads: username, tool name, project / PTA, start, end, note. - Billing rates (
NEMO_billing.rates.Rate) uploads when NEMO-billing is installed: rate type, item, category, amount, effective date (for annual FY changes). Creates new dated rates; does not overwrite older ones. - Header aliases (
User→ Username,Tool→ Tool name / Item,Project/PTA→ Project / PTA). - First sheet of an
.xlsxis used (no need to rename it to "Data"). - Extra columns are warned and ignored (e.g. display Name, Charge check).
- Missing or blank Project / PTA defaults to the user's first active project, with a warning that names the PTA.
- Datetimes accept ISO text (
2026-08-10 15:30:00), Excel serials, and siteDATETIME_INPUT_FORMATS. - Create stays locked until the current file passes Check with zero errors (warnings are OK).
- Create-only: an
idcolumn is rejected. - Optional Excel / CSV template download and Download errors spreadsheet.
Install
pip install NEMO-bulk-upload
# or in Docker: NEMO_EXTRA_PIP_PACKAGES="NEMO-bulk-upload"
In site settings.py, list the plugin before NEMO so the navbar override wins:
INSTALLED_APPS = [
"NEMO_bulk_upload.apps.BulkUploadConfig", # before NEMO
"NEMO",
...
]
Then:
python manage.py migrate bulk_upload
Optional: billing rates
To enable Billing rates on the picker, install NEMO-billing and add its apps before NEMO:
pip install NEMO-billing
INSTALLED_APPS = [
"NEMO_bulk_upload.apps.BulkUploadConfig",
"NEMO_billing",
"NEMO_billing.rates",
# "NEMO_billing.invoices", # optional
"NEMO",
...
]
Without billing installed, only Tool usage appears (same as v1.0).
Permissions
Grant on the user or group (Detailed Admin → Users / Groups):
bulk_upload | Can use bulk upload— open the page and run Check / CreateNEMO | Can add usage event— required to Create tool usage rowsrates | Can add rate— required to Create billing rate rows (when NEMO-billing is installed)
Landing page icon
Detailed Admin → Landing page choices → add an entry with URL /bulk_upload/ and a 128×128 image.
Navbar
When the plugin is installed before NEMO, Bulk upload appears under Administration for users with use_bulk_upload.
Usage
Tool usage
- Open Bulk upload (
/bulk_upload/). - Choose Tool usage.
- Optionally download the Excel template (or keep using your existing workbook).
- Drop
.xlsxor.csvand click Check for errors. - Review warnings (extra columns, defaulted PTAs) and fix any red cells in Excel, then drop again.
- When Check passes, click Create records and confirm.
Billing rates (annual FY change)
One spreadsheet row creates one new Rate with an Effective date. Older rates for earlier dates stay in place for historical invoices.
| Column | Required? | Notes |
|---|---|---|
| Rate type | Yes | Tool usage, TOOL_USAGE, Consumable/Supply, Staff charge, … |
| Item | When type is item-specific | Tool, area, or consumable name (Tool / Area / Consumable aliases OK) |
| Category | When type is category-specific | e.g. Local, Industry |
| Amount | Yes | 55, 55.00, or $55 |
| Effective date | Yes | e.g. 2026-09-01 or 9/1/2026 |
| Flat / Daily / Schedule / Minimum charge / Service fee | No |
Example:
Rate type,Item,Category,Amount,Effective date,Flat
Tool usage,AIX200,Local,55.00,2026-09-01,No
Tool usage,AIX200,Industry,150.00,2026-09-01,No
Consumable/Supply,Acetone,,33.00,2026-09-01,Yes
Staff charge rates leave Item blank. Consumable rates must be Flat = Yes.
Development
./scripts/dev_reinstall.sh -n /path/to/nemo-ce
python run_tests.py
Rate tests are skipped automatically if NEMO_billing.rates is not in INSTALLED_APPS.
License
NIST public-domain statement (see LICENSE).
Metadata
Release files for NEMO-bulk-upload 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nemo_bulk_upload-1.1.0.tar.gz | 40.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nemo_bulk_upload-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 88.0 kB
Release files / nemo_bulk_upload-1.1.0.tar.gz
| Download URL | nemo_bulk_upload-1.1.0.tar.gz |
|---|---|
| Size | 40.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f4eb340eba8bf92e4795c07c8f59d8c430be13d2322e435c5531bd52aebae52
|
|
BLAKE2b-256 checksum How to use checksums |
3dde74d22a7fdcb5218f800f56cdd2bd5231fc136d95e4d154cee8b1697e48f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency logRelease files / nemo_bulk_upload-1.1.0-py3-none-any.whl
| Download URL | nemo_bulk_upload-1.1.0-py3-none-any.whl |
|---|---|
| Size | 47.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
81bfe35be6583b8fb4e7f6cc3a64830ee82e099cc21f87e3485e4b9543ab1c34
|
|
BLAKE2b-256 checksum How to use checksums |
80881bbfa14751b5696dea4f9bd083a68f627c67bba5a7fb95c8201b9b900cff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency log