Skip to content

Commit

Permalink
Timeline view
Browse files Browse the repository at this point in the history
  • Loading branch information
BackSlasher committed May 18, 2023
1 parent ae8d03a commit aa65305
Show file tree
Hide file tree
Showing 9 changed files with 162 additions and 5 deletions.
46 changes: 46 additions & 0 deletions djang/versions/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,43 @@
from .models import Law, Revision


class SliderWidget(forms.Widget):
template_name = "versions/slider.html"

def __init__(self):
super().__init__()
self.disabled = True

def get_context(self, name, value, attrs):
ret = super().get_context(name, value, attrs)
if not self.disabled:
ret["widget"]["steps"] = self.steps
ret["widget"]["min"] = self.min
ret["widget"]["max"] = self.max
return ret

def set_law(self, law):
self.law = law
revisions = law.revision_set.filter(effective_date_start__isnull=False)
if not revisions.exists():
self.disabled = True
return

self.disabled = False

revisions = revisions.order_by("effective_date_start").values(
"effective_date_start"
)
dates = [r["effective_date_start"] for r in revisions]
earliest = dates[0]
latest = dates[-1]
steps = dates

self.min = earliest.strftime("%s")
self.max = latest.strftime("%s")
self.steps = [{"value": s.strftime("%s"), "label": s} for s in steps]


class RevisionModelChoiceField(forms.ModelChoiceField):
def __init__(self, *args, **kwargs):
kwargs["queryset"] = None
Expand Down Expand Up @@ -37,3 +74,12 @@ def __init__(self, law, *args, **kwargs):
self.law = law
self.fields["version_a"].set_law(law)
self.fields["version_b"].set_law(law)


class TimelineForm(forms.Form):
timey = forms.IntegerField(widget=SliderWidget())

def __init__(self, law, *args, **kwargs):
super().__init__(*args, **kwargs)
self.law = law
self.fields["timey"].widget.set_law(law)
17 changes: 17 additions & 0 deletions djang/versions/migrations/0002_alter_law_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2 on 2023-05-18 11:51

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("versions", "0001_initial"),
]

operations = [
migrations.AlterField(
model_name="law",
name="name",
field=models.CharField(max_length=250),
),
]
17 changes: 17 additions & 0 deletions djang/versions/migrations/0003_alter_revision_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2 on 2023-05-18 11:51

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("versions", "0002_alter_law_name"),
]

operations = [
migrations.AlterField(
model_name="revision",
name="name",
field=models.CharField(max_length=251),
),
]
14 changes: 12 additions & 2 deletions djang/versions/models.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
from django.db import models
from datetime import date


class Law(models.Model):
# implicit ID
wiki_page_id = models.IntegerField(unique=True)
knesset_id = models.IntegerField(unique=True, null=True)
akn_id = models.IntegerField(unique=True, null=True)
name = models.CharField(max_length=50)
name = models.CharField(max_length=250)
# revisions: Can be calculated


Expand All @@ -17,7 +18,16 @@ class Revision(models.Model):
akn_id = models.IntegerField(
unique=True, null=True
) # TODO do we need these both here and above?
name = models.CharField(max_length=51)
name = models.CharField(max_length=251)
effective_date_start = models.DateField(null=True)
effective_date_end = models.DateField(null=True)
# source_text - will do later

@classmethod
def get_by_law_and_epoch(cls, law, epoch):
d = date.fromtimestamp(epoch)
return (
law.revision_set.filter(effective_date_start__lte=d)
.order_by("-effective_date_start")
.first()
)
9 changes: 9 additions & 0 deletions djang/versions/templates/versions/slider.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% if not widget.disabled %}
<br> {# to match the slider and the datalist #}
<input name="{{ widget.name }}" {% include "django/forms/widgets/attrs.html" %} type="range" min="{{widget.min}}" max="{{widget.max}}" {% if widget.value %} value="{{widget.value}}" {%endif%} class="slider" list="{{widget.name}}_steplist">
<datalist id="{{widget.name}}_steplist">
{% for step in widget.steps %}
<option value="{{ step.value }}" label="{{step.label}}"></option>
{% endfor %}
</datalist>
{% endif %}
29 changes: 29 additions & 0 deletions djang/versions/templates/versions/timeline.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% extends 'versions/base.html' %}
{% block content %}
<style>
datalist {
display: flex;
flex-direction: column;
justify-content: space-between;
writing-mode: vertical-lr;
width: 200px;
}
</style>

<div class="container">
<h1>Law comparison</h1>
<h4>{{ law.name }}</h4>
<div class="card mb-4 rounded-3 shadow-sm">
<div class="card-header py-3">
<form method="get">
{{ form.as_p }}
<input type="submit" value="compare" />
</form>
</div>
<div class="card-body">
<div class="row" dir="rtl">{{ output | safe | linebreaks }}</div>
</div>
</div>
</div>
{% endblock content %}

2 changes: 1 addition & 1 deletion djang/versions/templates/versions/version_compare.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{% block content %}
<div class="container">
<h1>Law comparison</h1>
<h4>{{ law.name }}</h4>
<h4>{{ law.name }} (<a href="{% url 'versions:timeline' pk=law.pk%}">timeline</a>)</h4>
<div class="card mb-4 rounded-3 shadow-sm">
<div class="card-header py-3">
<form method="get">
Expand Down
1 change: 1 addition & 0 deletions djang/versions/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@
urlpatterns = [
path("", views.LawChooseView.as_view(), name="home"),
path("compare/<pk>", views.VersionCompareView.as_view(), name="compare"),
path("timeline/<pk>", views.VersionTimelineView.as_view(), name="timeline"),
]
32 changes: 30 additions & 2 deletions djang/versions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from django.views.generic.edit import FormView

from .models import Law, Revision
from .forms import CompareForm
from .services.diff import diff
from .forms import CompareForm, TimelineForm
from .services.diff import diff, get_content

# Create your views here.

Expand Down Expand Up @@ -50,3 +50,31 @@ def get_form_kwargs(self):
ret["law"] = law

return ret


class VersionTimelineView(FormView):
template_name = "versions/timeline.html"
form_class = TimelineForm

def get_context_data(self, **kwargs):
ret = super().get_context_data(**kwargs)
form = self.get_form()

if form.law:
ret["law"] = form.law

if form.is_valid():
revision = Revision.get_by_law_and_epoch(
form.law, form.cleaned_data["timey"]
)
ret["output"] = get_content(revision)

return ret

def get_form_kwargs(self):
ret = super().get_form_kwargs()
ret["data"] = self.request.GET
pk = self.kwargs.get("pk")
law = Law.objects.get(pk=pk)
ret["law"] = law
return ret

0 comments on commit aa65305

Please sign in to comment.