Update tag

This commit is contained in:
RemiZOffAlex
2020-05-06 15:47:27 +03:00
parent eabf534e46
commit 1ec9e5516b
8 changed files with 422 additions and 400 deletions

View File

@@ -1,365 +0,0 @@
__author__ = 'RemiZOffAlex'
__copyright__ = '(c) RemiZOffAlex'
__license__ = 'MIT'
__email__ = 'remizoffalex@mail.ru'
__url__ = 'https://remizoffalex.ru'
from . import jsonrpc, login_required
from .. import app, lib, models
@jsonrpc.method('tag.add(name=str)')
@login_required
def tag_add(name):
"""
Добавить новый тег
"""
exist = models.db_session.query(
models.Tag
).filter(
models.Tag.name == name
).first()
if exist:
raise ValueError
newTag = models.Tag(name)
models.db_session.add(newTag)
models.db_session.commit()
return newTag.as_dict()
@jsonrpc.method('tag.delete(id=int)')
@login_required
def tag_delete(id):
"""
Удалить тег
"""
exist = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'OK'
@jsonrpc.method('tag.exist(name=str)')
def tag_exist(name):
"""
Проверить существует ли тег и вернуть информацию о нём
"""
text = name.lower().strip()
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.name==text
).first()
if tagRow is None:
raise ValueError
result = {
'id': tagRow.id,
'name': tagRow.name
}
return result
@jsonrpc.method('tag.pages(id=int, page=int)')
def tag_pages_list(id, page):
"""
Список статей
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagPage.page_id
).filter(
models.TagPage.tag_id==id
)
pages = models.db_session.query(
models.Page
).filter(
models.Page.id.in_(indexes)
).order_by(
models.Page.title.asc()
)
pages = lib.getpage(
pages,
page,
app.config['ITEMS_ON_PAGE']
).all()
result = []
for page in pages:
newRow = page.as_dict()
newRow['user'] = page.user.as_dict()
newRow['tags'] = []
for tagLink in page.tags:
newRow['tags'].append(tagLink.tag.as_dict())
result.append(newRow)
return result
@jsonrpc.method('tag.pages.count(id=int)')
def tag_pages_count(id):
"""Общее количество статей
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagPage.page_id
).filter(
models.TagPage.tag_id==id
)
result = models.db_session.query(
models.Page
).filter(
models.Page.id.in_(indexes)
).count()
return result
@jsonrpc.method('tag.notes(id=int, page=int)')
@login_required
def tag_notes_list(id, page):
"""Список заметок
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagNote.note_id
).filter(
models.TagNote.tag_id==id
)
notes = models.db_session.query(
models.Note
).filter(
models.Note.user_id==lib.get_user().id,
models.Note.id.in_(indexes)
).order_by(
models.Note.title.asc()
)
notes = lib.getpage(
notes,
page,
app.config['ITEMS_ON_PAGE']
).all()
result = []
for note in notes:
newRow = note.as_dict()
newRow['tags'] = []
for tagLink in note.tags:
newRow['tags'].append(tagLink.tag.as_dict())
result.append(newRow)
return result
@jsonrpc.method('tag.notes.count(id=int)')
@login_required
def tag_notes_count(id):
"""Общее количество заметок
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagNote.note_id
).filter(
models.TagNote.tag_id==id
)
result = models.db_session.query(
models.Note
).filter(
models.Note.user_id==lib.get_user().id,
models.Note.id.in_(indexes)
).count()
return result
@jsonrpc.method('tags()')
def tags_list():
"""
Список тегов
"""
tags = models.db_session.query(
models.Tag
).all()
result = []
for tag in tags:
newRow = tag.as_dict()
result.append(newRow)
return result
@jsonrpc.method('tag.addToPage')
@login_required
def tag_addToPage(tag, id):
"""
Добавление тега на страницы
"""
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
page = models.db_session.query(
models.Page
).filter(
models.Page.id==id
).first()
if page is None:
raise ValueError
exist = models.db_session.query(
models.TagPage
).filter(
models.TagPage.tag_id==tagRow.id,
models.TagPage.page_id==page.id
).first()
if exist:
raise ValueError
newtagpage = models.TagPage(
page,
tagRow
)
models.db_session.add(newtagpage)
models.db_session.commit()
result = tagRow.as_dict()
return result
@jsonrpc.method('tag.deleteFromPage')
@login_required
def tag_deleteFromPage(tag, id):
"""
Удаление тега со страницы
"""
exist = models.db_session.query(
models.TagPage
).filter(
models.TagPage.tag_id==tag,
models.TagPage.page_id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'Тег {} удален'.format(id)
@jsonrpc.method('tag.addToNote(tag=int, id=int)')
@login_required
def tag_addToNote(tag, id):
"""
Добавление тега в заметку
"""
noteRow = models.db_session.query(
models.Note
).filter(
models.Note.id==id,
models.Note.user_id==lib.get_user().id
).first()
if noteRow is None:
raise ValueError
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
exist = models.db_session.query(
models.TagNote
).filter(
models.TagNote.tag_id==tagRow.id,
models.TagNote.note_id==noteRow.id
).first()
if exist:
raise ValueError
newtagNote = models.TagNote(
noteRow,
tagRow
)
models.db_session.add(newtagNote)
models.db_session.commit()
result = tagRow.as_dict()
return result
@jsonrpc.method('tag.deleteFromNote(tag=int, id=int)')
@login_required
def tag_deleteFromNote(tag, id):
"""
Удаление тега из заметки
"""
noteRow = models.db_session.query(
models.Note
).filter(
models.Note.id==id,
models.Note.user_id==lib.get_user().id
).first()
if noteRow is None:
raise ValueError
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
exist = models.db_session.query(
models.TagNote
).filter(
models.TagNote.tag_id==tag,
models.TagNote.note_id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'ok'
@jsonrpc.method('tags.groups')
def tags_groups():
"""
Облако тегов
"""
tags = models.db_session.query(
models.Tag
).order_by(
models.Tag.name
).all()
result = {}
for tag in tags:
tag_json = tag.as_dict()
if tag.name[0] in result:
result[tag.name[0]].append(tag_json)
else:
result[tag.name[0]] = [tag_json]
return result

View File

@@ -0,0 +1,12 @@
__author__ = 'RemiZOffAlex'
__copyright__ = '(c) RemiZOffAlex'
__license__ = 'MIT'
__email__ = 'remizoffalex@mail.ru'
__url__ = 'https://remizoffalex.ru'
from . import (
note,
page,
tag
)

148
myapp/ns_api/tag/note.py Normal file
View File

@@ -0,0 +1,148 @@
__author__ = 'RemiZOffAlex'
__copyright__ = '(c) RemiZOffAlex'
__license__ = 'MIT'
__email__ = 'remizoffalex@mail.ru'
__url__ = 'https://remizoffalex.ru'
from .. import jsonrpc, login_required
from ... import app, lib, models
@jsonrpc.method('tag.note.add(tag=int, id=int)')
@login_required
def tag_note_add(tag, id):
"""
Добавление тега в заметку
"""
noteRow = models.db_session.query(
models.Note
).filter(
models.Note.id==id,
models.Note.user_id==lib.get_user().id
).first()
if noteRow is None:
raise ValueError
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
exist = models.db_session.query(
models.TagNote
).filter(
models.TagNote.tag_id==tagRow.id,
models.TagNote.note_id==noteRow.id
).first()
if exist:
raise ValueError
newtagNote = models.TagNote(
noteRow,
tagRow
)
models.db_session.add(newtagNote)
models.db_session.commit()
result = tagRow.as_dict()
return result
@jsonrpc.method('tag.note.delete(tag=int, id=int)')
@login_required
def tag_note_delete(tag, id):
"""
Удаление тега из заметки
"""
noteRow = models.db_session.query(
models.Note
).filter(
models.Note.id==id,
models.Note.user_id==lib.get_user().id
).first()
if noteRow is None:
raise ValueError
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
exist = models.db_session.query(
models.TagNote
).filter(
models.TagNote.tag_id==tag,
models.TagNote.note_id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'ok'
@jsonrpc.method('tag.notes(id=int, page=int)')
@login_required
def tag_notes_list(id, page):
"""Список заметок
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagNote.note_id
).filter(
models.TagNote.tag_id==id
)
notes = models.db_session.query(
models.Note
).filter(
models.Note.user_id==lib.get_user().id,
models.Note.id.in_(indexes)
).order_by(
models.Note.title.asc()
)
notes = lib.getpage(
notes,
page,
app.config['ITEMS_ON_PAGE']
).all()
result = []
for note in notes:
newRow = note.as_dict()
newRow['tags'] = []
for tagLink in note.tags:
newRow['tags'].append(tagLink.tag.as_dict())
result.append(newRow)
return result
@jsonrpc.method('tag.notes.count(id=int)')
@login_required
def tag_notes_count(id):
"""Общее количество заметок
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagNote.note_id
).filter(
models.TagNote.tag_id==id
)
result = models.db_session.query(
models.Note
).filter(
models.Note.user_id==lib.get_user().id,
models.Note.id.in_(indexes)
).count()
return result

130
myapp/ns_api/tag/page.py Normal file
View File

@@ -0,0 +1,130 @@
__author__ = 'RemiZOffAlex'
__copyright__ = '(c) RemiZOffAlex'
__license__ = 'MIT'
__email__ = 'remizoffalex@mail.ru'
__url__ = 'https://remizoffalex.ru'
from .. import jsonrpc, login_required
from ... import app, lib, models
@jsonrpc.method('tag.page.add(id=int, tag=int)')
@login_required
def tag_page_add(tag, id):
"""
Добавление тега на страницы
"""
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.id==tag
).first()
if tagRow is None:
raise ValueError
page = models.db_session.query(
models.Page
).filter(
models.Page.id==id
).first()
if page is None:
raise ValueError
exist = models.db_session.query(
models.TagPage
).filter(
models.TagPage.tag_id==tagRow.id,
models.TagPage.page_id==page.id
).first()
if exist:
raise ValueError
newtagpage = models.TagPage(
page,
tagRow
)
models.db_session.add(newtagpage)
models.db_session.commit()
result = tagRow.as_dict()
return result
@jsonrpc.method('tag.page.delete(id=int, tag=int)')
@login_required
def tag_page_delete(tag, id):
"""
Удаление тега со страницы
"""
exist = models.db_session.query(
models.TagPage
).filter(
models.TagPage.tag_id==tag,
models.TagPage.page_id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'Тег {} удален'.format(id)
@jsonrpc.method('tag.pages(id=int, page=int)')
def tag_pages_list(id, page):
"""
Список статей
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagPage.page_id
).filter(
models.TagPage.tag_id==id
)
pages = models.db_session.query(
models.Page
).filter(
models.Page.id.in_(indexes)
).order_by(
models.Page.title.asc()
)
pages = lib.getpage(
pages,
page,
app.config['ITEMS_ON_PAGE']
).all()
result = []
for page in pages:
newRow = page.as_dict()
newRow['user'] = page.user.as_dict()
newRow['tags'] = []
for tagLink in page.tags:
newRow['tags'].append(tagLink.tag.as_dict())
result.append(newRow)
return result
@jsonrpc.method('tag.pages.count(id=int)')
def tag_pages_count(id):
"""Общее количество статей
"""
tag = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if tag is None:
raise ValueError
indexes = models.db_session.query(
models.TagPage.page_id
).filter(
models.TagPage.tag_id==id
)
result = models.db_session.query(
models.Page
).filter(
models.Page.id.in_(indexes)
).count()
return result

103
myapp/ns_api/tag/tag.py Normal file
View File

@@ -0,0 +1,103 @@
__author__ = 'RemiZOffAlex'
__copyright__ = '(c) RemiZOffAlex'
__license__ = 'MIT'
__email__ = 'remizoffalex@mail.ru'
__url__ = 'https://remizoffalex.ru'
from .. import jsonrpc, login_required
from ... import app, lib, models
@jsonrpc.method('tag.add(name=str)')
@login_required
def tag_add(name):
"""
Добавить новый тег
"""
exist = models.db_session.query(
models.Tag
).filter(
models.Tag.name == name
).first()
if exist:
raise ValueError
newTag = models.Tag(name)
models.db_session.add(newTag)
models.db_session.commit()
return newTag.as_dict()
@jsonrpc.method('tag.delete(id=int)')
@login_required
def tag_delete(id):
"""
Удалить тег
"""
exist = models.db_session.query(
models.Tag
).filter(
models.Tag.id==id
).first()
if exist is None:
raise ValueError
models.db_session.delete(exist)
models.db_session.commit()
return 'OK'
@jsonrpc.method('tag.exist(name=str)')
def tag_exist(name):
"""
Проверить существует ли тег и вернуть информацию о нём
"""
text = name.lower().strip()
tagRow = models.db_session.query(
models.Tag
).filter(
models.Tag.name==text
).first()
if tagRow is None:
raise ValueError
result = {
'id': tagRow.id,
'name': tagRow.name
}
return result
@jsonrpc.method('tags()')
def tags_list():
"""
Список тегов
"""
tags = models.db_session.query(
models.Tag
).all()
result = []
for tag in tags:
newRow = tag.as_dict()
result.append(newRow)
return result
@jsonrpc.method('tags.groups')
def tags_groups():
"""
Облако тегов
"""
tags = models.db_session.query(
models.Tag
).order_by(
models.Tag.name
).all()
result = {}
for tag in tags:
tag_json = tag.as_dict()
if tag.name[0] in result:
result[tag.name[0]].append(tag_json)
else:
result[tag.name[0]] = [tag_json]
return result

View File

@@ -7,7 +7,7 @@
{{ note.title }}
</h3>
<tags-component v-bind:tags="note.tags" v-bind:node="note.id" v-bind:url="'Note'"></tags-component>
<tags-component v-bind:tags="note.tags" v-bind:resource="{id: note.id, name: 'note'}"></tags-component>
<span v-html="note.body"></span>

View File

@@ -7,7 +7,7 @@
{{ page.title }}
</h3>
<tags-component v-bind:tags="page.tags" v-bind:node="page.id" v-bind:url="'Page'"></tags-component>
<tags-component v-bind:tags="page.tags" v-bind:resource="{id: page.id, name: 'page'}"></tags-component>
<span v-html="page.body"></span>

View File

@@ -1,3 +1,9 @@
/*
<tags-component v-bind:tags="document.tags" v-bind:resource="{id: document.id, name: 'document'}"></tags-component>
<script type="text/javascript" src="/static/components/tags.js"></script>
*/
var tagsTemplate = `
<div>
<!-- Начало: Теги -->
@@ -7,9 +13,9 @@ var tagsTemplate = `
<div class="btn btn-outline-success mb-1" v-on:click="showPanel(panels.standart)"><i class="fa fa-plus"></i></div>
<div class="btn-group mr-2 mb-1" v-for="(tag, index) in sortedTags">
<div class="btn-group mr-2 mb-1" v-for="(tag, tagIdx) in sortedTags">
<a class="btn btn-outline-secondary text-monospace" :href="'/tag/' + tag.id">{{ tag.name }}</a>
<div class="btn btn-outline-danger" v-on:click="removeTag(tag.id)"><i class="fa fa-remove"></i></div>
<div class="btn btn-outline-danger" v-on:click="removeTag(tag)"><i class="fa fa-remove"></i></div>
</div>
</div>
@@ -25,8 +31,8 @@ var tagsTemplate = `
</div>
</div>
<div class="row mt-3">
<div class="col">
<div class="row">
<div class="col py-2">
<template v-for="(tags, key, index) in groups">
<a class="btn btn-outline-secondary mt-2 mr-2" v-if="(index % 2)===0" :href="'#' + index">{{ key }}</a>
@@ -56,8 +62,8 @@ var tagsTemplate = `
<div class="col pr-0">
<a :name="index" class="btn btn-outline-danger mr-2 mb-1">{{ key }}</a>
<template v-for="(tag, tagIdx) in tags">
<div class="btn btn-outline-secondary mr-2 mb-1" v-if="!tag_ids.includes(tag.id)" v-on:click="tag_add_to_node(tag)">{{ tag.name }}</div>
<div class="btn btn-primary mr-2 mb-1" v-else v-on:click="removeTag(tag.id)">{{ tag.name }}</div>
<button type="button" class="btn btn-primary mr-2 mb-1" v-if="tag_includes(tag)" v-on:click="removeTag(tag)">{{ tag.name }}</button>
<button type="button" class="btn btn-outline-secondary mr-2 mb-1" v-else v-on:click="tag_add_to_node(tag)">{{ tag.name }}</button>
</template>
</div>
</div>
@@ -72,10 +78,6 @@ Vue.component('tags-component', {
return {
newtag: '',
groups: {},
forms: {
modal: false,
panel: false
},
panels: {
standart: {
visible: false
@@ -86,7 +88,7 @@ Vue.component('tags-component', {
}
}
},
props: ['tags', 'node', 'url'],
props: ['tags', 'resource'],
template: tagsTemplate,
methods: {
arrayRemove: function(arr, value) {
@@ -95,31 +97,24 @@ Vue.component('tags-component', {
return ele != value;
});
},
removeTag: function (id) {
removeTag: function (tag) {
/* Удаление тега из ресурса */
let vm = this;
var tag = null;
for (var i = 0; i < vm.tags.length; i++) {
if (id == vm.tags[i].id) {
tag = vm.tags[i]
}
}
if (!tag) {return;}
axios.post(
'/api',
{
"jsonrpc": "2.0",
"method": 'tag.deleteFrom' + vm.url,
"method": 'tag.' + vm.resource.name + '.delete',
"params": {
"id": vm.node,
"tag": tag.id
"tag": tag.id,
"id": vm.resource.id
},
"id": 1
}
).then(
function(response) {
if ('result' in response.data) {
vm.tags = vm.arrayRemove(vm.tags, tag);
vm.tags = vm.arrayRemove(vm.tags, vm.tag_includes(tag));
} else if ('error' in response.data) {
console.log(response.data);
}
@@ -190,9 +185,9 @@ Vue.component('tags-component', {
'/api',
{
"jsonrpc": "2.0",
"method": 'tag.addTo' + this.url,
"method": 'tag.' + vm.resource.name + '.add',
"params": {
"id": vm.node,
"id": vm.resource.id,
"tag": tag.id
},
"id": 1
@@ -234,20 +229,19 @@ Vue.component('tags-component', {
/* Показать/скрыть панель */
panel.visible = !panel.visible;
},
tag_includes: function(tag) {
let vm = this;
let result = vm.tags.find(function(element, index, array) {
return element.id===tag.id;
}, tag);
return result;
},
},
mounted: function() {
let vm = this;
vm.getTags();
},
computed: {
tag_ids: function() {
let vm = this;
var result = [];
for (var i = 0; i < vm.tags.length; i++) {
result.push(vm.tags[i].id);
}
return result;
},
sortedTags: function() {
let vm = this;
if (vm.tags === undefined) {return [];}