Give Tags a description field.
This commit is contained in:
parent
a485be3c64
commit
a4a278c173
8 changed files with 60 additions and 16 deletions
|
@ -65,6 +65,7 @@ SQL_PHOTO_COLUMNS = [
|
|||
SQL_TAG_COLUMNS = [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
]
|
||||
SQL_SYN_COLUMNS = [
|
||||
'name',
|
||||
|
@ -161,8 +162,9 @@ DEFAULT_CONFIGURATION = {
|
|||
'enable_new_tag': True,
|
||||
'enable_new_user': True,
|
||||
'enable_photo_add_remove_tag': True,
|
||||
'enable_photo_reload_metadata': True,
|
||||
'enable_photo_generate_thumbnail': True,
|
||||
'enable_photo_reload_metadata': True,
|
||||
'enable_tag_edit': True,
|
||||
|
||||
'min_tag_name_length': 1,
|
||||
'max_tag_name_length': 32,
|
||||
|
|
|
@ -52,6 +52,7 @@ def tag(t, include_synonyms=False):
|
|||
j = {
|
||||
'id': t.id,
|
||||
'name': t.name,
|
||||
'description': t.description,
|
||||
'qualified_name': t.qualified_name(),
|
||||
}
|
||||
if include_synonyms:
|
||||
|
|
|
@ -223,8 +223,8 @@ class Album(ObjectBase, GroupableMixin):
|
|||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = dict(zip(constants.SQL_ALBUM_COLUMNS, db_row))
|
||||
self.id = db_row['id']
|
||||
self.title = db_row['title']
|
||||
self.description = db_row['description']
|
||||
self.title = db_row['title'] or ''
|
||||
self.description = db_row['description'] or ''
|
||||
self.name = 'Album %s' % self.id
|
||||
self.group_getter = self.photodb.get_album
|
||||
self._sum_bytes_photos = None
|
||||
|
@ -501,6 +501,7 @@ class Photo(ObjectBase):
|
|||
|
||||
if self.duration:
|
||||
self.bitrate = (self.bytes / 128) / self.duration
|
||||
|
||||
self.mimetype = helpers.get_mimetype(self.real_filepath)
|
||||
if self.mimetype is None:
|
||||
self.simple_mimetype = None
|
||||
|
@ -954,6 +955,7 @@ class Tag(ObjectBase, GroupableMixin):
|
|||
db_row = dict(zip(constants.SQL_TAG_COLUMNS, db_row))
|
||||
self.id = db_row['id']
|
||||
self.name = db_row['name']
|
||||
self.description = db_row['description'] or ''
|
||||
self.group_getter = self.photodb.get_tag
|
||||
self._cached_qualified_name = None
|
||||
|
||||
|
@ -1063,6 +1065,25 @@ class Tag(ObjectBase, GroupableMixin):
|
|||
self.photodb.log.debug('Committing - delete tag')
|
||||
self.photodb.commit()
|
||||
|
||||
@decorators.required_feature('enable_tag_edit')
|
||||
@decorators.transaction
|
||||
def edit(self, description=None, *, commit=True):
|
||||
'''
|
||||
Change the description. Leave None to keep current value.
|
||||
'''
|
||||
if description is None:
|
||||
description = self.description
|
||||
cur = self.photodb.sql.cursor()
|
||||
cur.execute(
|
||||
'UPDATE tags SET description = ? WHERE id == ?',
|
||||
[description, self.id]
|
||||
)
|
||||
self.description = description
|
||||
self._uncache()
|
||||
if commit:
|
||||
self.photodb.log.debug('Committing - edit tag')
|
||||
self.photodb.commit()
|
||||
|
||||
def qualified_name(self):
|
||||
'''
|
||||
Return the 'group1.group2.tag' string for this tag.
|
||||
|
@ -1107,7 +1128,8 @@ class Tag(ObjectBase, GroupableMixin):
|
|||
Rename the tag. Does not affect its relation to Photos or tag groups.
|
||||
'''
|
||||
new_name = self.photodb.normalize_tagname(new_name)
|
||||
if new_name == self.name:
|
||||
old_name = self.name
|
||||
if new_name == old_name:
|
||||
return
|
||||
|
||||
try:
|
||||
|
@ -1124,7 +1146,7 @@ class Tag(ObjectBase, GroupableMixin):
|
|||
if apply_to_synonyms:
|
||||
cur.execute(
|
||||
'UPDATE tag_synonyms SET mastername = ? WHERE mastername = ?',
|
||||
[new_name, self.name]
|
||||
[new_name, old_name]
|
||||
)
|
||||
|
||||
self.name = new_name
|
||||
|
|
|
@ -28,7 +28,7 @@ logging.getLogger('PIL.PngImagePlugin').setLevel(logging.WARNING)
|
|||
# Note: Setting user_version pragma in init sequence is safe because it only
|
||||
# happens after the out-of-date check occurs, so no chance of accidentally
|
||||
# overwriting it.
|
||||
DATABASE_VERSION = 7
|
||||
DATABASE_VERSION = 8
|
||||
DB_INIT = '''
|
||||
PRAGMA count_changes = OFF;
|
||||
PRAGMA cache_size = 10000;
|
||||
|
@ -125,7 +125,8 @@ CREATE INDEX IF NOT EXISTS index_tag_synonyms_name on tag_synonyms(name);
|
|||
----------------------------------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS tags(
|
||||
id TEXT,
|
||||
name TEXT
|
||||
name TEXT,
|
||||
description TEXT
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS index_tags_id on tags(id);
|
||||
CREATE INDEX IF NOT EXISTS index_tags_name on tags(name);
|
||||
|
@ -961,7 +962,7 @@ class PDBTagMixin:
|
|||
|
||||
@decorators.required_feature('enable_new_tag')
|
||||
@decorators.transaction
|
||||
def new_tag(self, tagname, *, commit=True):
|
||||
def new_tag(self, tagname, description=None, *, commit=True):
|
||||
'''
|
||||
Register a new tag and return the Tag object.
|
||||
'''
|
||||
|
@ -976,11 +977,18 @@ class PDBTagMixin:
|
|||
tagid = self.generate_id('tags')
|
||||
self._cached_frozen_children = None
|
||||
cur = self.sql.cursor()
|
||||
cur.execute('INSERT INTO tags VALUES(?, ?)', [tagid, tagname])
|
||||
data = {
|
||||
'id': tagid,
|
||||
'name': tagname,
|
||||
'description': description,
|
||||
}
|
||||
(qmarks, bindings) = helpers.binding_filler(constants.SQL_TAG_COLUMNS, data)
|
||||
query = 'INSERT INTO tags VALUES(%s)' % qmarks
|
||||
cur.execute(query, bindings)
|
||||
if commit:
|
||||
self.log.debug('Committing - new_tag')
|
||||
self.commit()
|
||||
tag = objects.Tag(self, [tagid, tagname])
|
||||
tag = objects.Tag(self, data)
|
||||
return tag
|
||||
|
||||
def normalize_tagname(self, tagname):
|
||||
|
|
|
@ -524,8 +524,8 @@ def get_search_core():
|
|||
total_tags = set()
|
||||
for photo in photos:
|
||||
for tag in photo.tags():
|
||||
total_tags.add(tag.qualified_name())
|
||||
total_tags = sorted(total_tags)
|
||||
total_tags.add(tag)
|
||||
total_tags = sorted(total_tags, key=lambda t: t.qualified_name())
|
||||
|
||||
# PREV-NEXT PAGE URLS
|
||||
offset = search_kwargs['offset'] or 0
|
||||
|
@ -613,6 +613,7 @@ def get_tags_html(specific_tag=None):
|
|||
'tags.html',
|
||||
include_synonyms=include_synonyms,
|
||||
session=session,
|
||||
specific_tag=specific_tag,
|
||||
tags=tags,
|
||||
)
|
||||
return response
|
||||
|
|
|
@ -270,7 +270,7 @@ form
|
|||
<span>Tags on this page (click to join query):</span>
|
||||
<ul>
|
||||
{% for tag in total_tags %}
|
||||
<li><a href="" class="tag_object">{{tag}}</a></li>
|
||||
<li><a href="javascript:void(0)" title="{{tag.description}}" class="tag_object tags_on_this_page">{{tag.name}}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
@ -560,7 +560,7 @@ var inputted_forbids = [];
|
|||
{% endfor %}
|
||||
|
||||
/* Assign the click handler to "Tags on this page" results. */
|
||||
var found_on_page = document.getElementsByClassName("tag_object");
|
||||
var found_on_page = document.getElementsByClassName("tags_on_this_page");
|
||||
for (var index = 0; index < found_on_page.length; index += 1)
|
||||
{
|
||||
var tag_object = found_on_page[index];
|
||||
|
|
|
@ -67,11 +67,15 @@ body
|
|||
{{header.make_header(session=session)}}
|
||||
<div id="content_body">
|
||||
<div id="left">
|
||||
{% if specific_tag is not none %}
|
||||
<h1>{{specific_tag.name}}</h1>
|
||||
<p>{{specific_tag.description}}</p>
|
||||
{% endif %}
|
||||
<ul>
|
||||
{% for tag in tags %}
|
||||
{% set qualified_name = tag.qualified_name() %}
|
||||
<li>
|
||||
<a target="_blank" class="tag_object" href="/search?tag_musts={{tag.name}}">{{qualified_name}}</a><!--
|
||||
<a target="_blank" class="tag_object" title="{{tag.description}}" href="/search?tag_musts={{tag.name}}">{{qualified_name}}</a><!--
|
||||
--><button class="remove_tag_button" onclick="delete_tag('{{tag.name}}', receive_callback);"></button>
|
||||
</li>
|
||||
{% if include_synonyms %}
|
||||
|
|
|
@ -118,7 +118,6 @@ def upgrade_6_to_7(sql):
|
|||
for index in indices:
|
||||
cur.execute('DROP INDEX %s' % index)
|
||||
|
||||
|
||||
cur.execute('''
|
||||
CREATE TABLE album_associated_directories(
|
||||
albumid TEXT,
|
||||
|
@ -140,6 +139,13 @@ def upgrade_6_to_7(sql):
|
|||
''')
|
||||
cur.execute('DROP TABLE deleting_albums')
|
||||
|
||||
def upgrade_7_to_8(sql):
|
||||
'''
|
||||
Give the Tags table a description field.
|
||||
'''
|
||||
cur = sql.cursor()
|
||||
cur.execute('ALTER TABLE tags ADD COLUMN description TEXT')
|
||||
|
||||
|
||||
def upgrade_all(database_filename):
|
||||
'''
|
||||
|
|
Loading…
Reference in a new issue