Only this pageAll pages
Powered by GitBook
1 of 42

Prophecies

Loading...

Loading...

Getting Started

Loading...

Loading...

Loading...

User Guide

Upload data as an admin

Add a project

Add users

Add a task

Manage a task

Check data as a checker

Sign in or log in

Find a task

Read notifications

Check records

Read tutorial

Enter a choice

Enter a choice for multiple records

Change or cancel a choice

Leave a note

Open record in new tab

Duplicate record

Lock record

See record's history

Search records

Filter records

Sort records

Read shortcuts

Read tips

Read stats

Read history

Log out

FAQ

Developers

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Installation from the sources

This guide will explain how to setup Prophecies using the sources.

Prerequisites

  • Python 3.9

  • Node 16.x

  • Poetry >= 1.2

  • Yarn 1.x

  • Git

Setup steps

Checkout the repository with git:

git clone git@github.com:ICIJ/prophecies.git
cd prophecies/

After entering the directory, setup a virtualenv with poetry and to install required packages:

make install

To setup the database (using SQLite3 by default):

make migrate

To create a superuser:

make createsuperuser
DEBUG=on
DATABASE_URL=
CACHE_URL=dummycache://
STATIC_URL=/static/
SOCIAL_AUTH_PROVIDER_KEY=
SOCIAL_AUTH_PROVIDER_SECRET=
SOCIAL_AUTH_PROVIDER_HOSTNAME=http://localhost:3001
SOCIAL_AUTH_PROVIDER_USERNAME_FIELD=uid
SOCIAL_AUTH_PROVIDER_GROUPS_FIELD=groups_by_applications.prophecies
SOCIAL_AUTH_PROVIDER_STAFF_GROUP=icijstaff

This section describes how to install Prophecies for development. This environment disables many security settings provided by Django and isn't meant to be used for internet-facing instances. For that purpose please follow the .

For more customization, this app utilizes inspired environment variables to configure your Django application. You can create .env file using the custom settings variables:

The application can be configured with .

installation guide with Docker
12factor
many environment variables

Configure Prophecies

The application can be configured using the following environment variables:

Environment Variable
Description
Default Value

SECRET_KEY

Secret key for Django security

'django-insecure-...'

DEBUG

Debug mode toggle

False

TEMPLATE_DEBUG

Debug mode for templates

Value of DEBUG

ALLOWED_HOSTS

Host/domain names that Django can serve

'localhost,127.0.0.1'

CSRF_TRUSTED_ORIGINS

Trusted origins for CSRF protection

'http://localhost:8080'

STATIC_URL

URL for static files

'/static/'

STATIC_ROOT

Directory for collectstatic

Project root + 'run/static'

MEDIA_STORAGE

Type of media storage

'FS'

MEDIA_ROOT

Directory for user-uploaded files

'/media/' for S3, Project root + 'run/media' for FS

MEDIA_URL

URL for media files

'https://{AWS_S3_CUSTOM_DOMAIN}/' for S3, '/media/' for FS

AWS_ACCESS_KEY_ID

AWS access key ID for S3

None

AWS_SECRET_ACCESS_KEY

AWS secret access key for S3

None

AWS_STORAGE_BUCKET_NAME

AWS storage bucket name for S3

None

AWS_S3_REGION_NAME

AWS S3 region name

None

AWS_S3_SIGNATURE_VERSION

AWS S3 signature version

's3v4'

AWS_QUERYSTRING_EXPIRE

AWS query string expiration time

'3600'

DATABASE_URL

Database URL for Django-environ to parse

'sqlite:///{root.path("db.sqlite3")()}'

USE_X_FORWARDED_HOST

Use X-Forwarded-Host header

Value of DEBUG

SOCIAL_AUTH_URL_NAMESPACE

Namespace for social auth URLs

None

SOCIAL_AUTH_LOGIN_URL

Login URL for social auth

'/login/provider/'

SOCIAL_AUTH_PROVIDER_HOSTNAME

Hostname for OAuth provider

None

SOCIAL_AUTH_PROVIDER_KEY

Key for OAuth provider

None

SOCIAL_AUTH_PROVIDER_SECRET

Secret for OAuth provider

None

SOCIAL_AUTH_PROVIDER_PROFILE_URL

Profile URL for OAuth provider

None

SOCIAL_AUTH_PROVIDER_AUTHORIZATION_URL

Authorization URL for OAuth provider

None

SOCIAL_AUTH_PROVIDER_ACCESS_TOKEN_URL

Access token URL for OAuth provider

None

SOCIAL_AUTH_PROVIDER_ACCESS_TOKEN_METHOD

Access token method for OAuth provider

