(Public-)Corpus List fix+highligting owner status

This commit is contained in:
Inga Kirschnick 2023-05-05 08:41:14 +02:00
parent 8a85dd9e61
commit b07addc5c3
9 changed files with 51 additions and 58 deletions

View File

@ -51,7 +51,8 @@ def create_corpus():
def corpus(corpus_id): def corpus(corpus_id):
corpus = Corpus.query.get_or_404(corpus_id) corpus = Corpus.query.get_or_404(corpus_id)
cfrs = CorpusFollowerRole.query.all() cfrs = CorpusFollowerRole.query.all()
users = User.query.filter(User.is_public == True, User.id != current_user.id).all() # TODO: Better solution for filtering admin
users = User.query.filter(User.is_public == True, User.id != current_user.id, User.id != corpus.user.id, User.role_id < 4).all()
cfa = CorpusFollowerAssociation.query.filter_by(corpus_id=corpus_id, follower_id=current_user.id).first() cfa = CorpusFollowerAssociation.query.filter_by(corpus_id=corpus_id, follower_id=current_user.id).first()
if cfa is None: if cfa is None:
if corpus.user == current_user or current_user.is_administrator(): if corpus.user == current_user or current_user.is_administrator():

View File

@ -3,6 +3,7 @@ from flask_breadcrumbs import register_breadcrumb
from flask_login import current_user, login_required, login_user from flask_login import current_user, login_required, login_user
from app.auth.forms import LoginForm from app.auth.forms import LoginForm
from app.models import Corpus, User from app.models import Corpus, User
from sqlalchemy import or_
from . import bp from . import bp
@ -38,8 +39,10 @@ def faq():
@register_breadcrumb(bp, '.dashboard', '<i class="material-icons left">dashboard</i>Dashboard') @register_breadcrumb(bp, '.dashboard', '<i class="material-icons left">dashboard</i>Dashboard')
@login_required @login_required
def dashboard(): def dashboard():
corpora = Corpus.query.filter(or_(Corpus.followers.any(id=current_user.id), Corpus.user == current_user)).all()
return render_template( return render_template(
'main/dashboard.html.j2', 'main/dashboard.html.j2',
corpora=corpora,
title='Dashboard' title='Dashboard'
) )
@ -81,15 +84,7 @@ 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():
# corpora = [
# c.to_json_serializeable() for c
# in 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() corpora = Corpus.query.filter(Corpus.is_public == True, Corpus.user != current_user).all()
# users = [
# u.to_json_serializeable(relationships=True, filter_by_privacy_settings=True,) for u
# in 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() 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

@ -16,15 +16,6 @@ class CorpusList extends ResourceList {
if (this.isInitialized) {this.onPatch(patch);} if (this.isInitialized) {this.onPatch(patch);}
}); });
}); });
app.getUser(this.userId).then((user) => {
let followedCorpora = [];
for (let cfa of Object.values(user.corpus_follower_associations)) {
followedCorpora.push(cfa.corpus);
}
this.add(Object.values(user.corpora));
this.add(followedCorpora);
this.isInitialized = true;
});
} }
// #region Mandatory getters and methods to implement // #region Mandatory getters and methods to implement
@ -33,6 +24,7 @@ class CorpusList extends ResourceList {
<tr class="list-item clickable hoverable"> <tr class="list-item clickable hoverable">
<td><a class="btn-floating disabled"><i class="material-icons service-color darken" data-service="corpus-analysis">book</i></a></td> <td><a class="btn-floating disabled"><i class="material-icons service-color darken" data-service="corpus-analysis">book</i></a></td>
<td><b class="title"></b><br><i class="description"></i></td> <td><b class="title"></b><br><i class="description"></i></td>
<td><span class="owner"></span></td>
<td><span class="status badge new corpus-status-color corpus-status-text" data-badge-caption=""></span></td> <td><span class="status badge new corpus-status-color corpus-status-text" data-badge-caption=""></span></td>
<td class="right-align"> <td class="right-align">
<a class="list-action-trigger btn-floating red waves-effect waves-light" data-list-action="delete-request"><i class="material-icons">delete</i></a> <a class="list-action-trigger btn-floating red waves-effect waves-light" data-list-action="delete-request"><i class="material-icons">delete</i></a>
@ -48,7 +40,9 @@ class CorpusList extends ResourceList {
{data: ['creation-date']}, {data: ['creation-date']},
{name: 'status', attr: 'data-status'}, {name: 'status', attr: 'data-status'},
'description', 'description',
'title' 'title',
'owner',
{data: ['is-owner']}
]; ];
} }
@ -68,6 +62,7 @@ class CorpusList extends ResourceList {
<tr> <tr>
<th></th> <th></th>
<th>Title and Description</th> <th>Title and Description</th>
<th>Owner</th>
<th>Status</th> <th>Status</th>
<th></th> <th></th>
</tr> </tr>
@ -84,7 +79,9 @@ class CorpusList extends ResourceList {
'creation-date': corpus.creation_date, 'creation-date': corpus.creation_date,
'description': corpus.description, 'description': corpus.description,
'status': corpus.status, 'status': corpus.status,
'title': corpus.title 'title': corpus.title,
'owner': corpus.user.username,
'is-owner': corpus.user.id === currentUserId ? true : false
}; };
} }

