1
0
Fork 0
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:
Lukas Winkler 2022-07-05 18:37:21 +02:00
parent 31ccd8069a
commit d88b331bf2
Signed by: lukas
GPG key ID: 54DE4D798D244853
19 changed files with 157 additions and 41 deletions

View file

@ -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"

View 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'},
),
]

View file

@ -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

View 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

View file

@ -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={}),
"&lt;script&gt;console.log()&lt;/script&gt;\n<p><a>Hi&lt;/button&gt;</a></p>" "&lt;script&gt;console.log()&lt;/script&gt;\n<p><a>Hi&lt;/button&gt;</a></p>"
) )

View file

@ -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"]

View file

@ -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'),
),
]

View file

@ -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])

View file

@ -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"]

View 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 = [
('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'),
),
]

View file

@ -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,

View file

@ -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"]

View 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'),
),
]

View file

@ -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

View file

@ -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"]

View 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'),
),
]

View file

@ -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,

View file

@ -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 = {}

View file

@ -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]))}