'POST'

SOCIAL_AUTH_PROVIDER_USERNAME_FIELD

Username field for OAuth provider

'username'

SOCIAL_AUTH_PROVIDER_GROUPS_FIELD

Groups field for OAuth provider

'groups'

SOCIAL_AUTH_PROVIDER_STAFF_GROUP

Staff group for OAuth provider

'staff'

CONSTANCE_PUBLIC_KEYS

Comma separated public keys for dynamic settings

'loginUrl'

DJANGO_ADMIN_LOGIN

Toggle for Django Admin native login

Value of DEBUG

CACHE_URL

URL for cache backend

'filecache:///code/prophecies/run/cache/'

DJANGO_LOG_LEVEL

Logging level for Django

'INFO'

Introduction

Prophecies is a platform to fact check data collaboratively. It is a free open-source software developed by the International Consortium of Investigative Journalists (ICIJ).

Why did we create Prophecies?

ICIJ is a non-profit leading outstanding investigations involving hundreds of reporters around the world. Each of our project leverage the power of data and technology to investigate issues of global importance. To be able to simultaneously publish a story in so many media, every single line of data we use must be fact checked. This is, as we say internally, "our secret sauce". Some of the datasets we produce rely on a very heavy effort to be verified, sometimes with up to 4 different rounds of verification.

In order to make sure this workflow is well organized and efficient, we created Prophecies.

How can I use Prophecies?

Prophecies is a collaborative tool that must be available online to its users. Therefore, to use Prophecies you must install it on your server, as web application.

What skills are needed to install Prophecies?

To install Prophecies, you will need to have a good understanding of how Docker and Docker Compose work and how they can be used. You will also need to have basic knowledge of how to setup a PostgreSQL database. In this guide, we will use a database directly installed in a Docker.

Key concepts

This page introduce the key concepts used by Prophecies.

Installation with Docker

Prerequisites

Before installing Prophecies, ensure you have the following tools installed:

These tools are essential for running Prophecies efficiently and are widely used in the development and deployment of modern applications.

Setup steps

1. Prepare the Working Directory

Place this docker-compose.yml file in your chosen directory. This will be the working directory for your Docker Compose setup:

version: '3'

volumes:
  shared_static: {}
  postgresql_data: {}

services:
  nginx:
      image: nginx:latest
      ports:
        - "9999:9999"
      volumes:
        - ./nginx.conf:/etc/nginx/conf.d/default.conf
        - shared_static:/static/:ro
      depends_on:
        - web

  web:
    image: icij/prophecies:0.5.9
    environment:
      - ALLOWED_HOSTS=0.0.0.0,localhost,web
      - CSRF_TRUSTED_ORIGINS=http://localhost:9999
      - DATABASE_URL=postgres://postgres:postgres@db/prophecies
      - DEBUG=false
      - DJANGO_SETTINGS_MODULE=prophecies.settings.production
      - DJANGO_ADMIN_LOGIN=true
      - PROPHECIES_APP_LOGIN_URL=/admin/login/?next=/
      - PORT=8008
      - WAIT_HOSTS_TIMEOUT=60
      - WAIT_HOSTS=db:5432
    volumes:
      - shared_static:/code/prophecies/run/static
    depends_on:
      - db
      - migration
      - collectstatic
    expose:
      - "8008"

  migration:
    image: icij/prophecies:0.5.9
    command: sh -c '/usr/bin/wait && poetry run python manage.py migrate --noinput'
    environment:
      - WAIT_HOSTS=db:5432
      - WAIT_HOSTS_TIMEOUT=60
      - DATABASE_URL=postgres://postgres:postgres@db/prophecies
    depends_on:
      - db

  collectstatic:
    image: icij/prophecies:0.5.9
    command: poetry run python manage.py collectstatic --noinput
    volumes:
      - shared_static:/code/prophecies/run/static

  db:
    image: postgres:16
    restart: always
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: prophecies
    command: postgres -c shared_preload_libraries=pg_stat_statements -c 'pg_stat_statements.track=all'
    volumes:
      - postgresql_data:/var/lib/postgresql/data

2. Configure NGINX

You need to create an NGINX configuration file as referenced in your Docker Compose file (./nginx.conf). Ensure this file is correctly configured to serve your Prophecies. It should be set up to listen on port 9999 and serve static files from the /static/ directory:

upstream web {
  ip_hash;
  server web:8008;
}

server {

    location /static/ {
        autoindex on;
        alias /static/;
    }

    location / {
        proxy_pass http://web/;
    }
    
    listen 9999;
    server_name localhost;
}

3. Starting Services

In your working directory, run the following command:

