Skip to content

Commit

Permalink
Merge branch 'release/0.1.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
lukavdplas committed Feb 21, 2024
2 parents 64e4c16 + bbd2f8a commit 35205f8
Show file tree
Hide file tree
Showing 32 changed files with 1,150 additions and 34 deletions.
4 changes: 3 additions & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ authors:
- name: 'Research Software Lab, Centre for Digital Humanities, Utrecht University'
website: 'https://cdh.uu.nl/rsl/'
repository-code: 'https://github.com/CentreForDigitalHumanities/lettercraft'
license: BSD-3
license: BSD-3-Clause
version: 0.1.0
date-released: '2024-02-21'
57 changes: 53 additions & 4 deletions backend/conftest.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,42 @@
import pytest
from case_study.models import CaseStudy
from letter.models import Letter
from event.models import EpistolaryEvent, LetterAction, LetterActionCategory
from person.models import Person, PersonDateOfBirth, PersonName
from event.models import (
EpistolaryEvent,
LetterAction,
LetterActionCategory,
WorldEvent,
LetterEventDate,
)
from person.models import Person


@pytest.fixture()
def letter(db):
letter = Letter.objects.create()
letter.name = "letter for testing"
letter.save()
return letter


@pytest.fixture()
def person(db):
person = Person.objects.create()
person.name = "Bert"
person.save()
return person


@pytest.fixture()
def letter_action(db, letter, person):
def person_2(db):
person = Person.objects.create()
person.name = "Ernie"
person.save()
return person


@pytest.fixture()
def letter_action_writing(db, letter, person):
letter_action = LetterAction.objects.create()
letter_action.letters.add(letter)
letter_action.actors.add(person)
Expand All @@ -28,6 +46,28 @@ def letter_action(db, letter, person):
value="write",
)

LetterEventDate.objects.create(
year_lower=500, year_upper=500, year_exact=500, letter_action=letter_action
)

return letter_action


@pytest.fixture()
def letter_action_reading(db, letter, person_2):
letter_action = LetterAction.objects.create()
letter_action.letters.add(letter)
letter_action.actors.add(person_2)

LetterActionCategory.objects.create(
letter_action=letter_action,
value="read",
)

LetterEventDate.objects.create(
year_lower=505, year_upper=510, letter_action=letter_action
)

return letter_action


Expand All @@ -40,7 +80,16 @@ def case_study(db):
@pytest.fixture()
def epistolary_event(db, letter, case_study):
epistolary_event = EpistolaryEvent.objects.create(
name="Test Epistolary event", note="Test note", case_studies=[case_study]
name="Test Epistolary event", note="Test note"
)
epistolary_event.case_studies.add(case_study)

return epistolary_event


@pytest.fixture()
def world_event(db):
world_event = WorldEvent.objects.create(
name="Test World Event", note="Test World Event note", year_exact=612
)
return world_event
6 changes: 6 additions & 0 deletions backend/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ class LettercraftDate(models.Model):
help_text="The exact year of the value (if known). This will override the values in the lower and upper bounds fields.",
)

@property
def display_date(self):
if self.year_exact:
return str(self.year_exact)
return f"c. {self.year_lower}{self.year_upper}"

class Meta:
abstract = True

Expand Down
54 changes: 53 additions & 1 deletion backend/event/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib import admin
from source.admin import ReferenceInlineAdmin
from . import models


Expand Down Expand Up @@ -38,14 +39,22 @@ class LetterActionLettersAdmin(admin.StackedInline):
verbose_name = "letter"
verbose_name_plural = "letters"

class LetterActionGiftsAdmin(admin.StackedInline):
model = models.LetterAction.gifts.through
extra = 0
verbose_name = "gift"
verbose_name_plural = "gifts"

@admin.register(models.LetterAction)
class LetterActionAdmin(admin.ModelAdmin):
list_display=["description", "display_date"]
inlines = [
LetterActionLettersAdmin,
LetterActionCategoryAdmin,
LetterActionGiftsAdmin,
EventDateAdmin,
RoleAdmin,
ReferenceInlineAdmin,
]
exclude = ["letters"]

Expand All @@ -71,11 +80,54 @@ class EpistolaryEventLetterActionInline(admin.StackedInline):
verbose_name_plural = "letter actions"
verbose_name = "relationship between a epistolary event and a letter action"


class EpistolaryEventsTriggeredWorldEventsInline(admin.StackedInline):
model = models.EpistolaryEvent.triggered_world_events.through
fields = ["world_event", "certainty", "note"]
extra = 0
verbose_name = "World event triggered by this epistolary event"
verbose_name_plural = "World events triggered by this epistolary event"

