Merge branch 'query-builder' of gitlab.ub.uni-bielefeld.de:sfb1288inf/nopaque into query-builder

This commit is contained in:
Inga Kirschnick 2023-10-26 15:18:32 +02:00
commit fbb32ef580
11 changed files with 118 additions and 78 deletions

View File

@ -71,55 +71,55 @@ def get_stopwords():
response_data = stopwords response_data = stopwords
return response_data, 202 return response_data, 202
# @bp.route('/<hashid:corpus_id>/generate-share-link', methods=['POST']) @bp.route('/<hashid:corpus_id>/generate-share-link', methods=['POST'])
# @corpus_follower_permission_required('MANAGE_FOLLOWERS') @corpus_follower_permission_required('MANAGE_FOLLOWERS')
# @content_negotiation(consumes='application/json', produces='application/json') @content_negotiation(consumes='application/json', produces='application/json')
# def generate_corpus_share_link(corpus_id): def generate_corpus_share_link(corpus_id):
# data = request.json data = request.json
# if not isinstance(data, dict): if not isinstance(data, dict):
# abort(400) abort(400)
# expiration = data.get('expiration') expiration = data.get('expiration')
# if not isinstance(expiration, str): if not isinstance(expiration, str):
# abort(400) abort(400)
# role_name = data.get('role') role_name = data.get('role')
# if not isinstance(role_name, str): if not isinstance(role_name, str):
# abort(400) abort(400)
# expiration_date = datetime.strptime(expiration, '%b %d, %Y') expiration_date = datetime.strptime(expiration, '%b %d, %Y')
# cfr = CorpusFollowerRole.query.filter_by(name=role_name).first() cfr = CorpusFollowerRole.query.filter_by(name=role_name).first()
# if cfr is None: if cfr is None:
# abort(400) abort(400)
# corpus = Corpus.query.get_or_404(corpus_id) corpus = Corpus.query.get_or_404(corpus_id)
# token = current_user.generate_follow_corpus_token(corpus.hashid, role_name, expiration_date) token = current_user.generate_follow_corpus_token(corpus.hashid, role_name, expiration_date)
# corpus_share_link = url_for( corpus_share_link = url_for(
# 'corpora.follow_corpus', 'corpora.follow_corpus',
# corpus_id=corpus_id, corpus_id=corpus_id,
# token=token, token=token,
# _external=True _external=True
# ) )
# response_data = { response_data = {
# 'message': 'Corpus share link generated', 'message': 'Corpus share link generated',
# 'category': 'corpus', 'category': 'corpus',
# 'corpusShareLink': corpus_share_link 'corpusShareLink': corpus_share_link
# } }
# return response_data, 200 return response_data, 200
# @bp.route('/<hashid:corpus_id>/is_public', methods=['PUT']) @bp.route('/<hashid:corpus_id>/is_public', methods=['PUT'])
# @corpus_owner_or_admin_required @corpus_owner_or_admin_required
# @content_negotiation(consumes='application/json', produces='application/json') @content_negotiation(consumes='application/json', produces='application/json')
# def update_corpus_is_public(corpus_id): def update_corpus_is_public(corpus_id):
# is_public = request.json is_public = request.json
# if not isinstance(is_public, bool): if not isinstance(is_public, bool):
# abort(400) abort(400)
# corpus = Corpus.query.get_or_404(corpus_id) corpus = Corpus.query.get_or_404(corpus_id)
# corpus.is_public = is_public corpus.is_public = is_public
# db.session.commit() db.session.commit()
# response_data = { response_data = {
# 'message': ( 'message': (
# f'Corpus "{corpus.title}" is now' f'Corpus "{corpus.title}" is now'
# f' {"public" if is_public else "private"}' f' {"public" if is_public else "private"}'
# ), ),
# 'category': 'corpus' 'category': 'corpus'
# } }
# return response_data, 200 return response_data, 200

View File

