diff --git a/configs/pretalx/mysql.nix b/configs/pretalx/mysql.nix index 76c8fee7..49369f3b 100644 --- a/configs/pretalx/mysql.nix +++ b/configs/pretalx/mysql.nix @@ -4,7 +4,7 @@ ... }: { services = { - pretalx.database = { + ngi-pretalx.database = { backend = "mysql"; host = "/var/run/mysqld/mysqld.sock"; }; @@ -14,11 +14,11 @@ package = pkgs.mysql; ensureUsers = [ { - name = config.services.pretalx.database.user; - ensurePermissions."${config.services.pretalx.database.name}.*" = "ALL PRIVILEGES"; + name = config.services.ngi-pretalx.database.user; + ensurePermissions."${config.services.ngi-pretalx.database.name}.*" = "ALL PRIVILEGES"; } ]; - ensureDatabases = [config.services.pretalx.database.name]; + ensureDatabases = [config.services.ngi-pretalx.database.name]; }; }; } diff --git a/configs/pretalx/postgresql.nix b/configs/pretalx/postgresql.nix index f7c14524..3d6e0cb3 100644 --- a/configs/pretalx/postgresql.nix +++ b/configs/pretalx/postgresql.nix @@ -1,17 +1,17 @@ {config, ...}: { services = { - pretalx.database.backend = "postgresql"; + ngi-pretalx.database.backend = "postgresql"; postgresql = { enable = true; authentication = "local all all trust"; ensureUsers = [ { - name = config.services.pretalx.database.user; - ensurePermissions."DATABASE \"${config.services.pretalx.database.name}\"" = "ALL PRIVILEGES"; + name = config.services.ngi-pretalx.database.user; + ensureDBOwnership = true; } ]; - ensureDatabases = [config.services.pretalx.database.name]; + ensureDatabases = [config.services.ngi-pretalx.database.name]; }; }; } diff --git a/configs/pretalx/pretalx.nix b/configs/pretalx/pretalx.nix index 0fb2dcce..48a8f290 100644 --- a/configs/pretalx/pretalx.nix +++ b/configs/pretalx/pretalx.nix @@ -31,7 +31,7 @@ }; services = { - pretalx = { + ngi-pretalx = { enable = true; package = pkgs.pretalx-full; nginx = { diff --git a/flake.lock b/flake.lock index 167c45cf..8784ec69 100644 --- a/flake.lock +++ b/flake.lock @@ -9,11 +9,11 @@ "pyproject-nix": "pyproject-nix" }, "locked": { - "lastModified": 1702457430, - "narHash": "sha256-8NQiXtYCOiC7XFayy6GPGDudCBrPROry3mfWjpdVj5g=", + "lastModified": 1712643040, + "narHash": "sha256-4vkxrZnHulJ8r6lewSr7oHjy0le66CxBRSgGr8WR3qg=", "owner": "nix-community", "repo": "dream2nix", - "rev": "262198033e23e9ee832f0cc8133d38f07598f555", + "rev": "400032c6303f82b07a09c9784ab5569a51544987", "type": "github" }, "original": { @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1694529238, - "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -44,11 +44,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1702900294, - "narHash": "sha256-pt7sSoJYNw3n8YtXw0Z/Nnr6/PfY2YrjDvqboErXnRM=", + "lastModified": 1712666087, + "narHash": "sha256-WwjUkWsjlU8iUImbivlYxNyMB1L5YVqE8QotQdL9jWc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "886c9aee6ca9324e127f9c2c4e6f68c2641c8256", + "rev": "a76c4553d7e741e17f289224eda135423de0491d", "type": "github" }, "original": { @@ -60,16 +60,16 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1700905716, - "narHash": "sha256-w1vHn2MbGfdC+CrP3xLZ3scsI06N0iQLU7eTHIVEFGw=", + "lastModified": 1712437997, + "narHash": "sha256-g0whLLwRvgO2FsyhY8fNk+TWenS3jg5UdlWL4uqgFeo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dfb95385d21475da10b63da74ae96d89ab352431", + "rev": "e38d7cb66ea4f7a0eb6681920615dfcc30fc2920", "type": "github" }, "original": { "owner": "NixOS", - "ref": "release-23.05", + "ref": "release-23.11", "repo": "nixpkgs", "type": "github" } @@ -134,11 +134,11 @@ ] }, "locked": { - "lastModified": 1708913568, - "narHash": "sha256-76PGANC2ADf0h7fe0w2nWpfdGN+bemFs2rvW2EdU/ZY=", + "lastModified": 1712628742, + "narHash": "sha256-FIAlt8mbPUs8jRuh6xpFtYzDsyHzmiLNPcen8HwvD00=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "cbdf3e5bb205ff2ca165fe661fbd6d885cbd0106", + "rev": "e7354bb9e5f68b2074e272fd5f5ac3f4848860ba", "type": "github" }, "original": { @@ -177,11 +177,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1701518298, - "narHash": "sha256-5t8yqKe0oVusV4xgfA+wW58hQJXFMmq0mmaR1gKES+Y=", + "lastModified": 1712617241, + "narHash": "sha256-a4hbls4vlLRMciv62YrYT/Xs/3Cubce8WFHPUDWwzf8=", "owner": "Mic92", "repo": "sops-nix", - "rev": "e19071f9958c8da4f4347d3d78790d97e98ba22f", + "rev": "538c114cfdf1f0458f507087b1dcf018ce1c0c4c", "type": "github" }, "original": { @@ -212,11 +212,11 @@ ] }, "locked": { - "lastModified": 1699786194, - "narHash": "sha256-3h3EH1FXQkIeAuzaWB+nK0XK54uSD46pp+dMD3gAcB4=", + "lastModified": 1711963903, + "narHash": "sha256-N3QDhoaX+paWXHbEXZapqd1r95mdshxToGowtjtYkGI=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "e82f32aa7f06bbbd56d7b12186d555223dc399d1", + "rev": "49dc4a92b02b8e68798abd99184f228243b6e3ac", "type": "github" }, "original": { diff --git a/modules/pretalx.nix b/modules/pretalx.nix index 0d10ce56..893e0117 100644 --- a/modules/pretalx.nix +++ b/modules/pretalx.nix @@ -27,12 +27,13 @@ optional escapeShellArgs generators + getExe filterAttrs filterAttrsRecursive ; - cfg = config.services.pretalx; - opt = options.services.pretalx; + cfg = config.services.ngi-pretalx; + opt = options.services.ngi-pretalx; gunicorn = pkgs.python3Packages.gunicorn; libDir = "/var/lib/pretalx"; gunicornSocketPath = "/var/run/pretalx.sock"; @@ -48,15 +49,18 @@ pretalxWrapped = pkgs.runCommand "pretalx-wrapper" - {nativeBuildInputs = [pkgs.makeWrapper pkgs.python3Packages.wrapPython];} + { + nativeBuildInputs = [pkgs.makeWrapper pkgs.python3Packages.wrapPython]; + meta.mainProgram = cfg.package.meta.mainProgram; + } '' - makeWrapper ${cfg.package}/bin/pretalx \ - $out/bin/pretalx --prefix PYTHONPATH : "${PYTHONPATH}" + makeWrapper ${getExe cfg.package} \ + $out/bin/${cfg.package.meta.mainProgram} --prefix PYTHONPATH : "${PYTHONPATH}" ''; secretRecommendation = "Consider using a secret managing scheme such as `agenix` or `sops-nix` to generate this file."; in { - options.services.pretalx = with types; { + options.services.ngi-pretalx = with types; { enable = mkEnableOption "Enable pretalx server."; package = mkPackageOption pkgs "pretalx" {}; @@ -496,7 +500,7 @@ in { }; script = '' ${exportPasswordEnv} - ${pretalxWrapped}/bin/pretalx ${command} + ${getExe pretalxWrapped} ${command} ''; }; in { @@ -526,7 +530,7 @@ in { script = '' ${exportPasswordEnv} export DJANGO_SUPERUSER_PASSWORD=$(cat ${cfg.init.admin.passwordFile}) - ${pretalxWrapped}/bin/pretalx init --noinput + ${getExe pretalxWrapped} init --noinput touch ${libDir}/init-will-not-run-again-if-this-file-exists ''; requires = ["pretalx-migrate.service"]; diff --git a/pkgs/by-name/kikit/package.nix b/pkgs/by-name/kikit/package.nix index 3456079a..b0de3c8b 100644 --- a/pkgs/by-name/kikit/package.nix +++ b/pkgs/by-name/kikit/package.nix @@ -1,8 +1,8 @@ { lib, - pcbnew-transition, pybars3, python3, + openscad, fetchFromGitHub, bats, callPackage, @@ -15,12 +15,11 @@ properCaseName = "KiKit"; - shapely = callPackage ./shapely {}; solidpython = callPackage ./solidpython {}; in python3.pkgs.buildPythonPackage rec { pname = toLower properCaseName; - version = "1.3.0"; + version = "1.5.1"; format = "setuptools"; disabled = python3.pythonOlder "3.7"; @@ -29,7 +28,7 @@ in owner = "yaqwsx"; repo = properCaseName; rev = "v${version}"; - hash = "sha256-kDTPk/R3eZtm4DjoUV4tSQzjGQ9k8MKQedX4oUXYzeo="; + hash = "sha256-iehA6FthNTJq+lDTL4eSUIIlYDJj86LMOyv/L2/ybyc="; }; propagatedBuildInputs = with python3.pkgs; @@ -41,13 +40,14 @@ in commentjson # https://github.com/yaqwsx/KiKit/issues/575 wxPython_4_2 + shapely + pcbnew-transition ] ++ [ - pcbnew-transition - shapely pybars3 # https://github.com/yaqwsx/KiKit/issues/576 solidpython + openscad ]; nativeBuildInputs = with python3.pkgs; [ diff --git a/pkgs/by-name/kikit/shapely/default.nix b/pkgs/by-name/kikit/shapely/default.nix deleted file mode 100644 index 3e9c9322..00000000 --- a/pkgs/by-name/kikit/shapely/default.nix +++ /dev/null @@ -1,78 +0,0 @@ -{ - pkgs, - lib, - stdenv, - fetchPypi, - substituteAll, - python3, -}: let - inherit - (lib) - optionals - licenses - maintainers - optionalString - ; -in - python3.pkgs.buildPythonPackage rec { - pname = "Shapely"; - version = "1.8.4"; - disabled = python3.pkgs.pythonOlder "3.6"; - - src = fetchPypi { - inherit pname version; - sha256 = "sha256-oZXlHKr6IYKR8suqP+9p/TNTyT7EtlsqRyLEz0DDGYw="; - }; - - nativeBuildInputs = with pkgs; [ - pkgs.geos # for geos-config - python3.pkgs.cython - ]; - - propagatedBuildInputs = with python3.pkgs; [ - numpy - ]; - - checkInputs = with python3.pkgs; [ - pytestCheckHook - ]; - - # Environment variable used in shapely/_buildcfg.py - GEOS_LIBRARY_PATH = "${pkgs.geos}/lib/libgeos_c${stdenv.hostPlatform.extensions.sharedLibrary}"; - - patches = [ - # Patch to search form GOES .so/.dylib files in a Nix-aware way - (substituteAll { - src = ./library-paths.patch; - libgeos_c = GEOS_LIBRARY_PATH; - libc = optionalString (!stdenv.isDarwin) "${stdenv.cc.libc}/lib/libc${stdenv.hostPlatform.extensions.sharedLibrary}.6"; - }) - ]; - - preCheck = '' - rm -r shapely # prevent import of local shapely - ''; - - disabledTests = optionals (stdenv.isDarwin && stdenv.isAarch64) [ - # FIXME(lf-): these logging tests are broken, which is definitely our - # fault. I've tried figuring out the cause and failed. - # - # It is apparently some sandbox or no-sandbox related thing on macOS only - # though. - "test_error_handler_exception" - "test_error_handler" - "test_info_handler" - ]; - - pythonImportsCheck = ["shapely"]; - - # There seems to be a regression on shapely's tests. However, kikit's tests keep passing! - doCheck = false; - - meta = { - description = "Geometric objects, predicates, and operations"; - homepage = "https://pypi.python.org/pypi/Shapely/"; - license = with licenses; [bsd3]; - maintainers = with maintainers; [knedlsepp]; - }; - } diff --git a/pkgs/by-name/kikit/shapely/library-paths.patch b/pkgs/by-name/kikit/shapely/library-paths.patch deleted file mode 100644 index d095eada..00000000 --- a/pkgs/by-name/kikit/shapely/library-paths.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/shapely/geos.py b/shapely/geos.py -index 88c5f53..1ccd6e4 100644 ---- a/shapely/geos.py -+++ b/shapely/geos.py -@@ -96,6 +96,7 @@ if sys.platform.startswith('linux'): - alt_paths = [ - 'libgeos_c.so.1', - 'libgeos_c.so', -+ '@libgeos_c@', - ] - _lgeos = load_dll('geos_c', fallbacks=alt_paths) - -@@ -160,6 +161,7 @@ elif sys.platform == 'darwin': - "/usr/local/lib/libgeos_c.dylib", - # homebrew Apple Silicon - "/opt/homebrew/lib/libgeos_c.dylib", -+ "@libgeos_c@", - ] - _lgeos = load_dll('geos_c', fallbacks=alt_paths) - -diff --git a/tests/test_dlls.py b/tests/test_dlls.py -index c71da8e..c36262c 100644 ---- a/tests/test_dlls.py -+++ b/tests/test_dlls.py -@@ -18,4 +18,5 @@ class LoadingTestCase(unittest.TestCase): - '/opt/homebrew/lib/libgeos_c.dylib', # homebrew (macOS) - os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux) - 'libgeos_c.so.1', -- 'libgeos_c.so']) -+ 'libgeos_c.so', -+ '@libgeos_c@']) diff --git a/pkgs/by-name/pcbnew-transition/package.nix b/pkgs/by-name/pcbnew-transition/package.nix deleted file mode 100644 index 5273adb6..00000000 --- a/pkgs/by-name/pcbnew-transition/package.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ - python3, - fetchPypi, - lib, -}: let - inherit - (lib) - licenses - ; - - inherit - (python3.pkgs) - buildPythonPackage - ; - - properCaseName = "pcbnewTransition"; -in - buildPythonPackage rec { - pname = properCaseName; - version = "0.3.4"; - format = "setuptools"; - - disabled = python3.pythonOlder "3.7"; - - src = fetchPypi { - inherit pname version; - hash = "sha256-3CJUG1kd63Lg0r9HpJRIvttHS5s2EuZRoxeXrqsJ/kQ="; - }; - - propagatedBuildInputs = with python3.pkgs; [ - kicad - ]; - - nativeBuildInputs = with python3.pkgs; [ - versioneer - ]; - - pythonImportsCheck = [ - properCaseName - ]; - - meta = { - description = "Library that allows you to support both, KiCAD 5 and KiCAD 6 in your plugins"; - homepage = "https://github.com/yaqwsx/pcbnewTransition"; - changelog = "https://github.com/yaqwsx/pcbnewTransition/releases/tag/v${version}"; - license = licenses.mit; - }; - } diff --git a/pkgs/by-name/pretalx-frontend/package.nix b/pkgs/by-name/pretalx-frontend/package.nix deleted file mode 100644 index 65cc7cca..00000000 --- a/pkgs/by-name/pretalx-frontend/package.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - buildNpmPackage, - pretalx, -}: -buildNpmPackage { - inherit (pretalx) version src meta; - pname = "pretalx-frontend"; - - sourceRoot = "source/src/pretalx/frontend/schedule-editor"; - - npmDepsHash = "sha256-4cnBHZ8WpHgp/bbsYYbdtrhuD6ffUAZq9ZjoLpWGfRg="; - - buildPhase = '' - runHook preBuild - - npm run build - - runHook postBuild - ''; -} diff --git a/pkgs/default.nix b/pkgs/default.nix index c5b3eaae..fe446c7a 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -13,8 +13,6 @@ #liberaforms = callPackage ./pkgs/liberaforms {}; #liberaforms-env = callPackage ./pkgs/liberaforms/env.nix {}; - pretalx = callPackage ./pretalx {}; - pretalx-frontend = callPackage ./pretalx/frontend.nix {}; pretalx-full = callPackage ./pretalx { withPlugins = [ pretalx-downstream diff --git a/pkgs/pretalx/default.nix b/pkgs/pretalx/default.nix index 6641b6e9..afa944d0 100644 --- a/pkgs/pretalx/default.nix +++ b/pkgs/pretalx/default.nix @@ -1,189 +1,20 @@ { - lib, - gettext, - python3, - fetchFromGitHub, - fetchPypi, - nixosTests, pretalx, - pretalx-frontend, - nodejs, withPlugins ? [], -}: let - inherit - (builtins) - attrValues - ; - - inherit - (lib) - flatten - licenses - maintainers - ; - - python = python3.override { - packageOverrides = self: super: { - django-formtools = super.django-formtools.overridePythonAttrs rec { - version = "2.3"; - src = fetchPypi { - inherit version; - pname = "django-formtools"; - hash = "sha256-lmO27KZHd7aNbUFC762Fl/6aaFkkZzslqoodz/TbAMM="; - }; + nixosTests, +}: +pretalx.overrideAttrs ( + finalAttrs: previousAttrs: { + propagatedBuildInputs = previousAttrs.propagatedBuildInputs ++ withPlugins; + passthru = + previousAttrs.passthru + // { + PYTHONPATH = "${pretalx.python.pkgs.makePythonPath finalAttrs.propagatedBuildInputs}:${pretalx.outPath}/${pretalx.python.sitePackages}"; + tests = + previousAttrs.passthru.tests + // { + inherit (nixosTests) pretalx; + }; }; - }; - }; -in - python.pkgs.buildPythonApplication rec { - pname = "pretalx"; - version = "2023.1.3"; - format = "pyproject"; - - src = fetchFromGitHub { - owner = pname; - repo = pname; - rev = "v${version}"; - hash = "sha256-YxmkjfftNrInIcSkK21wJXiEU6hbdDa1Od8p+HiLprs="; - }; - - outputs = ["out" "static"]; - - nativeBuildInputs = [ - gettext - nodejs - pretalx-frontend - ]; - - propagatedBuildInputs = with python.pkgs; - [ - beautifulsoup4 - bleach - celery - css-inline - csscompressor - cssutils - defusedcsv - django - django-bootstrap4 - django-compressor - django-context-decorator - django-countries - django-csp - django-filter - django-formset-js-improved - django-formtools - django-hierarkey - django-i18nfield - django-libsass - django-scopes - djangorestframework - inlinestyler - libsass - markdown - pillow - publicsuffixlist - python-dateutil - pytz - qrcode - reportlab - requests - rules - urlman - vobject - whitenoise - zxcvbn - ] - ++ withPlugins; - - passthru.optional-dependencies = with python.pkgs; { - mysql = [mysqlclient]; - postgres = [psycopg2]; - redis = [redis]; - }; - - postPatch = '' - substituteInPlace src/pretalx/common/management/commands/rebuild.py --replace \ - 'subprocess.check_call(["npm", "run", "build"], cwd=frontend_dir, env=env)' '#' - ''; - - postBuild = '' - rm -r ./src/pretalx/frontend/schedule-editor - ln -s ${pretalx-frontend}/lib/node_modules/@pretalx/schedule-editor ./src/pretalx/frontend/schedule-editor - - PYTHONPATH=$PYTHONPATH:./src python -m pretalx rebuild - ''; - - postInstall = '' - mkdir -p $out/bin - cp ./src/manage.py $out/bin/pretalx - - # The processed source files are in the static output, - # except for fonts, which are duplicated. - # See - # for more details. - find $out/${python.sitePackages}/pretalx/static \ - -mindepth 1 \ - -not -path "$out/${python.sitePackages}/pretalx/static/fonts*" \ - -delete - - mkdir -p $static - - # Copy generated static files into dedicated output. - cp -r ./src/static.dist/** $static/ - - # Copy frontend files. - cp -r ${pretalx-frontend}/lib/node_modules/@pretalx/schedule-editor/dist/* $static - ''; - - nativeCheckInputs = with python.pkgs; - [ - faker - freezegun - pytest-cov - pytest-django - pytest-mock - pytest-xdist - pytestCheckHook - responses - ] - ++ flatten (attrValues passthru.optional-dependencies); - - doCheck = true; - - preCheck = '' - export PRETALX_CONFIG_FILE="$src/src/tests/ci_sqlite.cfg" - cd src - ''; - - disabledTests = [ - # AssertionError: assert 'https://localhost' == None - "test_change_custom_domain[http://localhost-None]" - # npm run i18n:extract - "test_common_custom_makemessages_does_not_blow_up" - # Expected to perform X queries or less but Y were done - "test_schedule_export_public" - "test_schedule_frab_json_export" - "test_schedule_frab_xml_export" - ]; - - passthru = { - inherit python; - PYTHONPATH = "${python.pkgs.makePythonPath propagatedBuildInputs}:${pretalx.outPath}/${python.sitePackages}"; - - tests.pretalx = nixosTests.pretalx; - }; - - meta = { - description = "Conference planning tool: CfP, scheduling, speaker management"; - homepage = "https://github.com/pretalx/pretalx"; - license = licenses.asl20; - maintainers = with maintainers; - [ - andresnav - imincik - lorenzleutgeb - ] - ++ (with (import ../../maintainers/maintainers-list.nix); [augustebaum kubaneko]); - }; } +) diff --git a/pkgs/pretalx/frontend.nix b/pkgs/pretalx/frontend.nix deleted file mode 100644 index be17217b..00000000 --- a/pkgs/pretalx/frontend.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ - lib, - fetchFromGitHub, - buildNpmPackage, -}: let - inherit - (lib) - licenses - maintainers - ; -in - buildNpmPackage rec { - pname = "pretalx-frontend"; - version = "2023.1.0"; - - src = fetchFromGitHub { - owner = "pretalx"; - repo = "pretalx"; - rev = "v${version}"; - hash = "sha256-Few4Ojd2i0ELKWPJfkmfd3HeKFx/QK+aP5hYAHDdHeE="; - }; - - sourceRoot = "source/src/pretalx/frontend/schedule-editor"; - - npmDepsHash = "sha256-4cnBHZ8WpHgp/bbsYYbdtrhuD6ffUAZq9ZjoLpWGfRg="; - - buildPhase = '' - runHook preBuild - - npm run build - - runHook postBuild - ''; - - meta = { - description = "Conference planning tool: CfP, scheduling, speaker management"; - homepage = "https://github.com/pretalx/pretalx"; - license = licenses.asl20; - maintainers = with maintainers; [hexa]; - }; - } diff --git a/tests/pretalx/default.nix b/tests/pretalx/default.nix index 7cd3b470..dc0b1ddb 100644 --- a/tests/pretalx/default.nix +++ b/tests/pretalx/default.nix @@ -32,7 +32,7 @@ in { defaultSopsFile = ./sops/pretalx.yaml; }; - services.pretalx.site.url = mkForce "http://localhost:8000"; + services.ngi-pretalx.site.url = mkForce "http://localhost:8000"; # Use kmscon # to provide a slightly nicer console, and while we're at it, @@ -64,10 +64,10 @@ in { server.wait_for_unit("pretalx-web.service") server.wait_until_succeeds("curl --fail --connect-timeout 2 localhost", timeout=60) - server.execute("pretalx create_test_event") + server.execute("${nodes.server.services.ngi-pretalx.package.meta.mainProgram} create_test_event") # NOTE: "democon" is the slug of the event created by - # `pretalx create_test_event`. + # `pretalx-manage create_test_event`. server.succeed("curl --fail --connect-timeout 10 http://localhost/democon") ''; }