Skip to content

Commit

Permalink
codeforboston#284 - Renaming 'Source' to 'Organization' to match how …
Browse files Browse the repository at this point in the history
…the front-end refers to the concept.
  • Loading branch information
mnuzzose committed Aug 2, 2023
1 parent 0ad6ab6 commit 660fcb6
Show file tree
Hide file tree
Showing 13 changed files with 64 additions and 64 deletions.
20 changes: 10 additions & 10 deletions alembic/dev_seeds.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from backend.auth import user_manager
from backend.database.models.incident import Incident
from backend.database.models.perpetrator import Perpetrator
from backend.database.models.source import Source
from backend.database.models.organization import Organization
from backend.database.models.use_of_force import UseOfForce


Expand Down Expand Up @@ -61,17 +61,17 @@ def create_user(user):
)


def create_source(source):
source_exists = (
db.session.query(Source).filter_by(id=source.id).first() is not None
def create_organization(organization):
organization_exists = (
db.session.query(Organization).filter_by(id=organization.id).first() is not None
)

if not source_exists:
source.create()
if not organization_exists:
organization.create()


create_source(
Source(
create_organization(
Organization(
id="mpv",
name="Mapping Police Violence",
url="https://mappingpoliceviolence.us",
Expand All @@ -83,11 +83,11 @@ def create_source(source):
def create_incident(key=1, date="10-01-2019", lon=84, lat=34):
base_id = 10000000
id = base_id + key
mpv = db.session.query(Source).filter_by(
mpv = db.session.query(Organization).filter_by(
name="Mapping Police Violence").first()
incident = Incident(
id=id,
source=mpv,
organization=mpv,
location=f"Test location {key}",
longitude=lon,
latitude=lat,
Expand Down
6 changes: 3 additions & 3 deletions backend/auth/jwt.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def verify_roles_or_abort(min_role):
return True


def verify_contributor_has_source_or_abort():
def verify_contributor_has_organization_or_abort():
verify_jwt_in_request()
jwt_decoded = get_jwt()
current_user = User.get(jwt_decoded["sub"])
Expand Down Expand Up @@ -59,11 +59,11 @@ def decorator(*args, **kwargs):

return wrapper

def contributor_has_source():
def contributor_has_organization():
def wrapper(fn):
@wraps(fn)
def decorator(*args, **kwargs):
if verify_contributor_has_source_or_abort():
if verify_contributor_has_organization_or_abort():
return fn(*args, **kwargs)

return decorator
Expand Down
2 changes: 1 addition & 1 deletion backend/database/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@
from .models.use_of_force import *
from .models.user import *
from .models.victim import *
from .models.source import *
from .models.organization import *
6 changes: 3 additions & 3 deletions backend/database/models/_assoc_tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ def get_value(self):
return 5


source_user = db.Table(
'source_user',
db.Column('source_id', db.String, db.ForeignKey('source.id'),
organization_user = db.Table(
'organization_user',
db.Column('organization_id', db.String, db.ForeignKey('organization.id'),
primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('user.id'),
primary_key=True),
Expand Down
14 changes: 7 additions & 7 deletions backend/database/models/incident.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ class Incident(db.Model, CrudMixin):
"""The incident table is the fact table."""

id = db.Column(db.Integer, primary_key=True, autoincrement=True)
source_id = db.Column(
db.String, db.ForeignKey("source.id"))
source_details = db.relationship(
"SourceDetails", backref="incident", uselist=False)
organization_id = db.Column(
db.String, db.ForeignKey("organization.id"))
organization_details = db.relationship(
"OrganizationDetails", backref="incident", uselist=False)
time_of_incident = db.Column(db.DateTime)
time_confidence = db.Column(db.Integer)
complaint_date = db.Column(db.Date)
Expand Down Expand Up @@ -114,7 +114,7 @@ def __repr__(self):
# text = db.Column(db.Text)
# type = db.Column(db.Text) # TODO: enum
# TODO: are there rules for this column other than text?
# source = db.Column(db.Text)
# organization_id = db.Column(db.Text)
# location = db.Column(db.Text) # TODO: location object
# # TODO: neighborhood seems like a weird identifier that may not always
# # apply in consistent ways across municipalities.
Expand All @@ -131,8 +131,8 @@ def __repr__(self):
# case_id = db.Column(db.Integer) # TODO: foreign key of some sort?


class SourceDetails(db.Model):
id = db.Column(db.Integer, primary_key=True) # source details id
class OrganizationDetails(db.Model):
id = db.Column(db.Integer, primary_key=True) # organization details id
incident_id = db.Column(
db.Integer, db.ForeignKey("incident.id"), nullable=False
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from ..core import db, CrudMixin
from backend.database.models._assoc_tables import source_user
from backend.database.models._assoc_tables import organization_user


class Source(db.Model, CrudMixin):
class Organization(db.Model, CrudMixin):
id = db.Column(db.String, primary_key=True)
name = db.Column(db.Text)
url = db.Column(db.Text)
contact_email = db.Column(db.Text)
reported_incidents = db.relationship(
'Incident', backref='source', lazy="select")
'Incident', backref='organization', lazy="select")
members = db.relationship(
'User', backref='contributor_orgs',
secondary=source_user, lazy="select")
secondary=organization_user, lazy="select")
2 changes: 1 addition & 1 deletion backend/database/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class User(db.Model, UserMixin, CrudMixin):
phone_number = db.Column(db.Text)

member_of = db.relationship(
'Source', backref='source', secondary='source_user', lazy="select")
'Organization', backref='organization', secondary='organization_user', lazy="select")

def verify_password(self, pw):
return bcrypt.checkpw(pw.encode("utf8"), self.password.encode("utf8"))
4 changes: 2 additions & 2 deletions backend/routes/incidents.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from datetime import datetime
from typing import Optional

from backend.auth.jwt import min_role_required, contributor_has_source
from backend.auth.jwt import min_role_required, contributor_has_organization
from backend.database.models.user import UserRole
from flask import Blueprint, abort, current_app, request
from flask_jwt_extended.view_decorators import jwt_required
Expand Down Expand Up @@ -31,7 +31,7 @@ def get_incidents(incident_id: int):
@bp.route("/create", methods=["POST"])
@jwt_required()
@min_role_required(UserRole.CONTRIBUTOR)
@contributor_has_source()
@contributor_has_organization()
@validate(json=CreateIncidentSchema)
def create_incident():
"""Create a single incident.
Expand Down
8 changes: 4 additions & 4 deletions backend/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

from .database import User
from .database.models.action import Action
from .database.models.source import Source
from .database.models.incident import Incident, SourceDetails
from .database.models.organization import Organization
from .database.models.incident import Incident, OrganizationDetails
from .database.models.agency import Agency
from .database.models.officer import Officer
from .database.models.investigation import Investigation
Expand Down Expand Up @@ -129,13 +129,13 @@ def schema_create(model_type: DeclarativeMeta, **kwargs) -> ModelMetaclass:
return sqlalchemy_to_pydantic(model_type, exclude="id", **kwargs)


CreateSourceSchema = schema_create(Source)
CreateOrganizationSchema = schema_create(Organization)
_BaseCreateIncidentSchema = schema_create(Incident)
CreateOfficerSchema = schema_create(Officer)
CreateAgencySchema = schema_create(Agency)
CreateVictimSchema = schema_create(Victim)
CreatePerpetratorSchema = schema_create(Perpetrator)
CreateSourceDetailsSchema = schema_create(SourceDetails)
CreateOrganizationDetailsSchema = schema_create(OrganizationDetails)
CreateTagSchema = schema_create(Tag)
CreateParticipantSchema = schema_create(Participant)
CreateAttachmentSchema = schema_create(Attachment)
Expand Down
6 changes: 3 additions & 3 deletions backend/scraper/data_scrapers/load_full_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def row_to_orm(row):
row = row._make(map(nan_to_none, row))
incident_date = parse_date(row.incident_date)
incident_time = parse_date(row.incident_time)
source = row.data_source_id
organization_id = row.data_source_id
use_of_force = row.death_manner
location = orm_location(row)

Expand All @@ -78,8 +78,8 @@ def row_to_orm(row):
incident.description = row.description
if use_of_force:
incident.use_of_force = [UseOfForce(item=use_of_force)]
if source:
incident.source = source
if organization_id:
incident.organization_id = organization_id

return incident

Expand Down
16 changes: 8 additions & 8 deletions backend/scraper/data_scrapers/scraper_utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def parse_accusations(r: namedtuple, officers: List[md.Officer]):
]


def create_orm(r: namedtuple, source):
def create_orm(r: namedtuple, organization):
victim = md.Victim(
name=r.victim_name,
race=r.victim_race,
Expand All @@ -72,8 +72,8 @@ def create_orm(r: namedtuple, source):
officers = parse_officers(r)
accusations = parse_accusations(r, officers)
incident = md.Incident(
source_id=r.source_id,
source=source,
organization_id=r.organization_id,
organization=organization,
time_of_incident=r.incident_date,
location=location(r),
description=r.description,
Expand All @@ -100,12 +100,12 @@ def insert_model(instance):
db.session.commit()


def drop_existing_records(dataset, source):
def drop_existing_records(dataset, organization):
with app.app_context():
existing_source_ids = list(
existing_organization_ids = list(
s
for (s,) in db.session.query(md.Incident.source_id).filter(
md.Incident.source == source, md.Incident.source_id is not None
for (s,) in db.session.query(md.Incident.organization_id).filter(
md.Incident.organization == organization, md.Incident.organization_id is not None
)
)
return dataset.drop(existing_source_ids)
return dataset.drop(existing_organization_ids)
20 changes: 10 additions & 10 deletions backend/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from backend.api import create_app
from backend.auth import user_manager
from backend.config import TestingConfig
from backend.database import User, UserRole, db, Source, source_user
from backend.database import User, UserRole, db, Organization, organization_user
from backend.database.models._assoc_tables import MemberRole
from datetime import datetime
from pytest_postgresql.janitor import DatabaseJanitor
Expand Down Expand Up @@ -55,16 +55,16 @@ def client(app):


@pytest.fixture
def example_source(db_session):
source = Source(
id="example_source",
name="Example Source",
def example_organization(db_session):
organization = Organization(
id="example_organization",
name="Example Organization",
url = "www.example.com",
contact_email=contributor_email,
)
db_session.add(source)
db_session.add(organization)
db_session.commit()
return source
return organization

@pytest.fixture
def example_user(db_session):
Expand Down Expand Up @@ -97,7 +97,7 @@ def admin_user(db_session):


@pytest.fixture
def contributor_user(db_session, example_source):
def contributor_user(db_session, example_organization):
user = User(
email=contributor_email,
password=user_manager.hash_password(example_password),
Expand All @@ -107,8 +107,8 @@ def contributor_user(db_session, example_source):
)
db_session.add(user)
db_session.commit()
insert_statement = insert(source_user).values(
source_id=example_source.id, user_id=user.id,
insert_statement = insert(organization_user).values(
organization_id=example_organization.id, user_id=user.id,
role=MemberRole.PUBLISHER, joined_at=datetime.now(),
is_active=True, is_admin=False
)
Expand Down
16 changes: 8 additions & 8 deletions backend/tests/test_incidents.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from datetime import datetime

import pytest
from backend.database import Incident, Source
from backend.database import Incident, Organization

mock_sources = {
mock_organizations = {
"cpdp": {"name": "Citizens Police Data Project"},
"mpv": {"name": "Mapping Police Violence"},
}
Expand All @@ -17,7 +17,7 @@
{"first_name": "Lisa", "last_name": "Wong"},
],
"use_of_force": [{"item": "Injurious restraint"}],
"source": "Citizens Police Data Project",
"organization": "Citizens Police Data Project",
"location": "123 Right St Chicago, IL",
},
"traffic": {
Expand All @@ -27,7 +27,7 @@
{"first_name": "Ronda", "last_name": "Sousa"},
],
"use_of_force": [{"item": "verbalization"}],
"source": "Mapping Police Violence",
"organization": "Mapping Police Violence",
"location": "Park St and Boylston Boston",
},
"firearm": {
Expand All @@ -37,23 +37,23 @@
{"first_name": "Dale", "last_name": "Green"},
],
"use_of_force": [{"item": "indirect firearm"}],
"source": "Citizens Police Data Project",
"organization": "Citizens Police Data Project",
"location": "CHICAGO ILLINOIS",
},
"missing_fields": {
"description": "Robbery",
"perpetrators": [
{"first_name": "Dale", "last_name": "Green"},
],
"source": "Citizens Police Data Project",
"organization": "Citizens Police Data Project",
},
}


@pytest.fixture
def example_incidents(db_session, client, contributor_access_token):
for id, mock in mock_sources.items():
db_session.add(Source(id=id, **mock))
for id, mock in mock_organizations.items():
db_session.add(Organization(id=id, **mock))
db_session.commit()

created = {}
Expand Down

0 comments on commit 660fcb6

Please sign in to comment.