A free website that keeps the people informed about housing and evictions.

Overview

Eviction Tracker

Currently helping verify detainer warrant data for middle Tennessee - via Middle TN DSA - Red Door Collective

Features

  • Presents data visualizations for community awareness
  • Organizer Portal
    • Create direct action campaigns
    • Schedule events for campaigns
    • Record relevant information for phonebanking sessions
  • Admin Portal
    • Create and update detainer warrants

Development

Setup

You'll need to set a few secret environment variables before booting the app.

You can copy-paste the following lines into your terminal if you're using bash.

echo 'export TWILIO_ACCOUNT_SID=fake' >> ~/.bash_profile
echo 'export TWILIO_AUTH_TOKEN=fake' >> ~/.bash_profile

Then, you can either run source ~/.bash_profile or open a new terminal tab and proceed to the next step.

If you're wondering what the above code does: it defines two environment variables with the value "fake" and ensures they are available in all future (bash) shell sessions. TODO: make this process less painful.

Nix

Nix is a tool we use to ensure reproducable builds and deployments. Python's default build and deployment system is notoriously tricky. We've elected to use Nix instead to ease setup. Nix can be used for installing and deploying multiple languages, which may end up being useful for this project.

Install Nix

Please follow the instructions to install Nix on their website.

(Please ignore instructions regarding NixOS - that's a whole new operating system).

Using Nix

To work with the same python version as everyone else working on this project, you'll need to make sure you're in the nix-shell first.

  1. Check that you're in the same directory as shell.nix
  2. Type nix-shell and hit enter
  3. Wait for necessary dependencies to install from the internet to your machine

You'll get a new prompt that looks like:

[nix-shell:~/some/path/eviction-tracker]$ 

Now you're ready to run python and ipython! You can escape the nix-shell at any time by holding ctrl pressing the D key or typing exit and pressing enter.

Database

We use PostgreSQL for both development and production so that we can be assured working with the data locally will work exactly the same in production. Unfortunately, this requires a bit more manual setup for developers who don't already use Postgres.

First-time postgres

Install postgres with the most convenient installer for your OS.

The app doesn't care how you set up your postgres connection, so feel free to set up your postgres service in whatever method is convenient for you. By default, the SQLALCHEMY_DATABASE_URL is set to postgresql+psycopg2://[email protected]/eviction_tracker, which assumes that you've created a database called eviction_tracker, a user called eviction_tracker (without a password), and that you are using the default host and port of a postgres service running on the same host as the app.

Feel free to override this environment variable like SQLALCHEMY_DATABASE_URL="..." flask shell or create the same setup locally. If you're running your database on another host like a Docker container, you'll need to change localhost and possibly add a :port to your override.

Some postgres instructions on setting up for the default flow:

psql -U postgres # or, the superuser you've set up. -U postgres is default for modern installs

The above command will place you in this postgres shell:

postgres=# CREATE DATABASE eviction_tracker;
postgres=# CREATE USER eviction_tracker;
postgres=# GRANT ALL ON eviction_tracker to eviction_tracker;

These commands create the database, user, and assign all privileges for the user to the development database;

Migrations

Make sure to run flask db upgrade after setting up your database, or whenever a new migration is added to the migrations/ folder.

Google Spreadsheets

You'll need authentication to make requests to the online spreadsheet with the most current data.

Please install Keybase, a secure messaging platform. I will send any contributor who requests the authentication secrets the necessary file. When I send the file over Keybase, you'll need to download it, and move it somewhere you won't lose it.

By default, our scripts expect the file to be at the following path: ~/.config/gspread/service_account.json. In plain english: it should be in your home directory, under a hidden folder named .config and finally inside another folder called gspread. The file should be named service_account.json. If these are all true, you're good to go! If you'd like to save the file elsewhere or rename it, just run the script with your custom path under the optional argument: --service_account_key=/path/to/your/file.json.

Using a REPL

REPL (Read Eval Print Loop) is a concept implemented in many programming languages. If you've never written python before, we recommend spending an afternoon on these basics. You'll interact with a REPL in those courses.

While in a Nix Shell, launch the IPython shell like so:

ipython

And now, you can write python code with any of our libraries!

Running commands

While in a Nix Shell, run flask .

Bootstrap

You'll want to set up a small set of users and roles for development.

Run flask bootstrap to provision users and roles.

Afterwards, you'll be able to login to several demo users with varying roles.

  1. Superuser - [email protected]:123456
  2. Admin - [email protected]:123456
  3. Organizer - [email protected]:123456
  4. Defendant - [email protected]:123456

Sync database

To sync the data from our org's Google Spreadsheet, run flask sync .

If you want just a bit of data to work with locally, pass the --limit argument.

Example: flask sync --sheet-name 'detainer-warrants_15-02-2020' --limit 10 will populate the database with 10 detainer warrants from the spreadsheet titled detainer-warrants_15-02-2020.

Run app

To run the website locally, use flask run --no-reload within the nix-shell.

You'll be able to visit it at http://127.0.0.1:5000/

You can browse api endpoints like detainer warrants at http://127.0.0.1:5000/api/v1/detainer-warrants

Comments
  • Save a mock twilio response to the database

    Save a mock twilio response to the database

    Context

    Before we verify any phone numbers, we need to make sure we can save the verification data so we never lose what we've paid for. We are building a database of information: detainer warrants, attorneys, defendants, etc. There will also be a table for phone_number_verifications. We will then always be able to look up our data from Twilio in that database.

    Description

    This should serve as a test that our code will do the right thing when eventually validating a phone number.

    We should make sure that the JSON response documented by Twilio is able to be saved to the database.

    Example JSON response

    {
      "caller_name": {
        "caller_name": "Delicious Cheese Cake",
        "caller_type": "CONSUMER",
        "error_code": null
      },
      "carrier": null,
      "country_code": "US",
      "national_format": "(510) 867-5310",
      "phone_number": "+15108675310",
      "add_ons": null,
      "url": "https://lookups.twilio.com/v1/PhoneNumbers/+15108675310"
    }
    

    Modeling

    We need to build a database table to properly model this data before inserting it.

    I suggest:

    class PhoneNumberVerification(Base):
        __tablename__ = 'phone_number_verifications'
        id = Column(Integer, foreign_key=True)
        caller_name = Column(String)
        caller_type = Column(Integer) # smaller column than String
        error_code = Column(Integer)
        carrier = Column(String)
        country_code = Column(String)
        national_format = Column(String)
        phone_number = Column(String)
    

    This is actively under construction. Follow progress in #6.

    Inserting

    Please follow SQLAlchemy docs for how to insert this kind of data to the database

    Testing

    We don't yet have a test suite, i'll comment on this issue when we do. When that is set up, we can write a test to close out this issue:

    1. Create mock JSON data
    2. Test that the JSON can be inserted into the phone_number_verifications table
    opened by gregziegan 3
  • Test Twilio Phone Verfication Database Insertion

    Test Twilio Phone Verfication Database Insertion

    This creates a test to ensure a mock JSON Twilio response can be saved as a valid PhoneNumberVerification entry. A second test was added that checks the input of the mock Twilio response to what is saved in the database.

    opened by donald-mate 1
  • Set up SQLite database

    Set up SQLite database

    Binary files are bloated and terrible way to manage data over time. Let's use a simple database like SQLite for the time being.

    Checklist

    • [x] Set up SQLite for local development
    • [x] Create tables for detainer warrants and associated data
    • [ ] Create table for phone number verifications
    • [ ] Automate spreadsheet insertion into detainer warrant table
    opened by gregziegan 1
  • Separate Judgments from Hearings

    Separate Judgments from Hearings

    Context

    The site uses the concept of a Judgment to refer to both a hearing (scheduled court date) and its outcome. This is OK, but makes matching Judgment to hearings difficult as the only method of matching judgments to hearings is via court and file date. The judgment document is filed sometime after the court date. We can use this knowledge to guess which judgment corresponds to which hearing. This code was quite messy to work with when there were not two separate tables.

    Description

    Hearings and Judgments

    This PR introduces another table for hearings, where web scraping of the CircuitClerk will always be the sole author of that data. Users will not be able to edit hearing details. Judgment data is now connected to hearings via automatic PDF scraping, with an ability for users to fix details of the scraping.

    UI changes

    The detainer warrant is now merely a landing page for hearings and judgments. You must edit a judgement on a judgment page. There is now a Judgments table UI to help expedite auditing of judgments.

    Database changes

    I tried to get the migration scripts working for the data transition but got stuck on certain SQL transactions. After messing with it for a few hours i decided this was not worth the time since we always have a data backup since mid-November via google sheets and database dumps on the production server. I'll instead be executing sqlalchemy queries through the flask shell to fix data.

    opened by gregziegan 0
  • Convert to Paack-ui; remove extraneous fields; expand Judgement

    Convert to Paack-ui; remove extraneous fields; expand Judgement

    1. convert to paack-ui
    2. remove presiding judge from warrant
    3. move court date and court room to "judgements"
    4. switch to posix for all date and datetime columns
    opened by gregziegan 0
  • An organizer can record info from their phonebank into a form on the website

    An organizer can record info from their phonebank into a form on the website

    Phone Bank Script

    Let's add some text fields to capture notes.

    There's a lot of "If" statements in the script that would be great to automate. Say, click a button and another piece of the form shows up.

    opened by gregziegan 0
Releases(v314)
PyLaboratory 0 Feb 07, 2022
A Kodi add-on for watching content hosted on PeerTube.

A Kodi add-on for watching content hosted on PeerTube. This add-on is under development so only basic features work, and you're welcome to improve it.

1 Dec 18, 2021
poetry2nix turns Poetry projects into Nix derivations without the need to actually write Nix expressions

poetry2nix poetry2nix turns Poetry projects into Nix derivations without the need to actually write Nix expressions. It does so by parsing pyproject.t

Nix community projects 405 Dec 29, 2022
A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python

A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python

Windel Bouwman 277 Dec 26, 2022
Python Project For Beginner

Basic-Vitrual-AI-Assistant Python Project For Beginner Hey There, I had manipulated Selenium WebDriver to make this assistant. I hope, It will be help

Maruf Billah 13 Dec 12, 2022
Shai-Hulud - A qtile configuration for the (spice) masses

Shai-Hulud - A qtile configuration for the (spice) masses Installation Notes These dotfiles are set up to use GNU stow for installation. To install, f

16 Dec 30, 2022
A dead-simple service that notifies you when something goes down.

Totmannschalter Totmannschalter (German for dead man's switch) is a simple service that notifies you when it has not received any message from a servi

1 Dec 20, 2021
Download and process GOES-16 and GOES-17 data from NOAA's archive on AWS using Python.

Download and display GOES-East and GOES-West data GOES-East and GOES-West satellite data are made available on Amazon Web Services through NOAA's Big

Brian Blaylock 88 Dec 16, 2022
Artificial intelligence based on 5-dimensional quantum selection

Deep Thought An artificial intelligence based on 5-dimensional quantum selection. Algorithm The payload Make an random bit array (e.g. 1101...) Conver

Larry Holst 3 Dec 14, 2022
Tracing and Observability with OpenFaaS

Tracing and Observability with OpenFaaS Today we will walk through how to add OpenTracing or OpenTelemetry with Grafana's Tempo. For this walk-through

Lucas Roesler 8 Nov 17, 2022
API for SpeechAnalytics integration with FreePBX/Asterisk

freepbx_speechanalytics_api API for SpeechAnalytics integration with FreePBX/Asterisk Скопировать файл settings.py.sample в settings.py и отредактиров

Iqtek, LLC 3 Nov 03, 2022
Ingest openldap data into bloodhound

Bloodhound for Linux Ingest a dumped OpenLDAP ldif into neo4j to be visualized in Bloodhound. Usage: ./ldif_to_neo4j.py ./sample.ldif | cypher-shell -

Guillaume Quéré 71 Nov 09, 2022
This program can calculate the Aerial Distance between two cities.

Aerial_Distance_Calculator This program can calculate the Aerial Distance between two cities. This repository include both Jupyter notebook and Python

InvisiblePro 1 Apr 08, 2022
"Cambio de monedas" Change-making problem with Python, dynamic programming best solutions,

Change-making-problem / Cambio de monedas Entendiendo el problema Dada una cantidad de dinero y una lista de denominaciones de monedas, encontrar el n

Juan Antonio Ayola Cortes 1 Dec 08, 2021
A python mathematics module

A python mathematics module

Fayas Noushad 4 Nov 28, 2021
An interactive tool with which to explore the possible imaging performance of candidate ngEHT architectures.

ngEHTexplorer An interactive tool with which to explore the possible imaging performance of candidate ngEHT architectures. Welcome! ngEHTexplorer is a

Avery Broderick 7 Jan 28, 2022
kurwa deska ADB

kurwa-deska-ADB kurwa-deska Запуск Linux -- python3 kurwa_deska.py Termux -- python3 kurwa_deska.py Встановлення cd kurwa_deska ADB і зразу запуск pyt

1 Jan 21, 2022
Repository for my Monika Assistant project

Monika_Assistant Repository for my Monika Assistant project Major changes: Added face tracker Added manual daily log to see how long it takes me to fi

3 Jan 10, 2022
A Python wrapper for Matrix Synapse admin API

Synapse-admin-api-python A Python wrapper for Matrix Synapse admin API. Versioning This library now supports up to Synapse 1.45.0, any Admin API intro

Knugi 9 Sep 28, 2022
Project repository of Apache Airflow, deployed on Docker in Amazon EC2 via GitLab.

Airflow on Docker in EC2 + GitLab's CI/CD Personal project for simple data pipeline using Airflow. Airflow will be installed inside Docker container,

Ammar Chalifah 13 Nov 29, 2022