Resolve conlict
This commit is contained in:
@@ -9,3 +9,5 @@ DB_PASSWD=postgres
|
|||||||
DB_HOST=db
|
DB_HOST=db
|
||||||
DB_PORT=5432
|
DB_PORT=5432
|
||||||
EMAIL_API_KEY=
|
EMAIL_API_KEY=
|
||||||
|
GROUP_KEY=
|
||||||
|
GOOGLE_CREDS_JSON='{}'
|
||||||
|
|||||||
+1
-1
@@ -11,4 +11,4 @@ node_modules/
|
|||||||
.idea/
|
.idea/
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
venv/
|
venv/
|
||||||
.venv/
|
.venv/
|
||||||
@@ -12,6 +12,7 @@ import logging
|
|||||||
import html
|
import html
|
||||||
|
|
||||||
from webapp.utils import send_email
|
from webapp.utils import send_email
|
||||||
|
from webapp.utils import add_to_mailinglist
|
||||||
|
|
||||||
from members.views.utils import *
|
from members.views.utils import *
|
||||||
from members.tables import RequestTable
|
from members.tables import RequestTable
|
||||||
@@ -88,6 +89,9 @@ def application_accept(request, *args, **kwargs):
|
|||||||
).format(application.email),
|
).format(application.email),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if application.jas:
|
||||||
|
add_to_mailinglist(application.email)
|
||||||
|
|
||||||
member = application.to_member()
|
member = application.to_member()
|
||||||
member.save()
|
member.save()
|
||||||
application.delete()
|
application.delete()
|
||||||
|
|||||||
Generated
+171
-4
@@ -45,6 +45,14 @@ d = ["aiohttp (>=3.7.4)"]
|
|||||||
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||||
uvloop = ["uvloop (>=0.15.2)"]
|
uvloop = ["uvloop (>=0.15.2)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cachetools"
|
||||||
|
version = "5.2.0"
|
||||||
|
description = "Extensible memoizing collections and decorators"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "~=3.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
version = "2022.6.15"
|
version = "2022.6.15"
|
||||||
@@ -328,6 +336,85 @@ category = "main"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "google-api-core"
|
||||||
|
version = "2.8.2"
|
||||||
|
description = "Google API client core library"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
google-auth = ">=1.25.0,<3.0dev"
|
||||||
|
googleapis-common-protos = ">=1.56.2,<2.0dev"
|
||||||
|
protobuf = ">=3.15.0,<5.0.0dev"
|
||||||
|
requests = ">=2.18.0,<3.0.0dev"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "google-api-python-client"
|
||||||
|
version = "2.54.0"
|
||||||
|
description = "Google API Client Library for Python"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev"
|
||||||
|
google-auth = ">=1.19.0,<3.0.0dev"
|
||||||
|
google-auth-httplib2 = ">=0.1.0"
|
||||||
|
httplib2 = ">=0.15.0,<1dev"
|
||||||
|
uritemplate = ">=3.0.1,<5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "google-auth"
|
||||||
|
version = "2.9.1"
|
||||||
|
description = "Google Authentication Library"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
cachetools = ">=2.0.0,<6.0"
|
||||||
|
pyasn1-modules = ">=0.2.1"
|
||||||
|
rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""}
|
||||||
|
six = ">=1.9.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"]
|
||||||
|
enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"]
|
||||||
|
pyopenssl = ["pyopenssl (>=20.0.0)"]
|
||||||
|
reauth = ["pyu2f (>=0.1.5)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "google-auth-httplib2"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Google Authentication Library: httplib2 transport"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
google-auth = "*"
|
||||||
|
httplib2 = ">=0.15.0"
|
||||||
|
six = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "googleapis-common-protos"
|
||||||
|
version = "1.56.4"
|
||||||
|
description = "Common protobufs used in Google APIs"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
protobuf = ">=3.15.0,<5.0.0dev"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
grpc = ["grpcio (>=1.0.0,<2.0.0dev)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gunicorn"
|
name = "gunicorn"
|
||||||
version = "20.1.0"
|
version = "20.1.0"
|
||||||
@@ -342,6 +429,17 @@ gevent = ["gevent (>=1.4.0)"]
|
|||||||
setproctitle = ["setproctitle"]
|
setproctitle = ["setproctitle"]
|
||||||
tornado = ["tornado (>=0.2)"]
|
tornado = ["tornado (>=0.2)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "httplib2"
|
||||||
|
version = "0.20.4"
|
||||||
|
description = "A comprehensive HTTP client library."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""}
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "3.3"
|
version = "3.3"
|
||||||
@@ -502,6 +600,14 @@ python-versions = ">=3.7"
|
|||||||
docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"]
|
docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"]
|
||||||
test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"]
|
test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "protobuf"
|
||||||
|
version = "4.21.3"
|
||||||
|
description = ""
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "psycopg2-binary"
|
name = "psycopg2-binary"
|
||||||
version = "2.9.3"
|
version = "2.9.3"
|
||||||
@@ -510,6 +616,25 @@ category = "main"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyasn1"
|
||||||
|
version = "0.4.8"
|
||||||
|
description = "ASN.1 types and codecs"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyasn1-modules"
|
||||||
|
version = "0.2.8"
|
||||||
|
description = "A collection of ASN.1-based protocols modules."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pyasn1 = ">=0.4.6,<0.5.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyexcel"
|
name = "pyexcel"
|
||||||
version = "0.5.15"
|
version = "0.5.15"
|
||||||
@@ -574,7 +699,7 @@ tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
|
|||||||
name = "pyparsing"
|
name = "pyparsing"
|
||||||
version = "3.0.9"
|
version = "3.0.9"
|
||||||
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
||||||
category = "dev"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6.8"
|
python-versions = ">=3.6.8"
|
||||||
|
|
||||||
@@ -653,6 +778,17 @@ urllib3 = ">=1.21.1,<1.27"
|
|||||||
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
||||||
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
|
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rsa"
|
||||||
|
version = "4.9"
|
||||||
|
description = "Pure-Python RSA implementation"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6,<4"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pyasn1 = ">=0.1.3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruamel.yaml"
|
name = "ruamel.yaml"
|
||||||
version = "0.17.21"
|
version = "0.17.21"
|
||||||
@@ -817,6 +953,14 @@ category = "dev"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uritemplate"
|
||||||
|
version = "4.1.1"
|
||||||
|
description = "Implementation of RFC 6570 URI Templates"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
version = "1.26.11"
|
version = "1.26.11"
|
||||||
@@ -890,7 +1034,9 @@ content-hash = "f51b15fd5c0f2623c253aba571dbfc587eb8323676bd7a59ee06a97d1c3f07a8
|
|||||||
[metadata.files]
|
[metadata.files]
|
||||||
asgiref = []
|
asgiref = []
|
||||||
attrs = []
|
attrs = []
|
||||||
|
babel = []
|
||||||
black = []
|
black = []
|
||||||
|
cachetools = []
|
||||||
certifi = []
|
certifi = []
|
||||||
charset-normalizer = []
|
charset-normalizer = []
|
||||||
click = [
|
click = [
|
||||||
@@ -935,7 +1081,10 @@ djangorestframework = [
|
|||||||
{file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"},
|
{file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"},
|
||||||
{file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"},
|
{file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"},
|
||||||
]
|
]
|
||||||
djangorestframework-simplejwt = []
|
djangorestframework-simplejwt = [
|
||||||
|
{file = "djangorestframework_simplejwt-5.2.0-py3-none-any.whl", hash = "sha256:bcc4cb74dcb637ca1e17eed35276bd618ab19491f8c53e65dee6271177c355e8"},
|
||||||
|
{file = "djangorestframework_simplejwt-5.2.0.tar.gz", hash = "sha256:a60b09afb27d91ad1d7ac904cc632bd52cecead8f389f0fa1532ceb0fb757a74"},
|
||||||
|
]
|
||||||
dparse = [
|
dparse = [
|
||||||
{file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"},
|
{file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"},
|
||||||
{file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
|
{file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
|
||||||
@@ -944,14 +1093,24 @@ et-xmlfile = [
|
|||||||
{file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
|
{file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
|
||||||
{file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
|
{file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
|
||||||
]
|
]
|
||||||
|
google-api-core = []
|
||||||
|
google-api-python-client = []
|
||||||
|
google-auth = []
|
||||||
|
google-auth-httplib2 = []
|
||||||
|
googleapis-common-protos = []
|
||||||
gunicorn = [
|
gunicorn = [
|
||||||
|
{file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"},
|
||||||
{file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"},
|
{file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"},
|
||||||
]
|
]
|
||||||
|
httplib2 = []
|
||||||
idna = [
|
idna = [
|
||||||
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||||
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||||
]
|
]
|
||||||
importlib-metadata = []
|
importlib-metadata = [
|
||||||
|
{file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"},
|
||||||
|
{file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"},
|
||||||
|
]
|
||||||
jdcal = [
|
jdcal = [
|
||||||
{file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"},
|
{file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"},
|
||||||
{file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"},
|
{file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"},
|
||||||
@@ -990,7 +1149,10 @@ platformdirs = [
|
|||||||
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
||||||
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
||||||
]
|
]
|
||||||
|
protobuf = []
|
||||||
psycopg2-binary = []
|
psycopg2-binary = []
|
||||||
|
pyasn1 = []
|
||||||
|
pyasn1-modules = []
|
||||||
pyexcel = [
|
pyexcel = [
|
||||||
{file = "pyexcel-0.5.15-py2.py3-none-any.whl", hash = "sha256:7fac067e65567c380933b4d382587a5ce6581d0ad85992f6f0bc7c3f16012184"},
|
{file = "pyexcel-0.5.15-py2.py3-none-any.whl", hash = "sha256:7fac067e65567c380933b4d382587a5ce6581d0ad85992f6f0bc7c3f16012184"},
|
||||||
{file = "pyexcel-0.5.15.tar.gz", hash = "sha256:f0a7797f3a0de9e6f81151c9581fa90c4e1afce207dc47d2f0ba728dd2e24467"},
|
{file = "pyexcel-0.5.15.tar.gz", hash = "sha256:f0a7797f3a0de9e6f81151c9581fa90c4e1afce207dc47d2f0ba728dd2e24467"},
|
||||||
@@ -1003,7 +1165,10 @@ pyexcel-xlsx = [
|
|||||||
{file = "pyexcel-xlsx-0.5.8.tar.gz", hash = "sha256:ab3913b465d0d645a51e3c896dc006738a398d36ceaad2dad133056132facb92"},
|
{file = "pyexcel-xlsx-0.5.8.tar.gz", hash = "sha256:ab3913b465d0d645a51e3c896dc006738a398d36ceaad2dad133056132facb92"},
|
||||||
{file = "pyexcel_xlsx-0.5.8-py2.py3-none-any.whl", hash = "sha256:9bae2820c5767440d8a387695e0f8e8f73c97bcde0a5680c200ae82a2f6d5cc6"},
|
{file = "pyexcel_xlsx-0.5.8-py2.py3-none-any.whl", hash = "sha256:9bae2820c5767440d8a387695e0f8e8f73c97bcde0a5680c200ae82a2f6d5cc6"},
|
||||||
]
|
]
|
||||||
pyjwt = []
|
pyjwt = [
|
||||||
|
{file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"},
|
||||||
|
{file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"},
|
||||||
|
]
|
||||||
pyparsing = [
|
pyparsing = [
|
||||||
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
||||||
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
||||||
@@ -1080,6 +1245,7 @@ pyyaml = [
|
|||||||
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
||||||
]
|
]
|
||||||
requests = []
|
requests = []
|
||||||
|
rsa = []
|
||||||
"ruamel.yaml" = []
|
"ruamel.yaml" = []
|
||||||
"ruamel.yaml.clib" = []
|
"ruamel.yaml.clib" = []
|
||||||
safety = []
|
safety = []
|
||||||
@@ -1116,6 +1282,7 @@ tomli = [
|
|||||||
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
|
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
|
||||||
]
|
]
|
||||||
typing-extensions = []
|
typing-extensions = []
|
||||||
|
uritemplate = []
|
||||||
urllib3 = []
|
urllib3 = []
|
||||||
uwsgi = [
|
uwsgi = [
|
||||||
{file = "uwsgi-2.0.20.tar.gz", hash = "sha256:88ab9867d8973d8ae84719cf233b7dafc54326fcaec89683c3f9f77c002cdff9"},
|
{file = "uwsgi-2.0.20.tar.gz", hash = "sha256:88ab9867d8973d8ae84719cf233b7dafc54326fcaec89683c3f9f77c002cdff9"},
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ fi
|
|||||||
if test -f "$DB_PASSWD_FILE"; then
|
if test -f "$DB_PASSWD_FILE"; then
|
||||||
export DB_PASSWD=$(cat $DB_PASSWD_FILE)
|
export DB_PASSWD=$(cat $DB_PASSWD_FILE)
|
||||||
fi
|
fi
|
||||||
|
if test -f "$GOOGLE_CREDS_JSON"; then
|
||||||
|
export GOOGLE_CREDS_JSON=$(cat $GOOGLE_CRED_JSON_FILE)
|
||||||
|
fi
|
||||||
|
|
||||||
# Collect static files
|
# Collect static files
|
||||||
echo "Collect static files"
|
echo "Collect static files"
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ sentry-sdk = "^1.4.3"
|
|||||||
django-polymorphic = "^3.1.0"
|
django-polymorphic = "^3.1.0"
|
||||||
python-dotenv = "^0.20.0"
|
python-dotenv = "^0.20.0"
|
||||||
djangorestframework-simplejwt = "^5.2.0"
|
djangorestframework-simplejwt = "^5.2.0"
|
||||||
|
google-auth = "^2.9.1"
|
||||||
|
google-api-python-client = "^2.54.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
coverage = "^6.4.2"
|
coverage = "^6.4.2"
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import sentry_sdk
|
|||||||
from sentry_sdk.integrations.django import DjangoIntegration
|
from sentry_sdk.integrations.django import DjangoIntegration
|
||||||
from sikweb.base import *
|
from sikweb.base import *
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
import json
|
||||||
|
|
||||||
load_dotenv() # loads the configs from .env
|
load_dotenv() # loads the configs from .env
|
||||||
|
|
||||||
@@ -79,6 +80,9 @@ DATABASES = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Google api settings
|
||||||
|
GROUP_KEY = os.getenv("GROUP_KEY", "")
|
||||||
|
GOOGLE_SERVICE_ACCOUNT = json.loads(os.getenv("GOOGLE_CREDS_JSON", "{}"))
|
||||||
|
|
||||||
# JWT authentication
|
# JWT authentication
|
||||||
SIMPLE_JWT = {
|
SIMPLE_JWT = {
|
||||||
|
|||||||
@@ -34,11 +34,13 @@ services:
|
|||||||
- SECRET_KEY_FILE=/run/secrets/BACKEND_SECRET_KEY
|
- SECRET_KEY_FILE=/run/secrets/BACKEND_SECRET_KEY
|
||||||
- DB_PASSWD_FILE=/run/secrets/BACKEND_DB_PASSWD
|
- DB_PASSWD_FILE=/run/secrets/BACKEND_DB_PASSWD
|
||||||
- EMAIL_API_KEY_FILE=/run/secrets/BACKEND_EMAIL_API_KEY
|
- EMAIL_API_KEY_FILE=/run/secrets/BACKEND_EMAIL_API_KEY
|
||||||
|
- GOOGLE_CREDS_JSON=/run/secrets/GOOGLE_CREDS_JSON
|
||||||
|
|
||||||
secrets:
|
secrets:
|
||||||
- BACKEND_SECRET_KEY
|
- BACKEND_SECRET_KEY
|
||||||
- BACKEND_DB_PASSWD
|
- BACKEND_DB_PASSWD
|
||||||
- BACKEND_EMAIL_API_KEY
|
- BACKEND_EMAIL_API_KEY
|
||||||
|
- GOOGLE_CREDS_JSON
|
||||||
secrets:
|
secrets:
|
||||||
BACKEND_SECRET_KEY:
|
BACKEND_SECRET_KEY:
|
||||||
external: true
|
external: true
|
||||||
@@ -46,3 +48,5 @@ secrets:
|
|||||||
external: true
|
external: true
|
||||||
BACKEND_EMAIL_API_KEY:
|
BACKEND_EMAIL_API_KEY:
|
||||||
external: true
|
external: true
|
||||||
|
GOOGLE_CREDS_JSON:
|
||||||
|
EXTERNAL: true
|
||||||
|
|||||||
@@ -18,14 +18,21 @@ from sendgrid.helpers.mail import (
|
|||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
from sikweb.settings import (
|
from sikweb.settings import (
|
||||||
|
DEPLOY_ENV,
|
||||||
FRONTEND_URL,
|
FRONTEND_URL,
|
||||||
EMAIL_API_KEY,
|
EMAIL_API_KEY,
|
||||||
DEFAULT_EMAIL_FROM,
|
DEFAULT_EMAIL_FROM,
|
||||||
DEFAULT_EMAIL_FROM_ADDR,
|
DEFAULT_EMAIL_FROM_ADDR,
|
||||||
ENABLE_AUTOMATIC_EMAILS,
|
ENABLE_AUTOMATIC_EMAILS,
|
||||||
|
GROUP_KEY,
|
||||||
|
GOOGLE_SERVICE_ACCOUNT,
|
||||||
)
|
)
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from google.oauth2 import service_account
|
||||||
|
from googleapiclient.discovery import build
|
||||||
|
from googleapiclient.errors import HttpError
|
||||||
|
|
||||||
|
|
||||||
def get_file_extension(file_name, decoded_file):
|
def get_file_extension(file_name, decoded_file):
|
||||||
extension = imghdr.what(file_name, decoded_file)
|
extension = imghdr.what(file_name, decoded_file)
|
||||||
@@ -119,3 +126,34 @@ def send_signup_email(to, subject, id, uuid, content):
|
|||||||
def admin_send_email_signupees(list, subject, content):
|
def admin_send_email_signupees(list, subject, content):
|
||||||
for to in list:
|
for to in list:
|
||||||
send_email(to.email, subject, markdown.markdown(content), True)
|
send_email(to.email, subject, markdown.markdown(content), True)
|
||||||
|
|
||||||
|
|
||||||
|
def add_to_mailinglist(email: str):
|
||||||
|
try:
|
||||||
|
# get data
|
||||||
|
SCOPES = ["https://www.googleapis.com/auth/admin.directory.group"]
|
||||||
|
|
||||||
|
# create credentials, with subject is used to impersonate admin account
|
||||||
|
# jas_manager has groups editor rights in google admin
|
||||||
|
credentials = service_account.Credentials.from_service_account_info(
|
||||||
|
info=GOOGLE_SERVICE_ACCOUNT, scopes=SCOPES
|
||||||
|
).with_subject("jas_manager@sahkoinsinoorikilta.fi")
|
||||||
|
|
||||||
|
service = build("admin", "directory_v1", credentials=credentials)
|
||||||
|
service.members().insert(groupKey=GROUP_KEY, body={"email": email}).execute()
|
||||||
|
except HttpError as err:
|
||||||
|
# Already in list, do nothing
|
||||||
|
if err.status_code == 409:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
logging.exception("Failed adding user to list")
|
||||||
|
|
||||||
|
# Send email notificcation to maintainer, only in prod
|
||||||
|
if DEPLOY_ENV == "production":
|
||||||
|
to = "ilari.ojakorpi@sahkoinsinoorikilta.fi"
|
||||||
|
subject = "Web error: Failed adding to google groups"
|
||||||
|
body = "Error code: {}\nError details: {}\nEmail that was not added: {}\n\nAdd user manually to jäsenet groups.".format(
|
||||||
|
err.status_code, err.error_details, email
|
||||||
|
)
|
||||||
|
|
||||||
|
send_email(to, subject, body)
|
||||||
|
|||||||
Reference in New Issue
Block a user