View File

@ -1,14 +0,0 @@
class FollowedCorpusList extends CorpusList {
get item() {
return `
<tr class="list-item clickable hoverable">
<td><a class="btn-floating disabled"><i class="material-icons service-color darken" data-service="corpus-analysis">book</i></a></td>
<td><b class="title"></b><br><i class="description"></i></td>
<td><span class="status badge new corpus-status-color corpus-status-text" data-badge-caption=""></span></td>
<td class="right-align">
<a class="list-action-trigger btn-floating service-color darken waves-effect waves-light" data-list-action="view" data-service="corpus-analysis"><i class="material-icons">send</i></a>
</td>
</tr>
`.trim();
}
}

View File

@ -4,6 +4,7 @@ class PublicCorpusList extends CorpusList {
<tr class="list-item clickable hoverable"> <tr class="list-item clickable hoverable">
<td><a class="btn-floating disabled"><i class="material-icons service-color darken" data-service="corpus-analysis">book</i></a></td> <td><a class="btn-floating disabled"><i class="material-icons service-color darken" data-service="corpus-analysis">book</i></a></td>
<td><b class="title"></b><br><i class="description"></i></td> <td><b class="title"></b><br><i class="description"></i></td>
<td><span class="owner"></span></td>
<td><span class="status badge new corpus-status-color corpus-status-text" data-badge-caption=""></span></td> <td><span class="status badge new corpus-status-color corpus-status-text" data-badge-caption=""></span></td>
<td class="right-align"> <td class="right-align">
<a class="list-action-trigger btn-floating service-color darken waves-effect waves-light" data-list-action="view" data-service="corpus-analysis"><i class="material-icons">send</i></a> <a class="list-action-trigger btn-floating service-color darken waves-effect waves-light" data-list-action="view" data-service="corpus-analysis"><i class="material-icons">send</i></a>

View File

@ -110,8 +110,8 @@
</table> </table>
<br> <br>
<p></p> <p></p>
{% if not current_user.is_following_corpus(corpus) %} {% if not current_user.is_following_corpus(corpus) and corpus.user.has_profile_privacy_setting('SHOW_EMAIL') %}
<a class="waves-effect waves-light btn-small">Request Corpus</a> <a class="waves-effect waves-light btn-small" href="mailto:{{ corpus.user.email }}">Request Corpus</a>
{% endif %} {% endif %}
<a class="waves-effect waves-light btn-small" href="{{ url_for('users.user', user_id=corpus.user.id) }}">View profile</a> <a class="waves-effect waves-light btn-small" href="{{ url_for('users.user', user_id=corpus.user.id) }}">View profile</a>
</div> </div>
@ -153,7 +153,7 @@
{% block modals %} {% block modals %}
{{ super() }} {{ super() }}
{% if cfr.has_permission('MANAGE_FOLLOWERS') %} {% if current_user == corpus.user or current_user.is_administrator() %}
<div class="modal" id="publishing-modal"> <div class="modal" id="publishing-modal">
<div class="modal-content"> <div class="modal-content">
<h4>Change your Corpus publishing status</h4> <h4>Change your Corpus publishing status</h4>
@ -172,9 +172,7 @@
<a class="modal-close waves-effect waves-green btn-flat">Close</a> <a class="modal-close waves-effect waves-green btn-flat">Close</a>
</div> </div>
</div> </div>
{% endif %}
{% if current_user == corpus.user or current_user.is_administrator() %}
<div class="modal" id="delete-modal"> <div class="modal" id="delete-modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Corpus deletion</h4> <h4>Confirm Corpus deletion</h4>
@ -221,9 +219,9 @@
You can set different roles via the link, you can also edit them later in the menu below. You can set different roles via the link, you can also edit them later in the menu below.
It is recommended not to set the expiration date of the link too far. It is recommended not to set the expiration date of the link too far.
</p> </p>
<h5>Please make sure that the invited users are legally allowed to view the included corpus files.</h5> <p><b>Please make sure that the invited users are legally allowed to view the included corpus files.</b></p>
<div class="row"> <div class="row">
<div class="col s12 l3"> <div class="col s12 l2">
<div class="input-field"> <div class="input-field">
<i class="material-icons prefix">badge</i> <i class="material-icons prefix">badge</i>
<select id="share-link-modal-corpus-follower-role-select"> <select id="share-link-modal-corpus-follower-role-select">
@ -241,12 +239,12 @@
<label for="expiration-date">Expiration date</label> <label for="expiration-date">Expiration date</label>
</div> </div>
</div> </div>
<div class="col s12 l3"> <div class="col s12 l2">
<br class="hide-on-med-and-down"> <br class="hide-on-med-and-down">
<a class="btn waves-effect waves-light" id="share-link-modal-create-button">Create<i class="material-icons right">send</i></a> <a class="btn waves-effect waves-light" id="share-link-modal-create-button">Create<i class="material-icons right">send</i></a>
</div> </div>
<div class="col s12 l6"> <div class="col s12 l5">
<div class="row hide" id="share-link-modal-output-container"> <div class="row hide" id="share-link-modal-output-container">
<div class="col s9"> <div class="col s9">
<div class="input-field"> <div class="input-field">
@ -275,13 +273,6 @@
let corpusDisplay = new CorpusDisplay(document.querySelector('#corpus-display')); let corpusDisplay = new CorpusDisplay(document.querySelector('#corpus-display'));
{% if current_user.is_following_corpus(corpus) %} {% if current_user.is_following_corpus(corpus) %}
{% if cfr.has_permission('MANAGE_FILES') %}
let buildButton = document.querySelector('#build-button');
buildButton.addEventListener('click', () => {
Requests.corpora.entity.build({{ corpus.hashid|tojson }})
});
{% endif %}
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 }})
@ -321,8 +312,8 @@ let inviteUserModalSearchElement = document.querySelector('#invite-user-modal-se
let inviteUserModalInviteButtonElement = document.querySelector('#invite-user-modal-invite-button'); let inviteUserModalInviteButtonElement = document.querySelector('#invite-user-modal-invite-button');
let users = { let users = {
{% for user in users %} {% for user in users %}
{{ user.username|tojson }}: {{ url_for('users.user_avatar', user_id=user.id)|tojson }} {{ user.username|tojson }}: {{ url_for('users.user_avatar', user_id=user.id)|tojson }}
{% if not loop.last %},{% endif %} {% if not loop.last %},{% endif %}
{% endfor %} {% endfor %}
}; };

View File

@ -15,7 +15,7 @@
<div class="col s12"> <div class="col s12">
<div class="card"> <div class="card">
<div class="card-content"> <div class="card-content">
<div class="corpus-list" data-user-id="{{ current_user.hashid }}"></div> <div class="corpus-list no-autoinit" data-user-id="{{ current_user.hashid }}"></div>
</div> </div>
<div class="card-action right-align"> <div class="card-action right-align">
<a class="btn disabled waves-effect waves-light" href="{{ url_for('corpora.import_corpus') }}">Import Corpus<i class="material-icons right">import_export</i></a> <a class="btn disabled waves-effect waves-light" href="{{ url_for('corpora.import_corpus') }}">Import Corpus<i class="material-icons right">import_export</i></a>
@ -135,3 +135,21 @@
</div> </div>
</div> </div>
{% endblock modals %} {% endblock modals %}
{% block scripts %}
{{ super() }}
<script>
let corpusList = new CorpusList(document.querySelector('.corpus-list'));
corpusList.add(
[
{% for corpus in corpora %}
{{ corpus.to_json_serializeable(backrefs=True)|tojson }},
{% endfor %}
]
);
corpusItems = document.querySelectorAll('[data-is-owner="false"]');
corpusItems.forEach((item) => {
item.classList.add('deep-purple', 'lighten-5');
});
</script>
{% endblock scripts %}

View File

@ -74,7 +74,7 @@
publicCorpusList.add( publicCorpusList.add(
[ [
{% for corpus in corpora %} {% for corpus in corpora %}
{{ corpus.to_json_serializeable()|tojson }}, {{ corpus.to_json_serializeable(backrefs=True)|tojson }},
{% endfor %} {% endfor %}
] ]
); );

View File

@ -122,19 +122,23 @@
{% block scripts %} {% block scripts %}
{{ super() }} {{ super() }}
<script> <script>
let followedCorpusList = new FollowedCorpusList(document.querySelector('.followed-corpus-list')); let followedCorpusList = new PublicCorpusList(document.querySelector('.followed-corpus-list'));
followedCorpusList.add( followedCorpusList.add(
[ [
{% for corpus in user.followed_corpora %} {% for corpus in user.followed_corpora %}
{{ corpus.to_json_serializeable()|tojson }}, {% if (corpus.is_public or corpus.user == current_user) %}
{{ corpus.to_json_serializeable(backrefs=True)|tojson }},
{% endif %}
{% endfor %} {% endfor %}
] ]
); );
let publicCorpusList = new PublicCorpusList(document.querySelector('.public-corpus-list')); let publicCorpusList = new PublicCorpusList(document.querySelector('.public-corpus-list'));
publicCorpusList.add( publicCorpusList.add(
[ [
{% for corpus in user.corpora if corpus.is_public %} {% for corpus in user.corpora %}
{{ corpus.to_json_serializeable()|tojson }}, {% if corpus.is_public %}
{{ corpus.to_json_serializeable(backrefs=True)|tojson }},
{% endif %}
{% endfor %} {% endfor %}
] ]
); );