add a School model

This commit is contained in:
stupidcomputer 2024-06-29 23:19:39 -05:00
parent 761b00eb49
commit de4575a2f0
7 changed files with 76 additions and 5 deletions

View File

@ -11,7 +11,8 @@ class LegislationBookAdmin(admin.ModelAdmin):
to_register = [
[models.LegislativeText, LegislativeTextAdmin],
[models.LegislationBook, LegislationBookAdmin],
[models.LegislationClassification]
[models.LegislationClassification],
[models.School],
]
for i in to_register:
admin.site.register(*i)

View File

@ -0,0 +1,26 @@
# Generated by Django 4.2.12 on 2024-06-30 03:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('explorer', '0007_legislativetext_category_legislativetext_country'),
]
operations = [
migrations.CreateModel(
name='School',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=256)),
],
),
migrations.AlterField(
model_name='legislativetext',
name='school',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='explorer.school'),
),
]

View File

@ -7,6 +7,25 @@ import fitz
from collections import namedtuple
def ForeignInstantiateIfNone(model, name):
"""
Search the model for instances by name.
If there's none, then create one.
"""
filtered = model.objects.filter(name__exact=name)
try:
return filtered[0]
except IndexError:
obj = model(name=name)
obj.save()
return obj
class School(models.Model):
name = models.CharField(max_length=256)
def __str__(self):
return self.name
class LegislationBook(models.Model):
class ConferenceType(models.TextChoices):
MIDDLE = "M", _("Middle School")
@ -47,6 +66,7 @@ class LegislationBook(models.Model):
return
for text in parsed.output:
text["school"] = ForeignInstantiateIfNone(School, text["school"])
text = LegislativeText(**text, from_book=self)
text.save()
@ -78,7 +98,7 @@ class LegislativeText(models.Model):
committee = models.IntegerField()
category = models.CharField(max_length=256)
docket_order = models.IntegerField()
school = models.CharField(max_length=256)
school = models.ForeignKey(School, on_delete=models.SET_NULL, null=True)
sponsors = models.CharField(max_length=256)
from_book = models.ForeignKey(LegislationBook, on_delete=models.CASCADE)
legislation_title = models.CharField(max_length=512)

View File

@ -13,7 +13,7 @@
<p><i>{{ legislation.assembly }}/{{ legislation.committee }}/{{ legislation.docket_order }}</i></p>
<p>Sponsored by {{ legislation.sponsors }} of {{ legislation.school }}</p>
<p>Sponsored by {{ legislation.sponsors }} of <a href="/explorer/schools/{{ legislation.school.id}}">{{ legislation.school }}</a></p>
<p>Presented as part of the <a href="/explorer/conference/{{ legislation.from_book.id }}">{{ legislation.from_book.name }}</a> conference</p>
</div>

View File

@ -0,0 +1,14 @@
{% extends "explorer/base.html" %}
{% block content %}
<link rel="stylesheet" type="text/css" href="/static/tn.css" />
<div class="boxed">
<h1>All bills by {{ school_name }}</h1>
<ul>
{% for text in legislation %}
<li><a href="/explorer/legislation/{{ text.id }}">{{ text.legislation_title }}</a></li>
{% endfor %}
</ul>
</div>
{% endblock content %}

View File

@ -9,5 +9,6 @@ urlpatterns = [
path("legislation/<int:legislation_id>/", views.view_legislation, name="viewleg"),
path("conference/<int:conference_id>/", views.view_conference, name="viewconf"),
path("topics/<int:classification_id>/", views.get_all_classified_by_id, name="classificationview"),
path("topics/", views.get_all_classifications, name="classificationview"),
path("topics/", views.get_all_classifications, name="classificationsview"),
path("schools/<int:school_id>/", views.get_all_by_school, name="schoolview"),
]

View File

@ -1,7 +1,7 @@
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse
from .models import LegislativeText, LegislationBook, LegislationClassification
from .models import LegislativeText, LegislationBook, LegislationClassification, School
from random import sample
@ -80,3 +80,12 @@ def get_all_classified_by_id(request, classification_id):
"legislation": matches,
"result_name": "All legislation in topic {}".format(classification.name)
})
def get_all_by_school(request, school_id):
school = get_object_or_404(School, pk=school_id)
return render(request, "explorer/school.html", {
"school_name": school.name,
"legislation": school.legislativetext_set.all()
})