mirror of
https://github.com/Findus23/RPGnotes.git
synced 2024-09-19 15:43:45 +02:00
aliases for everything
This commit is contained in:
parent
31ccd8069a
commit
d88b331bf2
19 changed files with 157 additions and 41 deletions
|
@ -6,7 +6,7 @@ from django.urls import reverse
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from sorl.thumbnail import ImageField
|
from sorl.thumbnail import ImageField
|
||||||
|
|
||||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel
|
from common.models import NameSlugModel, DescriptionModel, HistoryModel, AliasModel
|
||||||
from factions.models import Faction
|
from factions.models import Faction
|
||||||
from locations.models import Location
|
from locations.models import Location
|
||||||
from rpg_notes.settings import AUTH_USER_MODEL
|
from rpg_notes.settings import AUTH_USER_MODEL
|
||||||
|
@ -20,7 +20,7 @@ def validate_color_hex(value: str):
|
||||||
raise ValidationError("color hex has to start with a #")
|
raise ValidationError("color hex has to start with a #")
|
||||||
|
|
||||||
|
|
||||||
class Character(NameSlugModel, DescriptionModel, HistoryModel):
|
class Character(NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||||
aliases = ArrayField(
|
aliases = ArrayField(
|
||||||
models.CharField(_("Nickname"), max_length=100),
|
models.CharField(_("Nickname"), max_length=100),
|
||||||
verbose_name=_("Aliases"), blank=True, null=True
|
verbose_name=_("Aliases"), blank=True, null=True
|
||||||
|
@ -63,7 +63,6 @@ class Character(NameSlugModel, DescriptionModel, HistoryModel):
|
||||||
def initials(self):
|
def initials(self):
|
||||||
return "".join([word[0] for word in self.name.split()][:2]).upper()
|
return "".join([word[0] for word in self.name.split()][:2]).upper()
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def text_color(self):
|
def text_color(self):
|
||||||
return "black" if is_bright_color(self.color) else "white"
|
return "black" if is_bright_color(self.color) else "white"
|
||||||
|
|
17
common/migrations/0002_alter_draft_options.py
Normal file
17
common/migrations/0002_alter_draft_options.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-07-05 16:27
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('common', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='draft',
|
||||||
|
options={'get_latest_by': 'created'},
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,4 +1,5 @@
|
||||||
from .descriptionmodel import DescriptionModel
|
from .descriptionmodel import DescriptionModel
|
||||||
from .nameslugmodel import NameSlugModel
|
from .nameslugmodel import NameSlugModel
|
||||||
|
from .aliasmodel import AliasModel
|
||||||
from .historymodel import HistoryModel
|
from .historymodel import HistoryModel
|
||||||
from .draft import Draft
|
from .draft import Draft
|
||||||
|
|
13
common/models/aliasmodel.py
Normal file
13
common/models/aliasmodel.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from django.contrib.postgres.fields import ArrayField
|
||||||
|
from django.db import models
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
|
class AliasModel(models.Model):
|
||||||
|
aliases = ArrayField(
|
||||||
|
models.CharField(_("Alias"), max_length=100),
|
||||||
|
verbose_name=_("Aliases"), blank=True, null=True
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
|
@ -28,20 +28,20 @@ class ColorsTests(SimpleTestCase):
|
||||||
class MarkdownTests(SimpleTestCase):
|
class MarkdownTests(SimpleTestCase):
|
||||||
def test_basic_markdown(self):
|
def test_basic_markdown(self):
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
md_to_html("**test** *it*"),
|
md_to_html("**test** *it*", replacements={}),
|
||||||
"<p><strong>test</strong> <em>it</em></p>"
|
"<p><strong>test</strong> <em>it</em></p>"
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_nb_md(self):
|
def test_nb_md(self):
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
md_to_html("This\nis\nTest"),
|
md_to_html("This\nis\nTest", replacements={}),
|
||||||
"<p>This<br>is<br>Test</p>"
|
"<p>This<br>is<br>Test</p>"
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_bleach(self):
|
def test_bleach(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
md_to_html(
|
md_to_html(
|
||||||
"<script>console.log()</script> <a onclick='console.log()'>Hi</button>"),
|
"<script>console.log()</script> <a onclick='console.log()'>Hi</button>", replacements={}),
|
||||||
"<script>console.log()</script>\n<p><a>Hi</button></a></p>"
|
"<script>console.log()</script>\n<p><a>Hi</button></a></p>"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -6,4 +6,4 @@ from factions.models import Faction
|
||||||
class FactionForm(ModelForm):
|
class FactionForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Faction
|
model = Faction
|
||||||
fields = ["name", "description_md"]
|
fields = ["name", "aliases","description_md"]
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-07-05 16:30
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('factions', '0003_alter_historicalfaction_options_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='faction',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='historicalfaction',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,17 +1,11 @@
|
||||||
from datetime import date
|
|
||||||
|
|
||||||
from django.contrib.humanize.templatetags.humanize import ordinal
|
|
||||||
from django.contrib.postgres.indexes import GinIndex
|
|
||||||
from django.db import models
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from common.models import DescriptionModel, HistoryModel, NameSlugModel
|
from common.models import DescriptionModel, HistoryModel, NameSlugModel, AliasModel
|
||||||
from search.utils import NameSearchIndex
|
from search.utils import NameSearchIndex
|
||||||
|
|
||||||
|
|
||||||
class Faction(NameSlugModel, DescriptionModel, HistoryModel):
|
class Faction(NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["name"]
|
ordering = ["name"]
|
||||||
verbose_name = _("Faction")
|
verbose_name = _("Faction")
|
||||||
|
@ -22,4 +16,3 @@ class Faction(NameSlugModel, DescriptionModel, HistoryModel):
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('factiondetail', args=[self.slug])
|
return reverse('factiondetail', args=[self.slug])
|
||||||
|
|
||||||
|
|
|
@ -6,4 +6,4 @@ from locations.models import Location
|
||||||
class LocationForm(ModelForm):
|
class LocationForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Location
|
model = Location
|
||||||
fields = ["name", "description_md", "parent", "image"]
|
fields = ["name", "aliases", "description_md", "parent", "image"]
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-07-05 16:35
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('locations', '0009_alter_historicallocation_options_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='historicallocation',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='location',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -5,12 +5,12 @@ from sorl.thumbnail import ImageField
|
||||||
from tree_queries.fields import TreeNodeForeignKey
|
from tree_queries.fields import TreeNodeForeignKey
|
||||||
from tree_queries.models import TreeNode
|
from tree_queries.models import TreeNode
|
||||||
|
|
||||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel
|
from common.models import NameSlugModel, DescriptionModel, HistoryModel, AliasModel
|
||||||
from search.utils import NameSearchIndex
|
from search.utils import NameSearchIndex
|
||||||
from utils.random_filename import get_file_path
|
from utils.random_filename import get_file_path
|
||||||
|
|
||||||
|
|
||||||
class Location(TreeNode, NameSlugModel, DescriptionModel, HistoryModel):
|
class Location(TreeNode, NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||||
parent = TreeNodeForeignKey(
|
parent = TreeNodeForeignKey(
|
||||||
"self",
|
"self",
|
||||||
blank=True,
|
blank=True,
|
||||||
|
|
|
@ -6,5 +6,5 @@ from loot.models import Loot
|
||||||
class LootForm(ModelForm):
|
class LootForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Loot
|
model = Loot
|
||||||
fields = ["name", "description_md", "quantity", "value_gold", "weight", "image", "owner", "location",
|
fields = ["name", "aliases", "description_md", "quantity", "value_gold", "weight", "image", "owner", "location",
|
||||||
"magic_item"]
|
"magic_item"]
|
||||||
|
|
24
loot/migrations/0012_historicalloot_aliases_loot_aliases.py
Normal file
24
loot/migrations/0012_historicalloot_aliases_loot_aliases.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-07-05 16:35
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('loot', '0011_alter_historicalloot_options_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='historicalloot',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='loot',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -4,13 +4,13 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from sorl.thumbnail import ImageField
|
from sorl.thumbnail import ImageField
|
||||||
|
|
||||||
from characters.models import Character
|
from characters.models import Character
|
||||||
from common.models import DescriptionModel, HistoryModel
|
from common.models import DescriptionModel, HistoryModel, AliasModel
|
||||||
from locations.models import Location
|
from locations.models import Location
|
||||||
from search.utils import NameSearchIndex
|
from search.utils import NameSearchIndex
|
||||||
from utils.random_filename import get_file_path
|
from utils.random_filename import get_file_path
|
||||||
|
|
||||||
|
|
||||||
class Loot(DescriptionModel, HistoryModel):
|
class Loot(DescriptionModel, AliasModel, HistoryModel):
|
||||||
name = models.CharField(_("Name"), max_length=1000)
|
name = models.CharField(_("Name"), max_length=1000)
|
||||||
quantity = models.PositiveSmallIntegerField(_("Quantity"))
|
quantity = models.PositiveSmallIntegerField(_("Quantity"))
|
||||||
value_gold = models.DecimalField(_("Value (Gold)"), max_digits=7, decimal_places=2)
|
value_gold = models.DecimalField(_("Value (Gold)"), max_digits=7, decimal_places=2)
|
||||||
|
@ -37,6 +37,7 @@ class Loot(DescriptionModel, HistoryModel):
|
||||||
indexes = [
|
indexes = [
|
||||||
NameSearchIndex
|
NameSearchIndex
|
||||||
]
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def value_per_unit(self):
|
def value_per_unit(self):
|
||||||
return self.value_gold / self.quantity
|
return self.value_gold / self.quantity
|
||||||
|
|
|
@ -6,4 +6,4 @@ from notes.models import Note
|
||||||
class NoteForm(ModelForm):
|
class NoteForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Note
|
model = Note
|
||||||
fields = ["name", "description_md", "parent"]
|
fields = ["name", "aliases", "description_md", "parent"]
|
||||||
|
|
24
notes/migrations/0005_historicalnote_aliases_note_aliases.py
Normal file
24
notes/migrations/0005_historicalnote_aliases_note_aliases.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-07-05 16:35
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('notes', '0004_alter_historicalnote_options_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='historicalnote',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='note',
|
||||||
|
name='aliases',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100, verbose_name='Alias'), blank=True, null=True, size=None, verbose_name='Aliases'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,4 +1,3 @@
|
||||||
from django.contrib.postgres.indexes import GinIndex
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
@ -6,12 +5,12 @@ from sorl.thumbnail import ImageField
|
||||||
from tree_queries.fields import TreeNodeForeignKey
|
from tree_queries.fields import TreeNodeForeignKey
|
||||||
from tree_queries.models import TreeNode
|
from tree_queries.models import TreeNode
|
||||||
|
|
||||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel
|
from common.models import NameSlugModel, DescriptionModel, HistoryModel, AliasModel
|
||||||
from search.utils import NameSearchIndex
|
from search.utils import NameSearchIndex
|
||||||
from utils.random_filename import get_file_path
|
from utils.random_filename import get_file_path
|
||||||
|
|
||||||
|
|
||||||
class Note(TreeNode, NameSlugModel, DescriptionModel, HistoryModel):
|
class Note(TreeNode, NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||||
parent = TreeNodeForeignKey(
|
parent = TreeNodeForeignKey(
|
||||||
"self",
|
"self",
|
||||||
blank=True,
|
blank=True,
|
||||||
|
|
|
@ -26,7 +26,7 @@ def md_to_html(md: str, replacements=None) -> str:
|
||||||
|
|
||||||
|
|
||||||
def autolink(md: str, replacements=None) -> str:
|
def autolink(md: str, replacements=None) -> str:
|
||||||
if not replacements:
|
if replacements is None:
|
||||||
from utils.urls import name2url
|
from utils.urls import name2url
|
||||||
replacements = name2url()
|
replacements = name2url()
|
||||||
links = {}
|
links = {}
|
||||||
|
|
|
@ -9,20 +9,17 @@ from notes.models import Note
|
||||||
|
|
||||||
def name2url() -> Dict[str, str]:
|
def name2url() -> Dict[str, str]:
|
||||||
data = {}
|
data = {}
|
||||||
|
objects=[]
|
||||||
for character in Character.objects.all():
|
objects.extend(Character.objects.all())
|
||||||
data[character.name] = character.get_absolute_url()
|
objects.extend(Location.objects.all())
|
||||||
if character.aliases:
|
objects.extend(Loot.objects.all())
|
||||||
for alias in character.aliases:
|
objects.extend(Faction.objects.all())
|
||||||
data[alias] = character.get_absolute_url()
|
objects.extend(Note.objects.all())
|
||||||
for location in Location.objects.all():
|
for object in objects:
|
||||||
data[location.name] = location.get_absolute_url()
|
data[object.name] = object.get_absolute_url()
|
||||||
for loot in Loot.objects.all():
|
if object.aliases:
|
||||||
data[loot.name] = loot.get_absolute_url()
|
for alias in object.aliases:
|
||||||
for faction in Faction.objects.all():
|
data[alias] = object.get_absolute_url()
|
||||||
data[faction.name] = faction.get_absolute_url()
|
|
||||||
for note in Note.objects.all():
|
|
||||||
data[note.name] = note.get_absolute_url()
|
|
||||||
|
|
||||||
# longer replacements first
|
# longer replacements first
|
||||||
data = {k: v for k, v in sorted(data.items(), key=lambda item: -len(item[0]))}
|
data = {k: v for k, v in sorted(data.items(), key=lambda item: -len(item[0]))}
|
||||||
|
|
Loading…
Reference in a new issue