@ -71,17 +71,16 @@ def corpus(corpus_id):
users=users users=users
) )
if (current_user.is_following_corpus(corpus) or corpus.is_public): if (current_user.is_following_corpus(corpus) or corpus.is_public):
abort(404) cfas = CorpusFollowerAssociation.query.filter(Corpus.id == corpus_id, CorpusFollowerAssociation.follower_id != corpus.user.id).all()
# cfas = CorpusFollowerAssociation.query.filter(Corpus.id == corpus_id, CorpusFollowerAssociation.follower_id != corpus.user.id).all() return render_template(
# return render_template( 'corpora/public_corpus.html.j2',
# 'corpora/public_corpus.html.j2', title=corpus.title,
# title=corpus.title, corpus=corpus,
# corpus=corpus, cfrs=cfrs,
# cfrs=cfrs, cfr=cfr,
# cfr=cfr, cfas=cfas,
# cfas=cfas, users=users
# users = users )
# )
abort(403) abort(403)

View File

@ -82,7 +82,9 @@ def terms_of_use():
@register_breadcrumb(bp, '.social_area', '<i class="material-icons left">group</i>Social Area') @register_breadcrumb(bp, '.social_area', '<i class="material-icons left">group</i>Social Area')
@login_required @login_required
def social_area(): def social_area():
print('test')
corpora = Corpus.query.filter(Corpus.is_public == True, Corpus.user != current_user).all() corpora = Corpus.query.filter(Corpus.is_public == True, Corpus.user != current_user).all()
print(corpora)
users = User.query.filter(User.is_public == True, User.id != current_user.id).all() users = User.query.filter(User.is_public == True, User.id != current_user.id).all()
return render_template( return render_template(
'main/social_area.html.j2', 'main/social_area.html.j2',

View File

@ -853,7 +853,7 @@ class User(HashidMixin, UserMixin, db.Model):
json_serializeable = { json_serializeable = {
'id': self.hashid, 'id': self.hashid,
'confirmed': self.confirmed, 'confirmed': self.confirmed,
# 'avatar': url_for('users.user_avatar', user_id=self.id), 'avatar': url_for('users.user_avatar', user_id=self.id),
'email': self.email, 'email': self.email,
'last_seen': ( 'last_seen': (
None if self.last_seen is None None if self.last_seen is None

View File

@ -18,7 +18,7 @@ ResourceLists.CorpusFollowerList = class CorpusFollowerList extends ResourceList
}); });
}); });
app.getUser(this.userId).then((user) => { app.getUser(this.userId).then((user) => {
let corpusFollowerAssociations = Object.values(user.corpora[this.corpusId].corpus_follower_associations); // let corpusFollowerAssociations = Object.values(user.corpora[this.corpusId].corpus_follower_associations);
// let filteredList = corpusFollowerAssociations.filter(association => association.follower.id != currentUserId); // let filteredList = corpusFollowerAssociations.filter(association => association.follower.id != currentUserId);
// this.add(filteredList); // this.add(filteredList);
this.add(Object.values(user.corpora[this.corpusId].corpus_follower_associations)); this.add(Object.values(user.corpora[this.corpusId].corpus_follower_associations));

View File

@ -1,6 +1,11 @@
ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.ResourceList { ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.ResourceList {
static htmlClass = 'public-corpus-list'; static htmlClass = 'public-corpus-list';
constructor(listContainerElement, options = {}) {
super(listContainerElement, options);
this.listjs.list.addEventListener('click', (event) => {this.onClick(event)});
}
get item() { get item() {
return (values) => { return (values) => {
return ` return `
@ -16,6 +21,19 @@ ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.Re
}; };
} }
get valueNames() {
return [
{data: ['id']},
{data: ['creation-date']},
{name: 'status', attr: 'data-status'},
'description',
'title',
'owner',
'is-owner',
'current-user-is-following'
];
}
mapResourceToValue(corpus) { mapResourceToValue(corpus) {
return { return {
'id': corpus.id, 'id': corpus.id,
@ -54,4 +72,21 @@ ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.Re
<ul class="pagination"></ul> <ul class="pagination"></ul>
`.trim(); `.trim();
} }
onClick(event) {
let listItemElement = event.target.closest('.list-item[data-id]');
if (listItemElement === null) {return;}
let itemId = listItemElement.dataset.id;
let listActionElement = event.target.closest('.list-action-trigger[data-list-action]');
let listAction = listActionElement === null ? 'view' : listActionElement.dataset.listAction;
switch (listAction) {
case 'view': {
window.location.href = `/corpora/${itemId}`;
break;
}
default: {
break;
}
}
}
}; };

View File

@ -1,5 +1,5 @@
ResourceLists.UserList = class UserList extends ResourceLists.ResourceList { ResourceLists.PublicUserList = class PublicUserList extends ResourceLists.ResourceList {
static htmlClass = 'user-list'; static htmlClass = 'public-user-list';
constructor(listContainerElement, options = {}) { constructor(listContainerElement, options = {}) {
super(listContainerElement, options); super(listContainerElement, options);

View File

@ -80,9 +80,9 @@
'js/resource-lists/job-list.js', 'js/resource-lists/job-list.js',
'js/resource-lists/job-result-list.js', 'js/resource-lists/job-result-list.js',
'js/resource-lists/public-corpus-list.js', 'js/resource-lists/public-corpus-list.js',
'js/resource-lists/public-user-list.js',
'js/resource-lists/spacy-nlp-pipeline-model-list.js', 'js/resource-lists/spacy-nlp-pipeline-model-list.js',
'js/resource-lists/tesseract-ocr-pipeline-model-list.js', 'js/resource-lists/tesseract-ocr-pipeline-model-list.js'
'js/resource-lists/user-list.js'
%} %}
<script src="{{ ASSET_URL }}"></script> <script src="{{ ASSET_URL }}"></script>
{%- endassets %} {%- endassets %}

View File

@ -57,7 +57,7 @@
let userConfirmedSwitchElement = document.querySelector('#user-confirmed-switch'); let userConfirmedSwitchElement = document.querySelector('#user-confirmed-switch');
userConfirmedSwitchElement.addEventListener('change', (event) => { userConfirmedSwitchElement.addEventListener('change', (event) => {
let newConfirmed = userConfirmedSwitchElement.checked; let newConfirmed = userConfirmedSwitchElement.checked;
requests.admin.users.entity.confirmed.update({{ user.hashid|tojson }}, newConfirmed) Requests.admin.users.entity.confirmed.update({{ user.hashid|tojson }}, newConfirmed)
.catch((response) => { .catch((response) => {
userConfirmedSwitchElement.checked = !userConfirmedSwitchElement; userConfirmedSwitchElement.checked = !userConfirmedSwitchElement;
}); });

View File

@ -240,7 +240,7 @@
{% if current_user.is_following_corpus(corpus) %} {% if current_user.is_following_corpus(corpus) %}
let unfollowRequestElement = document.querySelector('.action-button[data-action="unfollow-request"]'); let unfollowRequestElement = document.querySelector('.action-button[data-action="unfollow-request"]');
unfollowRequestElement.addEventListener('click', () => { unfollowRequestElement.addEventListener('click', () => {
requests.corpora.entity.followers.entity.delete({{ corpus.hashid|tojson }}, {{ current_user.hashid|tojson }}) Requests.corpora.entity.followers.entity.delete({{ corpus.hashid|tojson }}, {{ current_user.hashid|tojson }})
.then((response) => { .then((response) => {
window.location.reload(); window.location.reload();
}); });
@ -252,7 +252,7 @@
let publishingModalIsPublicSwitchElement = document.querySelector('#publishing-modal-is-public-switch'); let publishingModalIsPublicSwitchElement = document.querySelector('#publishing-modal-is-public-switch');
publishingModalIsPublicSwitchElement.addEventListener('change', (event) => { publishingModalIsPublicSwitchElement.addEventListener('change', (event) => {
let newIsPublic = publishingModalIsPublicSwitchElement.checked; let newIsPublic = publishingModalIsPublicSwitchElement.checked;
requests.corpora.entity.isPublic.update({{ corpus.hashid|tojson }}, newIsPublic) Requests.corpora.entity.isPublic.update({{ corpus.hashid|tojson }}, newIsPublic)
.catch((response) => { .catch((response) => {
publishingModalIsPublicSwitchElement.checked = !newIsPublic; publishingModalIsPublicSwitchElement.checked = !newIsPublic;
}); });
@ -262,7 +262,7 @@ publishingModalIsPublicSwitchElement.addEventListener('change', (event) => {
// #region Delete // #region Delete
let deleteModalDeleteButtonElement = document.querySelector('#delete-modal-delete-button'); let deleteModalDeleteButtonElement = document.querySelector('#delete-modal-delete-button');
deleteModalDeleteButtonElement.addEventListener('click', (event) => { deleteModalDeleteButtonElement.addEventListener('click', (event) => {
requests.corpora.entity.delete({{ corpus.hashid|tojson }}) Requests.corpora.entity.delete({{ corpus.hashid|tojson }})
.then((response) => { .then((response) => {
window.location.href = {{ url_for('main.dashboard')|tojson }}; window.location.href = {{ url_for('main.dashboard')|tojson }};
}); });
@ -281,6 +281,7 @@ let users = {
{% if not loop.last %},{% endif %} {% if not loop.last %},{% endif %}
{% endfor %} {% endfor %}
}; };
console.log(users);
let inviteUserModalSearch = M.Chips.init( let inviteUserModalSearch = M.Chips.init(
inviteUserModalSearchElement, inviteUserModalSearchElement,
@ -312,7 +313,7 @@ M.Modal.init(
inviteUserModalInviteButtonElement.addEventListener('click', (event) => { inviteUserModalInviteButtonElement.addEventListener('click', (event) => {
let usernames = inviteUserModalSearch.chipsData.map((chipData) => chipData.tag); let usernames = inviteUserModalSearch.chipsData.map((chipData) => chipData.tag);
requests.corpora.entity.followers.add({{ corpus.hashid|tojson }}, usernames); Requests.corpora.entity.followers.add({{ corpus.hashid|tojson }}, usernames);
}); });
// #endregion Invite user // #endregion Invite user
@ -357,7 +358,7 @@ M.Modal.init(
shareLinkModalCreateButtonElement.addEventListener('click', (event) => { shareLinkModalCreateButtonElement.addEventListener('click', (event) => {
let role = shareLinkModalCorpusFollowerRoleSelectElement.value; let role = shareLinkModalCorpusFollowerRoleSelectElement.value;
let expiration = shareLinkModalExpirationDateDatepickerElement.value let expiration = shareLinkModalExpirationDateDatepickerElement.value
requests.corpora.entity.generateShareLink({{ corpus.hashid|tojson }}, role, expiration) Requests.corpora.entity.generateShareLink({{ corpus.hashid|tojson }}, role, expiration)
.then((response) => { .then((response) => {
response.json() response.json()
.then((json) => { .then((json) => {

View File

@ -40,7 +40,7 @@
<p>Find other users and see what corpora they have made public.</p> <p>Find other users and see what corpora they have made public.</p>
<div class="card"> <div class="card">
<div class="card-content"> <div class="card-content">
<div class="user-list no-autoinit"></div> <div id="public-user-list"></div>
</div> </div>
</div> </div>
</div> </div>
@ -51,7 +51,7 @@
<div class="card"> <div class="card">
<div class="card-content"> <div class="card-content">
<span class="card-title">Public Corpora</span> <span class="card-title">Public Corpora</span>
<div class="public-corpus-list no-autoinit"></div> <div id="public-corpus-list"></div>
</div> </div>
</div> </div>
</div> </div>
@ -62,15 +62,18 @@
{% block scripts %} {% block scripts %}
{{ super() }} {{ super() }}
<script> <script>
let userList = new ResourceLists.UserList(document.querySelector('.user-list')); let publicUserListElement = document.querySelector('#public-user-list');
userList.add( let publicUserList = new ResourceLists.PublicUserList(publicUserListElement);
publicUserList.add(
[ [
{% for user in users %} {% for user in users %}
{{ user.to_json_serializeable(relationships=True, filter_by_privacy_settings=True)|tojson }}, {{ user.to_json_serializeable(relationships=True, filter_by_privacy_settings=True)|tojson }},
{% endfor %} {% endfor %}
] ]
); );
let publicCorpusList = new ResourceLists.PublicCorpusList(document.querySelector('.public-corpus-list'));
let publicCorpusListElement = document.querySelector('#public-corpus-list');
let publicCorpusList = new ResourceLists.PublicCorpusList(publicCorpusListElement);
publicCorpusList.add( publicCorpusList.add(
[ [
{% for corpus in corpora %} {% for corpus in corpora %}