mirror of
https://github.com/ArchiveBox/ArchiveBox.git
synced 2026-04-03 06:17:53 +10:00
Improved tags
This commit is contained in:
@@ -66,6 +66,12 @@ class SnapshotAdmin(admin.ModelAdmin):
|
||||
actions = [delete_snapshots, overwrite_snapshots, update_snapshots, update_titles, verify_snapshots]
|
||||
actions_template = 'admin/actions_as_select.html'
|
||||
|
||||
def get_queryset(self, request):
|
||||
return super().get_queryset(request).prefetch_related('tags')
|
||||
|
||||
def tag_list(self, obj):
|
||||
return u", ".join(o.name for o in obj.tags.all())
|
||||
|
||||
def id_str(self, obj):
|
||||
return format_html(
|
||||
'<code style="font-size: 10px">{}</code>',
|
||||
@@ -75,9 +81,9 @@ class SnapshotAdmin(admin.ModelAdmin):
|
||||
def title_str(self, obj):
|
||||
canon = obj.as_link().canonical_outputs()
|
||||
tags = ''.join(
|
||||
format_html('<span>{}</span>', tag.strip())
|
||||
for tag in obj.tags.split(',')
|
||||
) if obj.tags else ''
|
||||
format_html(' <span>{}</span> ', tag)
|
||||
for tag in obj.tags.all()
|
||||
) if obj.tags.all() else ''
|
||||
return format_html(
|
||||
'<a href="/{}">'
|
||||
'<img src="/{}/{}" class="favicon" onerror="this.remove()">'
|
||||
|
||||
89
archivebox/core/migrations/0006_auto_20200915_2006.py
Normal file
89
archivebox/core/migrations/0006_auto_20200915_2006.py
Normal file
@@ -0,0 +1,89 @@
|
||||
# Generated by Django 3.0.8 on 2020-09-15 20:06
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.utils.text import slugify
|
||||
import django.db.models.deletion
|
||||
import taggit.managers
|
||||
|
||||
def forwards_func(apps, schema_editor):
|
||||
SnapshotModel = apps.get_model("core", "Snapshot")
|
||||
TaggedItemModel = apps.get_model("core", "TaggedItem")
|
||||
TagModel = apps.get_model("taggit", "Tag")
|
||||
contents = ContentType.objects.all()
|
||||
try:
|
||||
ct = ContentType.objects.filter(app_label="core", model="snapshot")
|
||||
except model.DoesNotExist: # Be explicit about exceptions
|
||||
ct = None
|
||||
|
||||
db_alias = schema_editor.connection.alias
|
||||
snapshots = SnapshotModel.objects.all()
|
||||
for snapshot in snapshots:
|
||||
tags = snapshot.tags
|
||||
tag_set = (
|
||||
set(tag.strip() for tag in (snapshot.tags_old or '').split(','))
|
||||
)
|
||||
tag_list = list(tag_set) or []
|
||||
|
||||
for tag in tag_list:
|
||||
new_tag, created = TagModel.objects.get_or_create(name=tag, slug=slugify(tag))
|
||||
TaggedItemModel.objects.get_or_create(
|
||||
content_type_id=ct[0].id,
|
||||
object_id=snapshot.id,
|
||||
tag=new_tag
|
||||
)
|
||||
|
||||
|
||||
def reverse_func(apps, schema_editor):
|
||||
SnapshotModel = apps.get_model("core", "Snapshot")
|
||||
TaggedItemModel = apps.get_model("core", "TaggedItem")
|
||||
TagModel = apps.get_model("taggit", "Tag")
|
||||
ct = ContentType.objects.get(app_label="core", model="snapshot")
|
||||
|
||||
db_alias = schema_editor.connection.alias
|
||||
snapshots = SnapshotModel.objects.all()
|
||||
for snapshot in snapshots:
|
||||
for tag in tags:
|
||||
tagged_items = TaggedItemModel.objects.filter(
|
||||
object_id=snapshot.id,
|
||||
).delete()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('contenttypes', '0002_remove_content_type_name'),
|
||||
('taggit', '0003_taggeditem_add_unique_index'),
|
||||
('core', '0005_auto_20200728_0326'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='snapshot',
|
||||
old_name='tags',
|
||||
new_name='tags_old',
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TaggedItem',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('object_id', models.UUIDField(db_index=True, verbose_name='object ID')),
|
||||
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='core_taggeditem_tagged_items', to='contenttypes.ContentType', verbose_name='content type')),
|
||||
('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='core_taggeditem_items', to='taggit.Tag')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Tag',
|
||||
'verbose_name_plural': 'Tags',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='snapshot',
|
||||
name='tags',
|
||||
field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='core.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
|
||||
),
|
||||
migrations.RunPython(forwards_func, reverse_func),
|
||||
migrations.RemoveField(
|
||||
model_name='snapshot',
|
||||
name='tags_old',
|
||||
),
|
||||
]
|
||||
@@ -5,10 +5,19 @@ import uuid
|
||||
from django.db import models
|
||||
from django.utils.functional import cached_property
|
||||
|
||||
from taggit.managers import TaggableManager
|
||||
from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase
|
||||
|
||||
from ..util import parse_date
|
||||
from ..index.schema import Link
|
||||
|
||||
|
||||
|
||||
class TaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
|
||||
class Meta:
|
||||
verbose_name = "Tag"
|
||||
verbose_name_plural = "Tags"
|
||||
|
||||
class Snapshot(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
|
||||
@@ -16,7 +25,7 @@ class Snapshot(models.Model):
|
||||
timestamp = models.CharField(max_length=32, unique=True, db_index=True)
|
||||
|
||||
title = models.CharField(max_length=128, null=True, blank=True, db_index=True)
|
||||
tags = models.CharField(max_length=256, null=True, blank=True, db_index=True)
|
||||
tags = TaggableManager(through=TaggedItem)
|
||||
|
||||
added = models.DateTimeField(auto_now_add=True, db_index=True)
|
||||
updated = models.DateTimeField(null=True, blank=True, db_index=True)
|
||||
|
||||
@@ -31,6 +31,7 @@ INSTALLED_APPS = [
|
||||
'core',
|
||||
|
||||
'django_extensions',
|
||||
'taggit',
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user