diff --git a/.coveragerc b/.coveragerc index 888a6f2..c4db028 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,3 +2,4 @@ omit = opencivicdata/tests/* opencivicdata/*/migrations/* opencivicdata/*/admin/* + opencivicdata/events/admin.py diff --git a/opencivicdata/events/__init__.py b/opencivicdata/events/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/opencivicdata/legislative/admin/event.py b/opencivicdata/events/admin.py similarity index 99% rename from opencivicdata/legislative/admin/event.py rename to opencivicdata/events/admin.py index 33d211c..ff7a2e6 100644 --- a/opencivicdata/legislative/admin/event.py +++ b/opencivicdata/events/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.template import defaultfilters from opencivicdata.core.admin import base -from .. import models +from . import models @admin.register(models.EventLocation) diff --git a/opencivicdata/events/apps.py b/opencivicdata/events/apps.py new file mode 100644 index 0000000..7e4c430 --- /dev/null +++ b/opencivicdata/events/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +import os + + +class BaseConfig(AppConfig): + name = "opencivicdata.events" + verbose_name = "Open Civic Data - Events" + path = os.path.dirname(__file__) diff --git a/opencivicdata/events/migrations/0001_initial.py b/opencivicdata/events/migrations/0001_initial.py new file mode 100644 index 0000000..fb03509 --- /dev/null +++ b/opencivicdata/events/migrations/0001_initial.py @@ -0,0 +1,388 @@ +# Generated by Django 2.2.3 on 2020-01-10 15:58 + +import django.contrib.gis.db.models.fields +import django.contrib.postgres.fields +import django.contrib.postgres.fields.jsonb +import django.core.validators +from django.db import migrations, models +import opencivicdata.core.models.base +import re +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Event", + fields=[ + ( + "created_at", + models.DateTimeField( + auto_now_add=True, help_text="The date and time of creation." + ), + ), + ( + "updated_at", + models.DateTimeField( + auto_now=True, help_text="The date and time of the last update." + ), + ), + ( + "extras", + django.contrib.postgres.fields.jsonb.JSONField( + blank=True, + default=dict, + help_text="A key-value store for storing arbitrary information not covered elsewhere.", + ), + ), + ( + "locked_fields", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(), + blank=True, + default=list, + size=None, + ), + ), + ( + "id", + opencivicdata.core.models.base.OCDIDField( + ocd_type="event", + serialize=False, + validators=[ + django.core.validators.RegexValidator( + flags=re.RegexFlag(32), + message="ID must match ^ocd-event/[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$", + regex="^ocd-event/[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$", + ) + ], + ), + ), + ("name", models.CharField(max_length=1000)), + ("description", models.TextField()), + ("classification", models.CharField(max_length=100)), + ("start_date", models.CharField(max_length=25)), + ("end_date", models.CharField(blank=True, max_length=25)), + ("all_day", models.BooleanField(default=False)), + ( + "status", + models.CharField( + choices=[ + ("cancelled", "Cancelled"), + ("tentative", "Tentative"), + ("confirmed", "Confirmed"), + ("passed", "Passed"), + ], + max_length=20, + ), + ), + ], + options={"db_table": "opencivicdata_event", "managed": False,}, + ), + migrations.CreateModel( + name="EventAgendaItem", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("description", models.TextField()), + ( + "classification", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(), + blank=True, + default=list, + size=None, + ), + ), + ("order", models.CharField(blank=True, max_length=100)), + ( + "subjects", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(), + blank=True, + default=list, + size=None, + ), + ), + ( + "notes", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(), + blank=True, + default=list, + size=None, + ), + ), + ( + "extras", + django.contrib.postgres.fields.jsonb.JSONField( + blank=True, default=dict + ), + ), + ], + options={"db_table": "opencivicdata_eventagendaitem", "managed": False,}, + ), + migrations.CreateModel( + name="EventAgendaMedia", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("note", models.CharField(max_length=300)), + ("date", models.CharField(blank=True, max_length=25)), + ("offset", models.PositiveIntegerField(null=True)), + ], + options={"db_table": "opencivicdata_eventagendamedia", "managed": False,}, + ), + migrations.CreateModel( + name="EventAgendaMediaLink", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("media_type", models.CharField(max_length=100)), + ("url", models.URLField(max_length=2000)), + ("text", models.TextField(blank=True, default="")), + ], + options={ + "db_table": "opencivicdata_eventagendamedialink", + "managed": False, + }, + ), + migrations.CreateModel( + name="EventDocument", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("note", models.CharField(max_length=300)), + ("date", models.CharField(blank=True, max_length=25)), + ( + "classification", + models.CharField( + blank=True, + choices=[ + ("agenda", "Agenda"), + ("minutes", "Minutes"), + ("transcript", "Transcript"), + ("testimony", "Testimony"), + ], + max_length=50, + ), + ), + ], + options={"db_table": "opencivicdata_eventdocument", "managed": False,}, + ), + migrations.CreateModel( + name="EventDocumentLink", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("media_type", models.CharField(max_length=100)), + ("url", models.URLField(max_length=2000)), + ("text", models.TextField(blank=True, default="")), + ], + options={"db_table": "opencivicdata_eventdocumentlink", "managed": False,}, + ), + migrations.CreateModel( + name="EventLink", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ( + "note", + models.CharField( + blank=True, + help_text="A short, optional note related to an object.", + max_length=300, + ), + ), + ( + "url", + models.URLField( + help_text="A hyperlink related to an object.", max_length=2000 + ), + ), + ], + options={"db_table": "opencivicdata_eventlink", "managed": False,}, + ), + migrations.CreateModel( + name="EventLocation", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("name", models.CharField(max_length=200)), + ("url", models.URLField(blank=True, max_length=2000)), + ( + "coordinates", + django.contrib.gis.db.models.fields.PointField( + null=True, srid=4326 + ), + ), + ], + options={"db_table": "opencivicdata_eventlocation", "managed": False,}, + ), + migrations.CreateModel( + name="EventMedia", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("note", models.CharField(max_length=300)), + ("date", models.CharField(blank=True, max_length=25)), + ("offset", models.PositiveIntegerField(null=True)), + ( + "classification", + models.CharField( + blank=True, + choices=[ + ("audio recording", "Audio Recording"), + ("video recording", "Video Recording"), + ], + max_length=50, + ), + ), + ], + options={"db_table": "opencivicdata_eventmedia", "managed": False,}, + ), + migrations.CreateModel( + name="EventMediaLink", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("media_type", models.CharField(max_length=100)), + ("url", models.URLField(max_length=2000)), + ("text", models.TextField(blank=True, default="")), + ], + options={"db_table": "opencivicdata_eventmedialink", "managed": False,}, + ), + migrations.CreateModel( + name="EventParticipant", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("name", models.CharField(max_length=2000)), + ("entity_type", models.CharField(blank=True, max_length=20)), + ("note", models.TextField()), + ], + options={"db_table": "opencivicdata_eventparticipant", "managed": False,}, + ), + migrations.CreateModel( + name="EventRelatedEntity", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("name", models.CharField(max_length=2000)), + ("entity_type", models.CharField(blank=True, max_length=20)), + ("note", models.TextField()), + ], + options={"db_table": "opencivicdata_eventrelatedentity", "managed": False,}, + ), + migrations.CreateModel( + name="EventSource", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ( + "note", + models.CharField( + blank=True, + help_text="A short, optional note related to an object.", + max_length=300, + ), + ), + ( + "url", + models.URLField( + help_text="A hyperlink related to an object.", max_length=2000 + ), + ), + ], + options={"db_table": "opencivicdata_eventsource", "managed": False,}, + ), + ] diff --git a/opencivicdata/events/migrations/0002_auto_20200110_1558.py b/opencivicdata/events/migrations/0002_auto_20200110_1558.py new file mode 100644 index 0000000..69a3e8c --- /dev/null +++ b/opencivicdata/events/migrations/0002_auto_20200110_1558.py @@ -0,0 +1,26 @@ +# Generated by Django 2.2.3 on 2020-01-10 15:58 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("events", "0001_initial"), + ] + + operations = [ + migrations.AlterModelOptions(name="event", options={},), + migrations.AlterModelOptions(name="eventagendaitem", options={},), + migrations.AlterModelOptions(name="eventagendamedia", options={},), + migrations.AlterModelOptions(name="eventagendamedialink", options={},), + migrations.AlterModelOptions(name="eventdocument", options={},), + migrations.AlterModelOptions(name="eventdocumentlink", options={},), + migrations.AlterModelOptions(name="eventlink", options={},), + migrations.AlterModelOptions(name="eventlocation", options={},), + migrations.AlterModelOptions(name="eventmedia", options={},), + migrations.AlterModelOptions(name="eventmedialink", options={},), + migrations.AlterModelOptions(name="eventparticipant", options={},), + migrations.AlterModelOptions(name="eventrelatedentity", options={},), + migrations.AlterModelOptions(name="eventsource", options={},), + ] diff --git a/opencivicdata/events/migrations/__init__.py b/opencivicdata/events/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/opencivicdata/legislative/models/event.py b/opencivicdata/events/models.py similarity index 98% rename from opencivicdata/legislative/models/event.py rename to opencivicdata/events/models.py index a3d98a4..f652223 100644 --- a/opencivicdata/legislative/models/event.py +++ b/opencivicdata/events/models.py @@ -9,9 +9,8 @@ MimetypeLinkBase, ) from opencivicdata.core.models import Jurisdiction -from .bill import Bill -from .vote import VoteEvent -from ...common import ( +from opencivicdata.legislative.models import Bill, VoteEvent +from ..common import ( EVENT_MEDIA_CLASSIFICATION_CHOICES, EVENT_DOCUMENT_CLASSIFICATION_CHOICES, ) diff --git a/opencivicdata/legislative/admin/__init__.py b/opencivicdata/legislative/admin/__init__.py index 9c8fd41..9a3ac18 100644 --- a/opencivicdata/legislative/admin/__init__.py +++ b/opencivicdata/legislative/admin/__init__.py @@ -1 +1 @@ -from . import bill, vote, event # noqa +from . import bill, vote # noqa diff --git a/opencivicdata/legislative/migrations/0013_auto_20200109_2255.py b/opencivicdata/legislative/migrations/0013_auto_20200109_2255.py new file mode 100644 index 0000000..73c5419 --- /dev/null +++ b/opencivicdata/legislative/migrations/0013_auto_20200109_2255.py @@ -0,0 +1,40 @@ +# Generated by Django 2.2.3 on 2020-01-09 22:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("legislative", "0012_billdocument_extras"), + ] + + operations = [ + migrations.AlterModelOptions(name="event", options={"managed": False},), + migrations.AlterModelOptions( + name="eventagendaitem", options={"managed": False}, + ), + migrations.AlterModelOptions( + name="eventagendamedia", options={"managed": False}, + ), + migrations.AlterModelOptions( + name="eventagendamedialink", options={"managed": False}, + ), + migrations.AlterModelOptions(name="eventdocument", options={"managed": False},), + migrations.AlterModelOptions( + name="eventdocumentlink", options={"managed": False}, + ), + migrations.AlterModelOptions(name="eventlink", options={"managed": False},), + migrations.AlterModelOptions(name="eventlocation", options={"managed": False},), + migrations.AlterModelOptions(name="eventmedia", options={"managed": False},), + migrations.AlterModelOptions( + name="eventmedialink", options={"managed": False}, + ), + migrations.AlterModelOptions( + name="eventparticipant", options={"managed": False}, + ), + migrations.AlterModelOptions( + name="eventrelatedentity", options={"managed": False}, + ), + migrations.AlterModelOptions(name="eventsource", options={"managed": False},), + ] diff --git a/opencivicdata/legislative/migrations/0014_auto_20200109_2259.py b/opencivicdata/legislative/migrations/0014_auto_20200109_2259.py new file mode 100644 index 0000000..2e3cd2f --- /dev/null +++ b/opencivicdata/legislative/migrations/0014_auto_20200109_2259.py @@ -0,0 +1,44 @@ +# Generated by Django 2.2.3 on 2020-01-09 22:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("legislative", "0013_auto_20200109_2255"), + ] + + operations = [ + migrations.RemoveField(model_name="eventagendaitem", name="event",), + migrations.RemoveField(model_name="eventagendamedia", name="agenda_item",), + migrations.RemoveField(model_name="eventagendamedialink", name="media",), + migrations.RemoveField(model_name="eventdocument", name="event",), + migrations.RemoveField(model_name="eventdocumentlink", name="document",), + migrations.RemoveField(model_name="eventlink", name="event",), + migrations.RemoveField(model_name="eventlocation", name="jurisdiction",), + migrations.RemoveField(model_name="eventmedia", name="event",), + migrations.RemoveField(model_name="eventmedialink", name="media",), + migrations.RemoveField(model_name="eventparticipant", name="event",), + migrations.RemoveField(model_name="eventparticipant", name="organization",), + migrations.RemoveField(model_name="eventparticipant", name="person",), + migrations.RemoveField(model_name="eventrelatedentity", name="agenda_item",), + migrations.RemoveField(model_name="eventrelatedentity", name="bill",), + migrations.RemoveField(model_name="eventrelatedentity", name="organization",), + migrations.RemoveField(model_name="eventrelatedentity", name="person",), + migrations.RemoveField(model_name="eventrelatedentity", name="vote_event",), + migrations.RemoveField(model_name="eventsource", name="event",), + migrations.DeleteModel(name="Event",), + migrations.DeleteModel(name="EventAgendaItem",), + migrations.DeleteModel(name="EventAgendaMedia",), + migrations.DeleteModel(name="EventAgendaMediaLink",), + migrations.DeleteModel(name="EventDocument",), + migrations.DeleteModel(name="EventDocumentLink",), + migrations.DeleteModel(name="EventLink",), + migrations.DeleteModel(name="EventLocation",), + migrations.DeleteModel(name="EventMedia",), + migrations.DeleteModel(name="EventMediaLink",), + migrations.DeleteModel(name="EventParticipant",), + migrations.DeleteModel(name="EventRelatedEntity",), + migrations.DeleteModel(name="EventSource",), + ] diff --git a/opencivicdata/legislative/models/__init__.py b/opencivicdata/legislative/models/__init__.py index 1fb7ab4..e3f866b 100644 --- a/opencivicdata/legislative/models/__init__.py +++ b/opencivicdata/legislative/models/__init__.py @@ -17,18 +17,3 @@ SearchableBill, ) from .vote import VoteEvent, VoteCount, PersonVote, VoteSource -from .event import ( - Event, - EventLocation, - EventMedia, - EventMediaLink, - EventDocument, - EventLink, - EventSource, - EventParticipant, - EventAgendaItem, - EventRelatedEntity, - EventAgendaMedia, - EventAgendaMediaLink, - EventDocumentLink, -) diff --git a/opencivicdata/tests/conftest.py b/opencivicdata/tests/conftest.py index d92526e..19fd08a 100644 --- a/opencivicdata/tests/conftest.py +++ b/opencivicdata/tests/conftest.py @@ -11,11 +11,10 @@ ) from opencivicdata.legislative.models import ( LegislativeSession, - Event, - EventLocation, VoteEvent, Bill, ) +from opencivicdata.events.models import Event, EventLocation from opencivicdata.elections.models import ( Election, ElectionIdentifier, diff --git a/opencivicdata/tests/test_settings.py b/opencivicdata/tests/test_settings.py index 5ade2f3..1fecc4f 100644 --- a/opencivicdata/tests/test_settings.py +++ b/opencivicdata/tests/test_settings.py @@ -3,6 +3,7 @@ INSTALLED_APPS = ( "opencivicdata.core.apps.BaseConfig", "opencivicdata.legislative.apps.BaseConfig", + "opencivicdata.events.apps.BaseConfig", "opencivicdata.elections.apps.BaseConfig", ) DATABASES = {