diff --git a/pkgs/by-name/pr/pretix/package.nix b/pkgs/by-name/pr/pretix/package.nix new file mode 100644 index 000000000000..8fadf6b6f2c2 --- /dev/null +++ b/pkgs/by-name/pr/pretix/package.nix @@ -0,0 +1,259 @@ +{ lib +, buildNpmPackage +, fetchFromGitHub +, fetchPypi +, fetchpatch2 +, nodejs +, python3 +, gettext +}: + +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 + + (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 "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 + pythonRelaxDepsHook + 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; + } + ); + }; + + meta = with lib; { + description = "Ticketing software that cares about your event—all 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 ]; + }; +} diff --git a/pkgs/by-name/pr/pretix/plugin-build.nix b/pkgs/by-name/pr/pretix/plugin-build.nix new file mode 100644 index 000000000000..307ff4114eb7 --- /dev/null +++ b/pkgs/by-name/pr/pretix/plugin-build.nix @@ -0,0 +1,37 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + django, + gettext, +}: + +buildPythonPackage rec { + pname = "pretix-plugin-build"; + version = "1.0.1"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-iLbqcCAbeK4PyLXiebpdE27rt6bOP7eXczIG2bdvvYo="; + }; + + build-system = [ + setuptools + ]; + + dependencies = [ + django + gettext + ]; + + doCheck = false; # no tests + + meta = with lib; { + description = ""; + homepage = "https://github.com/pretix/pretix-plugin-build"; + license = licenses.asl20; + maintainers = with maintainers; [ hexa ]; + }; +} diff --git a/pkgs/by-name/pr/pretix/plugin-build.patch b/pkgs/by-name/pr/pretix/plugin-build.patch new file mode 100644 index 000000000000..aa935ed28148 --- /dev/null +++ b/pkgs/by-name/pr/pretix/plugin-build.patch @@ -0,0 +1,20 @@ +diff --git a/src/pretix/_build_settings.py b/src/pretix/_build_settings.py +index c03f56a1a..d1ea73b84 100644 +--- a/src/pretix/_build_settings.py ++++ b/src/pretix/_build_settings.py +@@ -24,6 +24,8 @@ + This file contains settings that we need at wheel require time. All settings that we only need at runtime are set + in settings.py. + """ ++from importlib_metadata import entry_points ++ + from ._base_settings import * # NOQA + + ENTROPY = { +@@ -47,3 +49,6 @@ HAS_MEMCACHED = False + HAS_CELERY = False + HAS_GEOIP = False + SENTRY_ENABLED = False ++ ++for entry_point in entry_points(group='pretix.plugin'): ++ INSTALLED_APPS.append(entry_point.module) # noqa: F405 diff --git a/pkgs/by-name/pr/pretix/plugins/default.nix b/pkgs/by-name/pr/pretix/plugins/default.nix new file mode 100644 index 000000000000..6ab380409c11 --- /dev/null +++ b/pkgs/by-name/pr/pretix/plugins/default.nix @@ -0,0 +1,6 @@ +{ callPackage +, ... +}: + +{ +}