class EpistolaryEventsTriggeredEpistolaryEventsInline(admin.StackedInline):
model = models.EpistolaryEvent.triggered_epistolary_events.through
fk_name = "triggering_epistolary_event"
fields = ["triggered_epistolary_event", "certainty", "note"]
extra = 0
verbose_name = "Epistolary event triggered by this epistolary event"
verbose_name_plural = "Epistolary events triggered by this epistolary event"


@admin.register(models.EpistolaryEvent)
class EpistolaryEventAdmin(admin.ModelAdmin):
fields = ["name", "note"]
inlines = [
EpistolaryEventCaseStudyInline,
EpistolaryEventLetterActionInline
EpistolaryEventLetterActionInline,
EpistolaryEventsTriggeredWorldEventsInline,
EpistolaryEventsTriggeredEpistolaryEventsInline
]

class WorldEventsTriggeredEpistolaryEventsInline(admin.StackedInline):
model = models.WorldEvent.triggered_epistolary_events.through
fields = ["epistolary_event", "certainty", "note"]
extra = 0
verbose_name = "Epistolary event triggered by this world event"
verbose_name_plural = "Epistolary events triggered by this world event"


class WorldEventsTriggeredWorldEventsInline(admin.StackedInline):
model = models.WorldEvent.triggered_world_events.through
fk_name = "triggering_world_event"
fields = ["triggered_world_event", "certainty", "note"]
extra = 0
verbose_name = "World event triggered by this world event"
verbose_name_plural = "World events triggered by this world event"


@admin.register(models.WorldEvent)
class WorldEventAdmin(admin.ModelAdmin):
fields = ["name", "note", "year_exact", "year_lower", "year_upper"]
inlines = [
WorldEventsTriggeredEpistolaryEventsInline,
WorldEventsTriggeredWorldEventsInline
]
2 changes: 1 addition & 1 deletion backend/event/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
class EventConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'event'
verbose_name = 'epistolary episodes and actions'
verbose_name = 'events and actions'
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 4.2.7 on 2024-02-05 16:14

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('event', '0002_alter_lettereventdate_year_exact_and_more'),
]

operations = [
migrations.CreateModel(
name='EpistolaryEventTrigger',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('epistolary_event', models.ForeignKey(help_text='The epistolary event that was triggered by a world event', on_delete=django.db.models.deletion.CASCADE, to='event.epistolaryevent')),
],
),
migrations.CreateModel(
name='WorldEvent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('year_lower', models.IntegerField(default=400, help_text='The earliest possible year for this value', validators=[django.core.validators.MinValueValidator(400), django.core.validators.MaxValueValidator(800)])),
('year_upper', models.IntegerField(default=800, help_text='The latest possible year for this value', validators=[django.core.validators.MinValueValidator(400), django.core.validators.MaxValueValidator(800)])),
('year_exact', models.IntegerField(blank=True, help_text='The exact year of the value (if known). This will override the values in the lower and upper bounds fields.', null=True, validators=[django.core.validators.MinValueValidator(400), django.core.validators.MaxValueValidator(800)])),
('name', models.CharField(help_text="The name of the event, e.g. 'The Great Fire of London' or 'The Battle of Hastings'.", max_length=256)),
('note', models.TextField(blank=True, help_text='Additional notes that describe the event and its relevance to the letters.')),
('epistolary_events', models.ManyToManyField(related_name='triggers', through='event.EpistolaryEventTrigger', to='event.epistolaryevent')),
],
options={
'abstract': False,
},
),
migrations.AddField(
model_name='epistolaryeventtrigger',
name='world_event',
field=models.ForeignKey(help_text='The world event that triggered an epistolary event', on_delete=django.db.models.deletion.CASCADE, to='event.worldevent'),
),
]
18 changes: 18 additions & 0 deletions backend/event/migrations/0004_alter_role_role.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-02-09 12:40

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('event', '0003_epistolaryeventtrigger_worldevent_and_more'),
]

operations = [
migrations.AlterField(
model_name='role',
name='role',
field=models.CharField(choices=[('author', 'Author'), ('scribe', 'Scribe'), ('reader', 'Reader'), ('witness', 'Witness'), ('messenger', 'Messenger'), ('recipient', 'Recipient'), ('intended_recipient', 'Intended recipient'), ('audience', 'Audience'), ('intended_audience', 'Intended audience'), ('instigator', 'Instigator'), ('other', 'Other')], help_text='Role of this person in the event'),
),
]
19 changes: 19 additions & 0 deletions backend/event/migrations/0005_letteraction_gifts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-02-09 14:20

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('letter', '0007_gift'),
('event', '0004_alter_role_role'),
]