docker compose up -d

This command will download the necessary images (if not already downloaded), create the defined volumes, and start the services as background processes.

3. Database Migrations and Static Files

The docker-compose.yml file specifies services for running database migrations (migration) and collecting static files so they can be served by NGINX (collectstatic). These services should automatically perform these tasks when you start Docker Compose.

4. Create Admin User

The database is currently empty, without user. To provision your first admin user, you must use the command line:

docker compose exec -it web make createsuperuser

5. Accessing the Application

6. Monitoring and Logs

To monitor the status of your Docker containers and check for any issues, you can use the Docker Compose logs command:

docker compose logs -f

The -f flag will follow the log output, allowing you to see real-time logs as they are generated.

7. Stopping and Removing Services

To stop the services without removing them, you can run:

docker compose stop

If you need to stop and remove all the containers, networks, and volumes associated with your Docker Compose setup, use the down command:

docker compose down --volumes

This will clean up everything you have created and is particularly useful for starting from scratch. Please make sure you know what you're doing before running this command.

Additional Notes

  • This configuration doesn't include SSL setup for NGINX, which is recommended for production.

  • Regularly check for updates to the icij/prophecies image to keep your application up to date.

  • To use custom domain, don't forget to update the ALLOWED_HOSTS variable.

Ask for help

  • your Operating System (Mac, Windows or Linux)

  • the version of your Operating System

  • the version of Prophecies

  • screenshots of your issue

Prophecies is an open-source project, done by a non-profit organization. Our team will try its best to help you in a timely manner but the best way to get help will always be to rely on the community (and ask your question on Github).

Wondering how you can install Prophecies on your server? !

Prophecies is a Python application built at the top of the Django framework. To ease installation, we publish a Docker image of the application . The image is built both for ARM64 and AMD64 which ensure a wider level of compatibility.

Docker: A platform for developing, shipping, and running applications inside isolated environments known as containers. .

Docker Compose: A tool for defining and running multi-container Docker applications. It uses a YAML file to configure your application's services, making it easier to manage complex setups. .

Once all services are up and running, the application should be accessible via :

The application can be configured with .

To report a bug, please . To maximize the chance of getting help from our team and our community, we advise you to be as precise as possible, while detailing:

If for confidentiality reasons you don't want to open an issue on Github, please write to .

Project

A group of tasks to verify. For instance "Pandora Papers" is a project.

Task

Each task, or list of record, that must be verified under a specific set of rules. For instance, a list of "Paintings locations" to check. A task can have many options, including the type of form to use, the type of options present, the number of rounds of checks, etc.

Task Record

The actual records to check. Those record are always composed of an "original value" and a "predicted value". Checker will have to verify if the predicted value is correct. Each record can be identified uniquely with an optional uid.

Task Record Review

The assignation of a record to a checker. This can contain the result of the check ("correct", "incorrect", etc) as well as the alternative value proposed by the checker.

Checker

The user that will be in charge of checking a task record. The list of checkers is defined when creating the task.

Choice Group

The list of options that will be presented to the checker when reviewing a record. For instance "Correct", "Incorrect" and "I don't know". An option can be mark as "requiring an alternative value". For instance if you pick incorrect when reviewing an address, you might have to select the correct country.

Alternative Value

A list of alternative values that can be associated to a choice group. For instance, a list of countries and their ISO3 code.

Follow the guide
on Docker Hub
Learn more about Docker
Get started with Docker Compose
http://localhost:9999
many environment variables
open an issue on our Github
prophecies@icij.org

Architecture overview

API

Stack

Prophecies is based on the following open source tools:

  • Python 3.9, 3.10

  • Node 16, 18

  • Django 4.2

  • Django Rest Framework 3.14

  • Django Rest Framework JSON:API 6.1

  • Pytest

  • Vue 2.7

  • Vue CLI 5

  • Vuex ORM 0.36

  • Jest 28

  • Poetry

  • Yarn

Interaction workflow

This sequence diagram illustrates the communication flow within the Prophecies platform infrastructure, focusing on how a request travels from the user interface to the database and back.

Database schema

Here is a simplified version of the Database schema.

Testing the backend

This command triggers the testing process, where make is a build automation tool used to manage tasks like compiling the code or running tests, and test-back is a target defined within the Makefile.

Upon execution, Pytest will begin to run all the specified tests in your test suite. You can monitor the output in your terminal to check the progress of the tests. If all goes well and your code passes all the tests, you should see a success message indicating that everything is working as intended. Any failed tests will be reported accordingly, allowing you to make the necessary adjustments.

The API is built with Django Rest Framework and implements the of Prophecies.

Once you , simply launch Pytest with this shortcut:

