Remove category tree
This commit is contained in:
parent
f85c67bb49
commit
25482790dc
5 changed files with 89 additions and 33 deletions
|
@ -0,0 +1,56 @@
|
|||
# Generated by Django 4.0.4 on 2022-05-20 19:25
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import re
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("main", "0006_alter_category_options_transaction_trader_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="category",
|
||||
options={},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="transaction",
|
||||
options={"ordering": ["-date"]},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name="category",
|
||||
name="full_name",
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name="category",
|
||||
name="parent",
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="category",
|
||||
name="name",
|
||||
field=models.CharField(
|
||||
default="New Category",
|
||||
max_length=64,
|
||||
validators=[
|
||||
django.core.validators.RegexValidator(
|
||||
re.compile("^[-\\w]+\\Z"),
|
||||
"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens.",
|
||||
"invalid",
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="invoice",
|
||||
name="name",
|
||||
field=models.CharField(default="New Invoice", max_length=256),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="transaction",
|
||||
name="name",
|
||||
field=models.CharField(default="New Transaction", max_length=256),
|
||||
),
|
||||
]
|
|
@ -7,35 +7,21 @@ from django.core.validators import validate_unicode_slug, FileExtensionValidator
|
|||
|
||||
class Category(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
name = models.CharField(max_length=64, validators=[validate_unicode_slug], default="New Category")
|
||||
full_name = models.CharField(max_length=512, editable=False, default="")
|
||||
parent = models.ForeignKey("self", on_delete=models.SET_NULL, blank=True, null=True)
|
||||
name = models.CharField(
|
||||
max_length=64, validators=[validate_unicode_slug], default="New Category"
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
if self.parent is None or self.parent == self:
|
||||
return self.name
|
||||
return f"{self.parent}>{self.name}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_name = str(self)
|
||||
super().save(*args, **kwargs)
|
||||
for child in self.__class__.objects.filter(parent=self):
|
||||
child.save()
|
||||
|
||||
@property
|
||||
def tree(self):
|
||||
if self.parent is None or self.parent == self:
|
||||
return [self.name]
|
||||
return self.parent.tree + [self.name]
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
ordering = ["full_name"]
|
||||
ordering = ["name"]
|
||||
|
||||
|
||||
class CategoryForm(ModelForm):
|
||||
class Meta:
|
||||
model = Category
|
||||
fields = ["name", "parent"]
|
||||
fields = ["name"]
|
||||
|
||||
|
||||
class Transaction(models.Model):
|
||||
|
|
|
@ -47,9 +47,6 @@ h1 {
|
|||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
ul#categories {
|
||||
list-style-type: "– ";
|
||||
#categories > a {
|
||||
margin-right: 1em;
|
||||
}
|
||||
ul#categories li.cat2 {margin-left: 1em}
|
||||
ul#categories li.cat3 {margin-left: 2em}
|
||||
ul#categories li.cat4 {margin-left: 3em}
|
||||
|
|
|
@ -18,8 +18,18 @@ body {
|
|||
--text-inv: #ffffffde;
|
||||
|
||||
--bg-01: #dedede;
|
||||
|
||||
--text-link: #0066ff;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--text-link);
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,15 @@
|
|||
<span class="name text"><a href="{% url 'transaction' trans.id %}">{{ trans.name }}</a></span>
|
||||
<span class="value num">{{ trans.value|floatformat:"2g" }} €</span>
|
||||
<span class="trader text center">{{ trans.trader|default_if_none:"–" }}</span>
|
||||
<span class="category text center">{% if trans.category %}{{ trans.category.tree|join:" → " }}{% else %}–{% endif %}</span>
|
||||
<span class="category text center">
|
||||
{% if trans.category %}
|
||||
<a href="{% url 'category' trans.category.id %}">
|
||||
{{ trans.category }}
|
||||
</a>
|
||||
{% else %}
|
||||
–
|
||||
{% endif %}
|
||||
</span>
|
||||
<span class="description text">{{ trans.description }}</span>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
@ -33,15 +41,14 @@
|
|||
{% endif %}
|
||||
|
||||
{% if categories %}
|
||||
<ul id="categories">
|
||||
<h2>Catégories</h2>
|
||||
<div id="categories">
|
||||
{% spaceless %}
|
||||
{% for cat in categories %}
|
||||
<li class="{% if cat.tree|length > 3 %}cat4{% else %}cat{{ cat.tree|length }}{% endif %}">
|
||||
<a href="{% url 'category' cat.id %}">
|
||||
{% if cat.tree|length > 3 %}{{ cat.tree|slice:"3:"|join:" → " }}{% else %}{{ cat.name }}{% endif %}
|
||||
</a>
|
||||
</li>
|
||||
<a href="{% url 'category' cat.id %}">{{ cat }}</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endspaceless %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
|
Loading…
Reference in a new issue