operations = [
migrations.AddField(
model_name='letteraction',
name='gifts',
field=models.ManyToManyField(help_text='Gifts associated to this letter action', related_name='letter_actions', to='letter.gift'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Generated by Django 4.2.7 on 2024-02-15 13:07

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('event', '0005_letteraction_gifts'),
]

operations = [
migrations.RemoveField(
model_name='worldevent',
name='epistolary_events',
),
migrations.AddField(
model_name='epistolaryevent',
name='triggered_world_events',
field=models.ManyToManyField(help_text='World events triggered by this epistolary event', related_name='world_event_triggers', through='event.EpistolaryEventTrigger', to='event.worldevent'),
),
migrations.AddField(
model_name='epistolaryeventtrigger',
name='certainty',
field=models.IntegerField(choices=[(0, 'uncertain'), (1, 'somewhat certain'), (2, 'certain')], default=2, help_text='How certain are you of this value?'),
),
migrations.AddField(
model_name='epistolaryeventtrigger',
name='note',
field=models.TextField(blank=True, help_text='Additional notes'),
),
migrations.AlterField(
model_name='epistolaryeventtrigger',
name='epistolary_event',
field=models.ForeignKey(help_text='The epistolary event that triggered a world event', on_delete=django.db.models.deletion.CASCADE, related_name='triggers_by_epistolary_events', to='event.epistolaryevent'),
),
migrations.AlterField(
model_name='epistolaryeventtrigger',
name='world_event',
field=models.ForeignKey(help_text='The world event that was triggered by an epistolary event', on_delete=django.db.models.deletion.CASCADE, related_name='triggers_for_world_events', to='event.worldevent'),
),
migrations.CreateModel(
name='WorldEventTrigger',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('certainty', models.IntegerField(choices=[(0, 'uncertain'), (1, 'somewhat certain'), (2, 'certain')], default=2, help_text='How certain are you of this value?')),
('note', models.TextField(blank=True, help_text='Additional notes')),
('epistolary_event', models.ForeignKey(help_text='The epistolary event that was triggered by a world event', on_delete=django.db.models.deletion.CASCADE, related_name='triggers_by_world_events', to='event.epistolaryevent')),
('world_event', models.ForeignKey(help_text='The world event that triggered an epistolary event', on_delete=django.db.models.deletion.CASCADE, related_name='triggers_for_epistolary_events', to='event.worldevent')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='WorldEventSelfTrigger',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('certainty', models.IntegerField(choices=[(0, 'uncertain'), (1, 'somewhat certain'), (2, 'certain')], default=2, help_text='How certain are you of this value?')),
('note', models.TextField(blank=True, help_text='Additional notes')),
('triggered_world_event', models.ForeignKey(help_text='The world event that was triggered by another world event', on_delete=django.db.models.deletion.CASCADE, related_name='self_triggers_for_world_events', to='event.worldevent')),
('triggering_world_event', models.ForeignKey(help_text='The world event that triggered another world event', on_delete=django.db.models.deletion.CASCADE, related_name='self_triggered_by_world_events', to='event.worldevent')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='EpistolaryEventSelfTrigger',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('certainty', models.IntegerField(choices=[(0, 'uncertain'), (1, 'somewhat certain'), (2, 'certain')], default=2, help_text='How certain are you of this value?')),
('note', models.TextField(blank=True, help_text='Additional notes')),
('triggered_epistolary_event', models.ForeignKey(help_text='The epistolary event that was triggered by another epistolary event', on_delete=django.db.models.deletion.CASCADE, related_name='self_triggers_for_epistolary_events', to='event.epistolaryevent')),
('triggering_epistolary_event', models.ForeignKey(help_text='The epistolary event that triggered another epistolary event', on_delete=django.db.models.deletion.CASCADE, related_name='self_triggered_by_epistolary_events', to='event.epistolaryevent')),
],
options={
'abstract': False,
},
),
migrations.AddField(
model_name='epistolaryevent',
name='triggered_epistolary_events',
field=models.ManyToManyField(help_text='Other epistolary events triggered by this epistolary event', through='event.EpistolaryEventSelfTrigger', to='event.epistolaryevent'),
),
migrations.AddField(
model_name='worldevent',
name='triggered_epistolary_events',
field=models.ManyToManyField(help_text='Epistolary events triggered by this world event', related_name='epistolary_event_triggers', through='event.WorldEventTrigger', to='event.epistolaryevent'),
),
migrations.AddField(
model_name='worldevent',
name='triggered_world_events',
field=models.ManyToManyField(help_text='Other world events triggered by this world event', through='event.WorldEventSelfTrigger', to='event.worldevent'),
),
]
Loading

0 comments on commit 35205f8

Please sign in to comment.