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 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 locations.models import Location
|
||||
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 #")
|
||||
|
||||
|
||||
class Character(NameSlugModel, DescriptionModel, HistoryModel):
|
||||
class Character(NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||
aliases = ArrayField(
|
||||
models.CharField(_("Nickname"), max_length=100),
|
||||
verbose_name=_("Aliases"), blank=True, null=True
|
||||
|
@ -63,7 +63,6 @@ class Character(NameSlugModel, DescriptionModel, HistoryModel):
|
|||
def initials(self):
|
||||
return "".join([word[0] for word in self.name.split()][:2]).upper()
|
||||
|
||||
|
||||
@property
|
||||
def text_color(self):
|
||||
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 .nameslugmodel import NameSlugModel
|
||||
from .aliasmodel import AliasModel
|
||||
from .historymodel import HistoryModel
|
||||
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):
|
||||
def test_basic_markdown(self):
|
||||
self.assertHTMLEqual(
|
||||
md_to_html("**test** *it*"),
|
||||
md_to_html("**test** *it*", replacements={}),
|
||||
"<p><strong>test</strong> <em>it</em></p>"
|
||||
)
|
||||
|
||||
def test_nb_md(self):
|
||||
self.assertHTMLEqual(
|
||||
md_to_html("This\nis\nTest"),
|
||||
md_to_html("This\nis\nTest", replacements={}),
|
||||
"<p>This<br>is<br>Test</p>"
|
||||
)
|
||||
|
||||
def test_bleach(self):
|
||||
self.assertEqual(
|
||||
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>"
|
||||
)
|
||||
|
||||
|
|
|
@ -6,4 +6,4 @@ from factions.models import Faction
|
|||
class FactionForm(ModelForm):
|
||||
class Meta:
|
||||
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.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
|
||||
|
||||
|
||||
class Faction(NameSlugModel, DescriptionModel, HistoryModel):
|
||||
|
||||
class Faction(NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||
class Meta:
|
||||
ordering = ["name"]
|
||||
verbose_name = _("Faction")
|
||||
|
@ -22,4 +16,3 @@ class Faction(NameSlugModel, DescriptionModel, HistoryModel):
|
|||
|
||||
def get_absolute_url(self):
|
||||
return reverse('factiondetail', args=[self.slug])
|
||||
|
||||
|
|
|
@ -6,4 +6,4 @@ from locations.models import Location
|
|||
class LocationForm(ModelForm):
|
||||
class Meta:
|
||||
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.models import TreeNode
|
||||
|
||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel
|
||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel, AliasModel
|
||||
from search.utils import NameSearchIndex
|
||||
from utils.random_filename import get_file_path
|
||||
|
||||
|
||||
class Location(TreeNode, NameSlugModel, DescriptionModel, HistoryModel):
|
||||
class Location(TreeNode, NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||
parent = TreeNodeForeignKey(
|
||||
"self",
|
||||
blank=True,
|
||||
|
|
|
@ -6,5 +6,5 @@ from loot.models import Loot
|
|||
class LootForm(ModelForm):
|
||||
class Meta:
|
||||
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"]
|
||||
|
|
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 characters.models import Character
|
||||
from common.models import DescriptionModel, HistoryModel
|
||||
from common.models import DescriptionModel, HistoryModel, AliasModel
|
||||
from locations.models import Location
|
||||
from search.utils import NameSearchIndex
|
||||
from utils.random_filename import get_file_path
|
||||
|
||||
|
||||
class Loot(DescriptionModel, HistoryModel):
|
||||
class Loot(DescriptionModel, AliasModel, HistoryModel):
|
||||
name = models.CharField(_("Name"), max_length=1000)
|
||||
quantity = models.PositiveSmallIntegerField(_("Quantity"))
|
||||
value_gold = models.DecimalField(_("Value (Gold)"), max_digits=7, decimal_places=2)
|
||||
|
@ -37,6 +37,7 @@ class Loot(DescriptionModel, HistoryModel):
|
|||
indexes = [
|
||||
NameSearchIndex
|
||||
]
|
||||
|
||||
@property
|
||||
def value_per_unit(self):
|
||||
return self.value_gold / self.quantity
|
||||
|
|
|
@ -6,4 +6,4 @@ from notes.models import Note
|
|||
class NoteForm(ModelForm):
|
||||
class Meta:
|
||||
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.urls import reverse
|
||||
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.models import TreeNode
|
||||
|
||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel
|
||||
from common.models import NameSlugModel, DescriptionModel, HistoryModel, AliasModel
|
||||
from search.utils import NameSearchIndex
|
||||
from utils.random_filename import get_file_path
|
||||
|
||||
|
||||
class Note(TreeNode, NameSlugModel, DescriptionModel, HistoryModel):
|
||||
class Note(TreeNode, NameSlugModel, DescriptionModel, AliasModel, HistoryModel):
|
||||
parent = TreeNodeForeignKey(
|
||||
"self",
|
||||
blank=True,
|
||||
|
|
|
@ -26,7 +26,7 @@ def md_to_html(md: str, replacements=None) -> str:
|
|||
|
||||
|
||||
def autolink(md: str, replacements=None) -> str:
|
||||
if not replacements:
|
||||
if replacements is None:
|
||||
from utils.urls import name2url
|
||||
replacements = name2url()
|
||||
links = {}
|
||||
|
|
|
@ -9,20 +9,17 @@ from notes.models import Note
|
|||
|
||||
def name2url() -> Dict[str, str]:
|
||||
data = {}
|
||||
|
||||
for character in Character.objects.all():
|
||||
data[character.name] = character.get_absolute_url()
|
||||
if character.aliases:
|
||||
for alias in character.aliases:
|
||||
data[alias] = character.get_absolute_url()
|
||||
for location in Location.objects.all():
|
||||
data[location.name] = location.get_absolute_url()
|
||||
for loot in Loot.objects.all():
|
||||
data[loot.name] = loot.get_absolute_url()
|
||||
for faction in Faction.objects.all():
|
||||
data[faction.name] = faction.get_absolute_url()
|
||||
for note in Note.objects.all():
|
||||
data[note.name] = note.get_absolute_url()
|
||||
objects=[]
|
||||
objects.extend(Character.objects.all())
|
||||
objects.extend(Location.objects.all())
|
||||
objects.extend(Loot.objects.all())
|
||||
objects.extend(Faction.objects.all())
|
||||
objects.extend(Note.objects.all())
|
||||
for object in objects:
|
||||
data[object.name] = object.get_absolute_url()
|
||||
if object.aliases:
|
||||
for alias in object.aliases:
|
||||
data[alias] = object.get_absolute_url()
|
||||
|
||||
# longer replacements first
|
||||
data = {k: v for k, v in sorted(data.items(), key=lambda item: -len(item[0]))}
|
||||
|
|
Loading…
Reference in a new issue