key concepts
make test-back
setup Prophecies from the sources

Use this page to explore the latest specifications of the API.

The JSON:API spec is a standard for structuring JSON responses in APIs to optimize data exchange and efficiency.

This schema follows the . You can load this file in many OpenAPI clients, including Swagger or Redoc.

Explore the API
Download API schema
OpenAPI 3
JSON:API specification

Testing the frontend

make test-front

This command triggers the testing process, where make is a build automation tool used to manage tasks like compiling the code or running tests, and test-front is a target defined within the Makefile.

Upon execution, Jest will begin to run all the specified tests in your test suite. You can monitor the output in your terminal to check the progress of the tests. If all goes well and your code passes all the tests, you should see a success message indicating that everything is working as intended. Any failed tests will be reported accordingly, allowing you to make the necessary adjustments.

Mock Service Worker

$ tree prophecies/apps/frontend/tests/unit/mocks/handlers
│
├── action-aggregate.js
├── actions.js
├── choice-groups.js
├── settings.js
├── task-record-media.js
├── task-record-reviews.js
├── task-records.js
├── tasks.js
├── task-user-choice-statistics .js
├── task-user-statistics.js
├── tips.js
├── user-notification.js
└── users.js

Once you , simply launch Jest with this shortcut:

This application utilizes (MSW) to mock API results from the backend. All server request are defined within handers that you can find :

setup Prophecies from the sources
Mock Service Worker
in this directory

Publishing a new Docker image

Docker image tag

The Docker image is tagged with the version extracted from the git tag (e.g., icij/prophecies:1.0.0). Additionally, the image is tagged as latest.

  • Platform: linux/arm64, linux/amd64

This documentation provides a comprehensive guide on how to release a new Docker image, build, and test the application locally using the provided Makefile commands.

Releasing a new Docker Image

1. Update Version

The version can be updated as major, minor, or patch using the Makefile. To do this, run one of the following commands depending on the type of version bump you need:

These commands automatically update the version in pyproject.toml for the Python backend and package.json in the frontend directory, then commit these changes and tag the version in Git.

2. Push the Changes and Tag to Git

After updating the version and creating a git tag, push the changes and the tag to your git repository:

Pushing the tag is crucial because the GitHub Actions workflow for Docker image publishing is triggered by a push to tags that follow the semantic versioning format, prefixed with v (e.g., v1.0.0).

Build and test locally

A convenience docker-compose.yml file is located as the root of the repository. To build and test Prophecies locally with Docker, you can run from the app's root directory:

Image Repository:

make major
make minor
make patch
git push && git push --tags
docker compose up
icij/prophecies

Continuous integration

Jobs Overview

The workflow consists of six main jobs.

lint-backend

  • Purpose: Lints the backend code to ensure it adheres to Python coding standards.

  • Python Version: Runs with Python 3.9.

  • Command: Uses pylint to lint the prophecies directory.

test-backend

  • Purpose: Executes backend tests to verify the functionality.

  • Python Version: Tests are run on both Python 3.9 and 3.10.

  • Command: Runs backend tests using the make test-back command.

test-frontend

  • Purpose: Conducts frontend tests to ensure UI/UX integrity.

  • Node Version: Tests are conducted on Node.js versions 16.x and 18.x.

  • Command: Frontend tests are executed using the make test-front command.

build

  • Purpose: Build artifacts to be publish with the next release.

  • Conditions: This job runs only if the push event is a tag push starting with 'v', and it depends on the successful completion of the lint-backend, test-backend, and test-frontend jobs.

  • Command: Run a python command to extract the OpenAPI schema file and store it.

package-publish

  • Purpose: Restore artifacts from the build job to publish them as Github Release.

  • Conditions: This job runs only if the push event is a tag push starting with 'v', and it depends on the successful completion of the build job.

docker-publish

  • Conditions: This job runs only if the push event is a tag push starting with 'v', and it depends on the successful completion of the build job.

  • Step: This job includes checking out the code, setting up QEMU and Docker Buildx, logging into Docker Hub, preparing the tag name based on the git tag, and finally building and pushing the Docker image.

Secrets

To be able to push on the Docker Hub, this workflow must use the following secrets:

  • DOCKERHUB_USERNAME: The username for Docker Hub authentication.

  • DOCKERHUB_PASSWORD: The password or access token for Docker Hub authentication.

is designed to automate the process of linting, testing, and publishing Docker images. This workflow triggers on every push to the repository and is structured into several jobs to ensure code quality and reliability before a new Docker image is published.

Learn more about how to trigger the .

Prophecies' GitHub Actions workflow
publication of a new Docker image