python3.pkgs.ihatemoney: remove
sqlalchemy and flask releases break ihatemoney faster than upstream updates, so the maintenance burden increases over time.
This commit is contained in:
parent
85b081528b
commit
3cc8b4477e
12 changed files with 2 additions and 479 deletions
|
@ -1165,7 +1165,6 @@
|
||||||
./services/web-apps/hledger-web.nix
|
./services/web-apps/hledger-web.nix
|
||||||
./services/web-apps/icingaweb2/icingaweb2.nix
|
./services/web-apps/icingaweb2/icingaweb2.nix
|
||||||
./services/web-apps/icingaweb2/module-monitoring.nix
|
./services/web-apps/icingaweb2/module-monitoring.nix
|
||||||
./services/web-apps/ihatemoney
|
|
||||||
./services/web-apps/invidious.nix
|
./services/web-apps/invidious.nix
|
||||||
./services/web-apps/invoiceplane.nix
|
./services/web-apps/invoiceplane.nix
|
||||||
./services/web-apps/isso.nix
|
./services/web-apps/isso.nix
|
||||||
|
|
|
@ -58,6 +58,7 @@ with lib;
|
||||||
(mkRemovedOptionModule [ "services" "fourStoreEndpoint" ] "The fourStoreEndpoint module has been removed")
|
(mkRemovedOptionModule [ "services" "fourStoreEndpoint" ] "The fourStoreEndpoint module has been removed")
|
||||||
(mkRemovedOptionModule [ "services" "fprot" ] "The corresponding package was removed from nixpkgs.")
|
(mkRemovedOptionModule [ "services" "fprot" ] "The corresponding package was removed from nixpkgs.")
|
||||||
(mkRemovedOptionModule [ "services" "frab" ] "The frab module has been removed")
|
(mkRemovedOptionModule [ "services" "frab" ] "The frab module has been removed")
|
||||||
|
(mkRemovedOptionModule [ "services" "ihatemoney" ] "The ihatemoney module has been removed for lack of downstream maintainer")
|
||||||
(mkRemovedOptionModule [ "services" "kippo" ] "The corresponding package was removed from nixpkgs.")
|
(mkRemovedOptionModule [ "services" "kippo" ] "The corresponding package was removed from nixpkgs.")
|
||||||
(mkRemovedOptionModule [ "services" "mailpile" ] "The corresponding package was removed from nixpkgs.")
|
(mkRemovedOptionModule [ "services" "mailpile" ] "The corresponding package was removed from nixpkgs.")
|
||||||
(mkRemovedOptionModule [ "services" "marathon" ] "The corresponding package was removed from nixpkgs.")
|
(mkRemovedOptionModule [ "services" "marathon" ] "The corresponding package was removed from nixpkgs.")
|
||||||
|
|
|
@ -1,153 +0,0 @@
|
||||||
{ config, pkgs, lib, ... }:
|
|
||||||
with lib;
|
|
||||||
let
|
|
||||||
cfg = config.services.ihatemoney;
|
|
||||||
user = "ihatemoney";
|
|
||||||
group = "ihatemoney";
|
|
||||||
db = "ihatemoney";
|
|
||||||
python3 = config.services.uwsgi.package.python3;
|
|
||||||
pkg = python3.pkgs.ihatemoney;
|
|
||||||
toBool = x: if x then "True" else "False";
|
|
||||||
configFile = pkgs.writeText "ihatemoney.cfg" ''
|
|
||||||
from secrets import token_hex
|
|
||||||
# load a persistent secret key
|
|
||||||
SECRET_KEY_FILE = "/var/lib/ihatemoney/secret_key"
|
|
||||||
SECRET_KEY = ""
|
|
||||||
try:
|
|
||||||
with open(SECRET_KEY_FILE) as f:
|
|
||||||
SECRET_KEY = f.read()
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
if not SECRET_KEY:
|
|
||||||
print("ihatemoney: generating a new secret key")
|
|
||||||
SECRET_KEY = token_hex(50)
|
|
||||||
with open(SECRET_KEY_FILE, "w") as f:
|
|
||||||
f.write(SECRET_KEY)
|
|
||||||
del token_hex
|
|
||||||
del SECRET_KEY_FILE
|
|
||||||
|
|
||||||
# "normal" configuration
|
|
||||||
DEBUG = False
|
|
||||||
SQLALCHEMY_DATABASE_URI = '${
|
|
||||||
if cfg.backend == "sqlite"
|
|
||||||
then "sqlite:////var/lib/ihatemoney/ihatemoney.sqlite"
|
|
||||||
else "postgresql:///${db}"}'
|
|
||||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
|
||||||
MAIL_DEFAULT_SENDER = (r"${cfg.defaultSender.name}", r"${cfg.defaultSender.email}")
|
|
||||||
ACTIVATE_DEMO_PROJECT = ${toBool cfg.enableDemoProject}
|
|
||||||
ADMIN_PASSWORD = r"${toString cfg.adminHashedPassword /*toString null == ""*/}"
|
|
||||||
ALLOW_PUBLIC_PROJECT_CREATION = ${toBool cfg.enablePublicProjectCreation}
|
|
||||||
ACTIVATE_ADMIN_DASHBOARD = ${toBool cfg.enableAdminDashboard}
|
|
||||||
SESSION_COOKIE_SECURE = ${toBool cfg.secureCookie}
|
|
||||||
ENABLE_CAPTCHA = ${toBool cfg.enableCaptcha}
|
|
||||||
LEGAL_LINK = r"${toString cfg.legalLink}"
|
|
||||||
|
|
||||||
${cfg.extraConfig}
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.services.ihatemoney = {
|
|
||||||
enable = mkEnableOption (lib.mdDoc "ihatemoney webapp. Note that this will set uwsgi to emperor mode");
|
|
||||||
backend = mkOption {
|
|
||||||
type = types.enum [ "sqlite" "postgresql" ];
|
|
||||||
default = "sqlite";
|
|
||||||
description = lib.mdDoc ''
|
|
||||||
The database engine to use for ihatemoney.
|
|
||||||
If `postgresql` is selected, then a database called
|
|
||||||
`${db}` will be created. If you disable this option,
|
|
||||||
it will however not be removed.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
adminHashedPassword = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
description = lib.mdDoc "The hashed password of the administrator. To obtain it, run `ihatemoney generate_password_hash`";
|
|
||||||
};
|
|
||||||
uwsgiConfig = mkOption {
|
|
||||||
type = types.attrs;
|
|
||||||
example = {
|
|
||||||
http = ":8000";
|
|
||||||
};
|
|
||||||
description = lib.mdDoc "Additional configuration of the UWSGI vassal running ihatemoney. It should notably specify on which interfaces and ports the vassal should listen.";
|
|
||||||
};
|
|
||||||
defaultSender = {
|
|
||||||
name = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "Budget manager";
|
|
||||||
description = lib.mdDoc "The display name of the sender of ihatemoney emails";
|
|
||||||
};
|
|
||||||
email = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "ihatemoney@${config.networking.hostName}";
|
|
||||||
defaultText = literalExpression ''"ihatemoney@''${config.networking.hostName}"'';
|
|
||||||
description = lib.mdDoc "The email of the sender of ihatemoney emails";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
secureCookie = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = lib.mdDoc "Use secure cookies. Disable this when ihatemoney is served via http instead of https";
|
|
||||||
};
|
|
||||||
enableDemoProject = mkEnableOption (lib.mdDoc "access to the demo project in ihatemoney");
|
|
||||||
enablePublicProjectCreation = mkEnableOption (lib.mdDoc "permission to create projects in ihatemoney by anyone");
|
|
||||||
enableAdminDashboard = mkEnableOption (lib.mdDoc "ihatemoney admin dashboard");
|
|
||||||
enableCaptcha = mkEnableOption (lib.mdDoc "a simplistic captcha for some forms");
|
|
||||||
legalLink = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
description = lib.mdDoc "The URL to a page explaining legal statements about your service, eg. GDPR-related information.";
|
|
||||||
};
|
|
||||||
extraConfig = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "";
|
|
||||||
description = lib.mdDoc "Extra configuration appended to ihatemoney's configuration file. It is a python file, so pay attention to indentation.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
services.postgresql = mkIf (cfg.backend == "postgresql") {
|
|
||||||
enable = true;
|
|
||||||
ensureDatabases = [ db ];
|
|
||||||
ensureUsers = [ {
|
|
||||||
name = user;
|
|
||||||
ensurePermissions = {
|
|
||||||
"DATABASE ${db}" = "ALL PRIVILEGES";
|
|
||||||
};
|
|
||||||
} ];
|
|
||||||
};
|
|
||||||
systemd.services.postgresql = mkIf (cfg.backend == "postgresql") {
|
|
||||||
wantedBy = [ "uwsgi.service" ];
|
|
||||||
before = [ "uwsgi.service" ];
|
|
||||||
};
|
|
||||||
systemd.tmpfiles.rules = [
|
|
||||||
"d /var/lib/ihatemoney 770 ${user} ${group}"
|
|
||||||
];
|
|
||||||
users = {
|
|
||||||
users.${user} = {
|
|
||||||
isSystemUser = true;
|
|
||||||
inherit group;
|
|
||||||
};
|
|
||||||
groups.${group} = {};
|
|
||||||
};
|
|
||||||
services.uwsgi = {
|
|
||||||
enable = true;
|
|
||||||
plugins = [ "python3" ];
|
|
||||||
instance = {
|
|
||||||
type = "emperor";
|
|
||||||
vassals.ihatemoney = {
|
|
||||||
type = "normal";
|
|
||||||
strict = true;
|
|
||||||
immediate-uid = user;
|
|
||||||
immediate-gid = group;
|
|
||||||
# apparently flask uses threads: https://github.com/spiral-project/ihatemoney/commit/c7815e48781b6d3a457eaff1808d179402558f8c
|
|
||||||
enable-threads = true;
|
|
||||||
module = "wsgi:application";
|
|
||||||
chdir = "${pkg}/${pkg.pythonModule.sitePackages}/ihatemoney";
|
|
||||||
env = [ "IHATEMONEY_SETTINGS_FILE_PATH=${configFile}" ];
|
|
||||||
pythonPackages = self: [ self.ihatemoney ];
|
|
||||||
} // cfg.uwsgiConfig;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -310,7 +310,6 @@ in {
|
||||||
i3wm = handleTest ./i3wm.nix {};
|
i3wm = handleTest ./i3wm.nix {};
|
||||||
icingaweb2 = handleTest ./icingaweb2.nix {};
|
icingaweb2 = handleTest ./icingaweb2.nix {};
|
||||||
iftop = handleTest ./iftop.nix {};
|
iftop = handleTest ./iftop.nix {};
|
||||||
ihatemoney = handleTest ./ihatemoney {};
|
|
||||||
incron = handleTest ./incron.nix {};
|
incron = handleTest ./incron.nix {};
|
||||||
influxdb = handleTest ./influxdb.nix {};
|
influxdb = handleTest ./influxdb.nix {};
|
||||||
initrd-network-openvpn = handleTest ./initrd-network-openvpn {};
|
initrd-network-openvpn = handleTest ./initrd-network-openvpn {};
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
{ system ? builtins.currentSystem,
|
|
||||||
config ? {},
|
|
||||||
pkgs ? import ../../.. { inherit system config; }
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (import ../../lib/testing-python.nix { inherit system pkgs; }) makeTest;
|
|
||||||
f = backend: makeTest {
|
|
||||||
name = "ihatemoney-${backend}";
|
|
||||||
nodes.machine = { nodes, lib, ... }: {
|
|
||||||
services.ihatemoney = {
|
|
||||||
enable = true;
|
|
||||||
enablePublicProjectCreation = true;
|
|
||||||
secureCookie = false;
|
|
||||||
inherit backend;
|
|
||||||
uwsgiConfig = {
|
|
||||||
http = ":8000";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
boot.tmp.cleanOnBoot = true;
|
|
||||||
# for exchange rates
|
|
||||||
security.pki.certificateFiles = [ ./server.crt ];
|
|
||||||
networking.extraHosts = "127.0.0.1 api.exchangerate.host";
|
|
||||||
services.nginx = {
|
|
||||||
enable = true;
|
|
||||||
virtualHosts."api.exchangerate.host" = {
|
|
||||||
addSSL = true;
|
|
||||||
# openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 1000000 -nodes -subj '/CN=api.exchangerate.host'
|
|
||||||
sslCertificate = ./server.crt;
|
|
||||||
sslCertificateKey = ./server.key;
|
|
||||||
locations."/".return = "200 '${builtins.readFile ./rates.json}'";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
# ihatemoney needs a local smtp server otherwise project creation just crashes
|
|
||||||
services.postfix.enable = true;
|
|
||||||
};
|
|
||||||
testScript = ''
|
|
||||||
machine.wait_for_open_port(8000)
|
|
||||||
machine.wait_for_unit("uwsgi.service")
|
|
||||||
machine.wait_until_succeeds("curl --fail https://api.exchangerate.host")
|
|
||||||
machine.wait_until_succeeds("curl --fail http://localhost:8000")
|
|
||||||
|
|
||||||
result = machine.succeed(
|
|
||||||
"curl --fail -X POST http://localhost:8000/api/projects -d 'name=yay&id=yay&password=yay&contact_email=yay@example.com&default_currency=XXX'"
|
|
||||||
)
|
|
||||||
assert '"yay"' in result, repr(result)
|
|
||||||
owner, timestamp = machine.succeed(
|
|
||||||
"stat --printf %U:%G___%Y /var/lib/ihatemoney/secret_key"
|
|
||||||
).split("___")
|
|
||||||
assert "ihatemoney:ihatemoney" == owner
|
|
||||||
|
|
||||||
with subtest("Restart machine and service"):
|
|
||||||
machine.shutdown()
|
|
||||||
machine.start()
|
|
||||||
machine.wait_for_open_port(8000)
|
|
||||||
machine.wait_for_unit("uwsgi.service")
|
|
||||||
|
|
||||||
with subtest("check that the database is really persistent"):
|
|
||||||
machine.succeed("curl --fail --basic -u yay:yay http://localhost:8000/api/projects/yay")
|
|
||||||
|
|
||||||
with subtest("check that the secret key is really persistent"):
|
|
||||||
timestamp2 = machine.succeed("stat --printf %Y /var/lib/ihatemoney/secret_key")
|
|
||||||
assert timestamp == timestamp2
|
|
||||||
|
|
||||||
assert "ihatemoney" in machine.succeed("curl --fail http://localhost:8000")
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
ihatemoney-sqlite = f "sqlite";
|
|
||||||
ihatemoney-postgresql = f "postgresql";
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
{
|
|
||||||
"rates": {
|
|
||||||
"CAD": 1.3420055134,
|
|
||||||
"HKD": 7.7513783598,
|
|
||||||
"ISK": 135.9407305307,
|
|
||||||
"PHP": 49.3762922123,
|
|
||||||
"DKK": 6.4126464507,
|
|
||||||
"HUF": 298.9145416954,
|
|
||||||
"CZK": 22.6292212267,
|
|
||||||
"GBP": 0.7838128877,
|
|
||||||
"RON": 4.1630771881,
|
|
||||||
"SEK": 8.8464851826,
|
|
||||||
"IDR": 14629.5658166782,
|
|
||||||
"INR": 74.8328738801,
|
|
||||||
"BRL": 5.2357856651,
|
|
||||||
"RUB": 71.8416609235,
|
|
||||||
"HRK": 6.4757064094,
|
|
||||||
"JPY": 106.2715368711,
|
|
||||||
"THB": 31.7203652653,
|
|
||||||
"CHF": 0.9243625086,
|
|
||||||
"EUR": 0.8614748449,
|
|
||||||
"MYR": 4.2644727774,
|
|
||||||
"BGN": 1.6848725017,
|
|
||||||
"TRY": 6.8483804273,
|
|
||||||
"CNY": 7.0169710544,
|
|
||||||
"NOK": 9.213731909,
|
|
||||||
"NZD": 1.5080978635,
|
|
||||||
"ZAR": 16.7427636113,
|
|
||||||
"USD": 1,
|
|
||||||
"MXN": 22.4676085458,
|
|
||||||
"SGD": 1.3855099931,
|
|
||||||
"AUD": 1.4107512061,
|
|
||||||
"ILS": 3.4150585803,
|
|
||||||
"KRW": 1203.3339076499,
|
|
||||||
"PLN": 3.794452102
|
|
||||||
},
|
|
||||||
"base": "USD",
|
|
||||||
"date": "2020-07-24"
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEvjCCAqYCCQDkTQrENPCZjjANBgkqhkiG9w0BAQsFADAgMR4wHAYDVQQDDBVh
|
|
||||||
cGkuZXhjaGFuZ2VyYXRlLmhvc3QwIBcNMjEwNzE0MTI1MzQ0WhgPNDc1OTA2MTEx
|
|
||||||
MjUzNDRaMCAxHjAcBgNVBAMMFWFwaS5leGNoYW5nZXJhdGUuaG9zdDCCAiIwDQYJ
|
|
||||||
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL5zpwUYa/ySqvJ/PUnXYsl1ww5SNGJh
|
|
||||||
NujCRxC0Gw+5t5O7USSHRdz7Eb2PNFMa7JR+lliLAWdjHfqPXJWmP10X5ebvyxeQ
|
|
||||||
TJkR1HpDSY6TQQlJvwr/JNGryyoQYjXvnyeyVu4TS3U0TTI631OonDAj+HbFIs9L
|
|
||||||
gr/HfHzFmxRVLwaJ7hebanihc5RzoWTxgswiOwYQu5AivXQqcvUIxELeT7CxWwiw
|
|
||||||
be/SlalDgoezB/poqaa215FUuN2av+nTn+swH3WOi9kwePLgVKn9BnDMwyh8et13
|
|
||||||
yt27RWCSOcZagRSYsSbBaEJbClZvnuYvDqooJEy0GVbGBZpClKRKe92yd0PTf3ZJ
|
|
||||||
GupyNoCFQlGugY//WLrsPv/Q4WwP+qZ6t97sV0CdM+epKVde/LfPKn+tFMv86qIg
|
|
||||||
Q/uGHdDwUI8XH2EysAavhdlssSrovmpl4hyo9UkzTWfJgAbmOZY3Vba41wsq12FT
|
|
||||||
usDsswGLBD10MdXWltR/Hdk8OnosLmeJxfZODAv31KSfd+4b6Ntr9BYQvAQSO+1/
|
|
||||||
Mf7gEQtNhO003VKIyV5cpH4kVQieEcvoEKgq32NVBSKVf6UIPWIefu19kvrttaUu
|
|
||||||
Q2QW2Qm4Ph/4cWpxl0jcrN5rjmgaBtIMmKYjRIS0ThDWzfVkJdmJuATzExJAplLN
|
|
||||||
nYPBG3gOtQQpAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAJzt/aN7wl88WrvBasVi
|
|
||||||
fSJmJjRaW2rYyBUMptQNkm9ElHN2eQQxJgLi8+9ArQxuGKhHx+D1wMGF8w2yOp0j
|
|
||||||
4atfbXDcT+cTQY55qdEeYgU8KhESHHGszGsUpv7hzU2cACZiXG0YbOmORFYcn49Z
|
|
||||||
yPyN98kW8BViLzNF9v+I/NJPuaaCeWKjXCqY2GCzddiuotrlLtz0CODXZJ506I1F
|
|
||||||
38vQgZb10yAe6+R4y0BK7sUlmfr9BBqVcDQ/z74Kph1aB32zwP8KrNitwG1Tyk6W
|
|
||||||
rxD1dStEQyX8uDPAspe2JrToMWsOMje9F5lotmuzyvwRJYfAav300EtIggBqpiHR
|
|
||||||
o0P/1xxBzmaCHxEUJegdoYg8Q27llqsjR2T78uv/BlxpX9Dv5kNex5EZThKqyz4a
|
|
||||||
Fn1VqiA3D9IsvxH4ud+8eDaP24u1yYObSTDIBsw9xDvoV8fV+NWoNNhcAL5GwC0P
|
|
||||||
Goh7/brZSHUprxGpwRB524E//8XmCsRd/+ShtXbi4gEODMH4xLdkD7fZIJC4eG1H
|
|
||||||
GOVc1MwjiYvbQlPs6MOcQ0iKQneSlaEJmyyO5Ro5OKiKj89Az/mLYX3R17AIsu0T
|
|
||||||
Q5pGcmhKVRyu0zXvkGfK352TLwoe+4vbmakDq21Pkkcy8V9M4wP+vpCfQkg1REQ1
|
|
||||||
+mr1Vg+SFya3mlCxpFTy3j8E
|
|
||||||
-----END CERTIFICATE-----
|
|
|
@ -1,52 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
NaEkKVO0D0jFtk37s/YqJpCsXg/B7yc=
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,129 +0,0 @@
|
||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, pythonOlder
|
|
||||||
, nixosTests
|
|
||||||
, fetchPypi
|
|
||||||
, alembic
|
|
||||||
, aniso8601
|
|
||||||
, babel
|
|
||||||
, blinker
|
|
||||||
, cachetools
|
|
||||||
, click
|
|
||||||
, dnspython
|
|
||||||
, email-validator
|
|
||||||
, flask
|
|
||||||
, flask-babel
|
|
||||||
, flask-cors
|
|
||||||
, flask_mail
|
|
||||||
, flask_migrate
|
|
||||||
, flask-restful
|
|
||||||
, flask-talisman
|
|
||||||
, flask-wtf
|
|
||||||
, debts
|
|
||||||
, idna
|
|
||||||
, itsdangerous
|
|
||||||
, jinja2
|
|
||||||
, mako
|
|
||||||
, markupsafe
|
|
||||||
, python-dateutil
|
|
||||||
, pytz
|
|
||||||
, requests
|
|
||||||
, sqlalchemy
|
|
||||||
, sqlalchemy-utils
|
|
||||||
, sqlalchemy-continuum
|
|
||||||
, sqlalchemy-i18n
|
|
||||||
, werkzeug
|
|
||||||
, wtforms
|
|
||||||
, psycopg2 # optional, for postgresql support
|
|
||||||
, flask-testing
|
|
||||||
, pytestCheckHook
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "ihatemoney";
|
|
||||||
version = "5.2.0";
|
|
||||||
format = "setuptools";
|
|
||||||
|
|
||||||
disabled = pythonOlder "3.7";
|
|
||||||
|
|
||||||
src = fetchPypi {
|
|
||||||
inherit pname version;
|
|
||||||
hash = "sha256-uQgZBbpqqbZYHpR+GwHWX0c7di2rVvEz0jPRY6+BkkQ=";
|
|
||||||
};
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
aniso8601
|
|
||||||
babel
|
|
||||||
blinker
|
|
||||||
cachetools
|
|
||||||
click
|
|
||||||
debts
|
|
||||||
dnspython
|
|
||||||
email-validator
|
|
||||||
flask
|
|
||||||
flask_mail
|
|
||||||
flask_migrate
|
|
||||||
flask-wtf
|
|
||||||
flask-babel
|
|
||||||
flask-cors
|
|
||||||
flask-restful
|
|
||||||
flask-talisman
|
|
||||||
idna
|
|
||||||
itsdangerous
|
|
||||||
jinja2
|
|
||||||
mako
|
|
||||||
markupsafe
|
|
||||||
psycopg2
|
|
||||||
python-dateutil
|
|
||||||
pytz
|
|
||||||
requests
|
|
||||||
sqlalchemy
|
|
||||||
sqlalchemy-continuum
|
|
||||||
werkzeug
|
|
||||||
wtforms
|
|
||||||
];
|
|
||||||
|
|
||||||
postPatch = ''
|
|
||||||
substituteInPlace setup.cfg \
|
|
||||||
--replace "cachetools>=4.1,<5" "cachetools>=4.1" \
|
|
||||||
--replace "SQLAlchemy>=1.3.0,<1.4" "SQLAlchemy>=1.3.0,<1.5" \
|
|
||||||
--replace "WTForms>=2.3.1,<3.1" "WTForms"
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeCheckInputs = [
|
|
||||||
flask-testing
|
|
||||||
pytestCheckHook
|
|
||||||
];
|
|
||||||
|
|
||||||
pythonImportsCheck = [
|
|
||||||
"ihatemoney"
|
|
||||||
];
|
|
||||||
|
|
||||||
disabledTests = [
|
|
||||||
# Requires running service
|
|
||||||
"test_notifications"
|
|
||||||
"test_invite"
|
|
||||||
"test_access_other_projects"
|
|
||||||
"test_authentication"
|
|
||||||
"test_manage_bills"
|
|
||||||
"test_member_delete_method"
|
|
||||||
"test_membership"
|
|
||||||
"test_bill_add_remove_add"
|
|
||||||
"test_clear_ip_records"
|
|
||||||
"test_disable_clear_no_new_records"
|
|
||||||
"test_logs_for_common_actions"
|
|
||||||
# Requires DNS resolution
|
|
||||||
"test_invitation_email_failure"
|
|
||||||
];
|
|
||||||
|
|
||||||
passthru.tests = {
|
|
||||||
inherit (nixosTests.ihatemoney) ihatemoney-postgresql ihatemoney-sqlite;
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Shared budget manager web application";
|
|
||||||
homepage = "https://ihatemoney.org";
|
|
||||||
license = licenses.beerware;
|
|
||||||
maintainers = with maintainers; [ symphorien ];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -7208,9 +7208,6 @@
|
||||||
"igraph": [
|
"igraph": [
|
||||||
"setuptools"
|
"setuptools"
|
||||||
],
|
],
|
||||||
"ihatemoney": [
|
|
||||||
"setuptools"
|
|
||||||
],
|
|
||||||
"ijson": [
|
"ijson": [
|
||||||
"setuptools"
|
"setuptools"
|
||||||
],
|
],
|
||||||
|
|
|
@ -128,6 +128,7 @@ mapAliases ({
|
||||||
hdlparse = throw "hdlparse has been removed, it was using setuptools 2to3 translation feature, which has been removed in setuptools 58"; # added 2022-01-18
|
hdlparse = throw "hdlparse has been removed, it was using setuptools 2to3 translation feature, which has been removed in setuptools 58"; # added 2022-01-18
|
||||||
HTSeq = htseq; # added 2023-02-19
|
HTSeq = htseq; # added 2023-02-19
|
||||||
hyperkitty = throw "Please use pkgs.mailmanPackages.hyperkitty"; # added 2022-04-29
|
hyperkitty = throw "Please use pkgs.mailmanPackages.hyperkitty"; # added 2022-04-29
|
||||||
|
ihatemoney = throw "ihatemoney was removed because it is no longer maintained downstream"; # added 2023-04-08
|
||||||
IMAPClient = imapclient; # added 2021-10-28
|
IMAPClient = imapclient; # added 2021-10-28
|
||||||
imdbpy = throw "imdbpy has been renamed to cinemagoer"; # added 2022-08-08
|
imdbpy = throw "imdbpy has been renamed to cinemagoer"; # added 2022-08-08
|
||||||
intreehook = throw "intreehooks has been removed because it is obsolete as a backend-path key was added to PEP 517"; # added 2023-04-11
|
intreehook = throw "intreehooks has been removed because it is obsolete as a backend-path key was added to PEP 517"; # added 2023-04-11
|
||||||
|
|
|
@ -4668,8 +4668,6 @@ self: super: with self; {
|
||||||
inherit (pkgs) igraph;
|
inherit (pkgs) igraph;
|
||||||
};
|
};
|
||||||
|
|
||||||
ihatemoney = callPackage ../development/python-modules/ihatemoney { };
|
|
||||||
|
|
||||||
ijson = callPackage ../development/python-modules/ijson { };
|
ijson = callPackage ../development/python-modules/ijson { };
|
||||||
|
|
||||||
ilua = callPackage ../development/python-modules/ilua { };
|
ilua = callPackage ../development/python-modules/ilua { };
|
||||||
|
|
Loading…
Reference in a new issue