Skip to content
Snippets Groups Projects
Commit 694d575d authored by Tim G's avatar Tim G
Browse files

Natural keys for models + test fixtures

parent e1a49634
No related branches found
Tags 0.1.0
No related merge requests found
## `test_data.json`
* Work: no parameters
* Book: number 12
* Passage
* fragment 42, no sub_fragment ('')
* fragment 12, sub_fragment abc
\ No newline at end of file
[{"model": "meleager.work", "pk": 1, "fields": {"created_at": "2020-11-14T02:33:59.818Z", "updated_at": "2020-11-14T02:33:59.818Z", "creator": null, "last_editor": null, "urn": null, "descriptions": [], "alternative_urns": [], "names": []}}, {"model": "meleager.book", "fields": {"created_at": "2020-11-14T02:34:10.052Z", "updated_at": "2020-11-14T02:34:10.052Z", "creator": null, "last_editor": null, "work": 1, "number": 12, "descriptions": []}}, {"model": "meleager.passage", "fields": {"created_at": "2020-11-14T02:34:28.654Z", "updated_at": "2020-11-14T02:34:28.654Z", "creator": null, "last_editor": null, "urn": null, "validation": 0, "city": null, "book": [12, 1], "fragment": 42, "sub_fragment": "", "descriptions": [], "alternative_urns": [], "authors": [], "images": [], "comments": [], "external_references": [], "internal_references": [], "manuscripts": [], "keywords": []}}, {"model": "meleager.passage", "fields": {"created_at": "2020-11-14T02:34:49.041Z", "updated_at": "2020-11-14T02:34:49.041Z", "creator": null, "last_editor": null, "urn": null, "validation": 0, "city": null, "book": [12, 1], "fragment": 12, "sub_fragment": "abc", "descriptions": [], "alternative_urns": [], "authors": [], "images": [], "comments": [], "external_references": [], "internal_references": [], "manuscripts": [], "keywords": []}}]
\ No newline at end of file
......@@ -3,16 +3,27 @@
Mahuf.
"""
from django.apps import apps
from django.db import models
from .mixins import DescriptableResourceMixin, EditableResourceMixin
class BookManager(models.Manager):
def get_by_natural_key(self, number, work_pk):
work = apps.get_model("meleager", "Work").objects.get(pk=work_pk)
return self.get(number=number, work=work)
class Book(DescriptableResourceMixin, EditableResourceMixin, models.Model):
""" Book model """
objects = BookManager()
work = models.ForeignKey("meleager.Work", on_delete=models.CASCADE)
number = models.IntegerField("Book number", null=False, db_index=True)
def natural_key(self):
return (self.number, self.work.pk)
natural_key.dependencies = ['meleager.Work']
def __str__(self):
return f"Book {self.number}"
import re
from urllib.parse import urlparse
from django.apps import apps
from django.conf import settings
from django.db import models
from django.http import HttpResponseBadRequest
......@@ -14,6 +15,10 @@ from .mixins import (
)
from .urn import URN
class PassageManager(models.Manager):
def get_by_natural_key(self, fragment, sub_fragment, *book_natural_key):
book = apps.get_model("meleager", "Book").objects.get_by_natural_key(*book_natural_key)
return self.get(fragment=fragment, sub_fragment=sub_fragment, book=book)
class Passage(
EditableResourceMixin,
......@@ -24,6 +29,8 @@ class Passage(
):
""" Passage model """
objects = PassageManager()
authors = models.ManyToManyField("meleager.Author")
city = models.ForeignKey(
"meleager.City",
......@@ -81,5 +88,9 @@ class Passage(
help_text="The keywords that tag this resource.",
)
def natural_key(self):
return (self.fragment, self.sub_fragment) + self.book.natural_key()
natural_key.dependencies = ['meleager.Work', 'meleager.Book']
def __str__(self):
return f"Passage {self.book.number}.{self.fragment}{self.sub_fragment}"
......@@ -6,13 +6,13 @@ from .mixins import (
AlternativeURNResourceMixin,
)
class Work(
EditableResourceMixin,
DescriptableResourceMixin,
AlternativeURNResourceMixin,
models.Model,
):
names = models.ManyToManyField(
"meleager.Name",
related_name="mlgr_works",
......
[{"model": "user.user", "pk": 1, "fields": {"password": "!xeTTOcyuHKdRJyOPkNaiXosuRkntzKOZKV26QBVo", "last_login": null, "is_superuser": false, "username": "AnonymousUser", "first_name": "", "last_name": "", "email": "", "is_staff": false, "is_active": true, "date_joined": "2020-11-14T02:31:42.180Z", "institution": "", "groups": [], "user_permissions": []}}, {"model": "user.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$216000$1NDKDHZcziZa$sxZD899PegMg0IOiWOFso+F+gmSF5RXBPOkyrC6OvZ4=", "last_login": null, "is_superuser": true, "username": "test_admin", "first_name": "", "last_name": "", "email": "admin@admin.com", "is_staff": true, "is_active": true, "date_joined": "2020-11-14T02:32:13.175Z", "institution": "", "groups": [], "user_permissions": []}}]
\ No newline at end of file
......@@ -4,3 +4,6 @@ from django.db import models
class User(AbstractUser):
institution = models.TextField(help_text="The institution this user belongs to.")
def natural_key(self):
return (self.username,)
from django.test import TestCase
from django.urls import reverse
from meleager.models import Work, Book, Passage, Description
from meleager.models import Comment
......@@ -8,14 +9,15 @@ from web.forms.description import DescriptionForm
class AddCommentFormPassage(TestCase):
fixtures = ['test_data.json']
def setUp(self):
self.work = Work.objects.create()
self.book = Book.objects.create(work=self.work, number=12)
self.passage = Passage.objects.create(book=self.book, fragment=42)
book = Book.objects.first()
self.passage = Passage.objects.get(book=book, fragment=42)
def test_form(self):
response = self.client.post(
f"/comments/add/passage/{self.passage.pk}",
reverse("web:comment-add", args=(self.passage.pk,)),
data={
"comment_title": "TEST COMMENT",
"description": "TEST DESCRIPTION",
......
......@@ -5,26 +5,18 @@ from web.models import APPassage, APScholium
class TestURNPassage(TestCase):
def setUp(self):
self.work = Work.objects.create()
self.book = Book.objects.create(work=self.work, number=12)
self.passage = APPassage.objects.create(book=self.book, fragment=42)
fixtures = ["test_data.json"]
def test_homepage_ok(self):
resp = self.client.get("/")
self.assertEqual(resp.status_code, 200)
self.assertContains(resp, "12.42")
self.assertContains(resp, "12.12abc")
def test_passage_ok(self):
def test_passage1_ok(self):
resp = self.client.get("/passages/urn:cts:greekLit:tlg7000.tlg001.ag:12.42")
self.assertEqual(resp.status_code, 200)
def test_urn_value_passage(self):
self.assertEquals(
self.passage.urn_value, "urn:cts:greekLit:tlg7000.tlg001.ag:12.42"
)
self.passage.sub_fragment = "b"
self.assertEquals(
self.passage.urn_value, "urn:cts:greekLit:tlg7000.tlg001.ag:12.42b"
)
def test_passage2_ok(self):
resp = self.client.get("/passages/urn:cts:greekLit:tlg7000.tlg001.ag:12.12abc")
self.assertEqual(resp.status_code, 200)
  • Sarah Rubio :grinning: @srubio · Imported
    Owner

    I propose to use dumpdata with this option: --indent 2 to be able to generate proper/readable diffs on future updates.

    By David Larlet on 2020-11-14T16:02:24

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment