nixpkgs/pkgs/by-name/pr/pretix/package.nix
2024-03-27 18:35:23 +01:00

271 lines
5.9 KiB
Nix

{ lib
, buildNpmPackage
, fetchFromGitHub
, fetchPypi
, fetchpatch2
, nodejs
, python3
, gettext
, nixosTests
, plugins ? [ ]
}:
let
python = python3.override {
packageOverrides = self: super: {
django = super.django_4;
stripe = super.stripe.overridePythonAttrs rec {
version = "7.9.0";
src = fetchPypi {
pname = "stripe";
inherit version;
hash = "sha256-hOXkMINaSwzU/SpXzjhTJp0ds0OREc2mtu11LjSc9KE=";
};
};
pretix-plugin-build = self.callPackage ./plugin-build.nix { };
};
};
pname = "pretix";
version = "2024.2.0";
src = fetchFromGitHub {
owner = "pretix";
repo = "pretix";
rev = "refs/tags/v${version}";
hash = "sha256-emtF5dDXEXN8GIucHbjF+m9Vkg1Jj6nmQdHhBOkXMAs=";
};
npmDeps = buildNpmPackage {
pname = "pretix-node-modules";
inherit version src;
sourceRoot = "${src.name}/src/pretix/static/npm_dir";
npmDepsHash = "sha256-kE13dcTdWZZNHPMcHEiK0a2dEcu3Z3/q815YhaVkLbQ=";
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir $out
cp -R node_modules $out/
runHook postInstall
'';
};
in
python.pkgs.buildPythonApplication rec {
inherit pname version src;
pyproject = true;
patches = [
# Discover pretix.plugin entrypoints during build and add them into
# INSTALLED_APPS, so that their static files are collected.
./plugin-build.patch
# Configure django-statici18n to compile all available languages at
# build time.
./language-build.patch
(fetchpatch2 {
# Allow customization of cache and log directory
# https://github.com/pretix/pretix/pull/3997
name = "pretix-directory-customization.patch";
url = "https://github.com/pretix/pretix/commit/e151d1d1f08917e547df49da0779b36bb73b7294.patch";
hash = "sha256-lO5eCKSqUaCwSm7rouMTFMwauWl9Tz/Yf0JE/IO+bnI=";
})
];
postPatch = ''
NODE_PREFIX=src/pretix/static.dist/node_prefix
mkdir -p $NODE_PREFIX
cp -R ${npmDeps}/node_modules $NODE_PREFIX/
chmod -R u+w $NODE_PREFIX/
# unused
sed -i "/setuptools-rust/d" pyproject.toml
substituteInPlace pyproject.toml \
--replace-fail phonenumberslite phonenumbers \
--replace-fail psycopg2-binary psycopg2 \
--replace-fail vat_moss_forked==2020.3.20.0.11.0 vat-moss \
--replace-fail "bleach==5.0.*" bleach \
--replace-fail "django-filter==23.5" django-filter \
--replace-fail "dnspython==2.5.*" dnspython \
--replace-fail "importlib_metadata==7.*" importlib_metadata \
--replace-fail "protobuf==4.25.*" protobuf \
--replace-fail "pycryptodome==3.20.*" pycryptodome \
--replace-fail "pypdf==3.9.*" pypdf \
--replace-fail "python-dateutil==2.8.*" python-dateutil \
--replace-fail "sentry-sdk==1.40.*" sentry-sdk \
--replace-fail "stripe==7.9.*" stripe
'';
build-system = with python.pkgs; [
gettext
nodejs
setuptools
tomli
];
dependencies = with python.pkgs; [
arabic-reshaper
babel
beautifulsoup4
bleach
celery
chardet
cryptography
css-inline
defusedcsv
dj-static
django
django-bootstrap3
django-compressor
django-countries
django-filter
django-formset-js-improved
django-formtools
django-hierarkey
django-hijack
django-i18nfield
django-libsass
django-localflavor
django-markup
django-oauth-toolkit
django-otp
django-phonenumber-field
django-redis
django-scopes
django-statici18n
djangorestframework
dnspython
drf-ujson2
geoip2
importlib-metadata
isoweek
jsonschema
kombu
libsass
lxml
markdown
mt-940
oauthlib
openpyxl
packaging
paypalrestsdk
paypal-checkout-serversdk
pyjwt
phonenumbers
pillow
pretix-plugin-build
protobuf
psycopg2
pycountry
pycparser
pycryptodome
pypdf
python-bidi
python-dateutil
pytz
pytz-deprecation-shim
pyuca
qrcode
redis
reportlab
requests
sentry-sdk
sepaxml
slimit
static3
stripe
text-unidecode
tlds
tqdm
vat-moss
vobject
webauthn
zeep
] ++ plugins;
optional-dependencies = with python.pkgs; {
memcached = [
pylibmc
];
};
postInstall = ''
mkdir -p $out/bin
cp ./src/manage.py $out/bin/pretix-manage
# Trim packages size
rm -rfv $out/${python.sitePackages}/pretix/static.dist/node_prefix
'';
dontStrip = true; # no binaries
nativeCheckInputs = with python.pkgs; [
pytestCheckHook
pytest-xdist
pytest-mock
pytest-django
pytest-asyncio
pytest-rerunfailures
freezegun
fakeredis
responses
] ++ lib.flatten (lib.attrValues optional-dependencies);
pytestFlagsArray = [
"--reruns" "3"
# tests fail when run before 4:30am
# https://github.com/pretix/pretix/pull/3987
"--deselect=src/tests/base/test_orders.py::PaymentReminderTests::test_sent_days"
"--deselect=src/tests/plugins/sendmail/test_rules.py::test_sendmail_rule_specified_subevent"
];
preCheck = ''
export PYTHONPATH=$(pwd)/src:$PYTHONPATH
export DJANGO_SETTINGS_MODULE=tests.settings
'';
passthru = {
inherit
npmDeps
python
;
plugins = lib.recurseIntoAttrs
(python.pkgs.callPackage ./plugins {
inherit (python.pkgs) callPackage;
}
);
tests = {
inherit (nixosTests) pretix;
};
};
meta = with lib; {
description = "Ticketing software that cares about your eventall the way";
homepage = "https://github.com/pretix/pretix";
license = with licenses; [
agpl3Only
# 3rd party components below src/pretix/static
bsd2
isc
mit
ofl # fontawesome
unlicense
# all other files below src/pretix/static and src/pretix/locale and aux scripts
asl20
];
maintainers = with maintainers; [ hexa ];
mainProgram = "pretix-manage";
platforms = platforms.linux;
};
}