diff --git a/app/corpora/routes.py b/app/corpora/routes.py index fd7181459bd232f22f61c84d786c3cc80b084321..ecb74caea224cff3274d78878751a81e1e9d13d5 100644 --- a/app/corpora/routes.py +++ b/app/corpora/routes.py @@ -68,11 +68,12 @@ def disable_corpus_is_public(corpus_id): @bp.route('/<hashid:corpus_id>/follow/<token>') @login_required def follow_corpus(corpus_id, token): - corpus = Corpus.query.get_or_404(corpus_id) + corpus = current_user.verify_follow_corpus_token(token)['corpus'] + role = current_user.verify_follow_corpus_token(token)['role'] if not (current_user.is_authenticated and current_user.verify_follow_corpus_token(token)): abort(403) if not current_user.is_following_corpus(corpus) and current_user != corpus.user: - current_user.follow_corpus(corpus) + current_user.follow_corpus(corpus, role) db.session.commit() flash(f'You are following {corpus.title} now', category='corpus') return redirect(url_for('corpora.corpus', corpus_id=corpus_id)) @@ -164,20 +165,24 @@ def create_corpus(): def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) exp_date = (datetime.utcnow() + timedelta(days=7)).strftime('%b %d, %Y') + roles = [x.name for x in CorpusFollowerRole.query.all()] if corpus.user == current_user or current_user.is_administrator(): return render_template( 'corpora/corpus.html.j2', corpus=corpus, exp_date=exp_date, + roles=roles, title='Corpus' ) if current_user.is_following_corpus(corpus) or corpus.is_public: corpus_files = [x.to_json_serializeable() for x in corpus.files] + owner = corpus.user.to_json_serializeable() return render_template( 'corpora/public_corpus.html.j2', corpus=corpus, corpus_files=corpus_files, - title='Corpus' + owner=owner, + title='Corpus', ) abort(403) @@ -185,10 +190,10 @@ def corpus(corpus_id): @login_required def generate_corpus_share_link(corpus_id): data = request.get_json('data') - # permission = data['permission'] + role = data['role'] exp_data = data['expiration'] expiration = datetime.strptime(exp_data, '%b %d, %Y') - token = current_user.generate_follow_corpus_token(corpus_id, expiration) + token = current_user.generate_follow_corpus_token(corpus_id, role, expiration) link = url_for('corpora.follow_corpus', corpus_id=corpus_id, token=token, _external=True) return link diff --git a/app/models.py b/app/models.py index 74d82410c1e377bd6f5c4be20dfcb3969fa5aa59..8fc08c1824d398ae48566cfb99456b530788fafc 100644 --- a/app/models.py +++ b/app/models.py @@ -789,13 +789,14 @@ class User(HashidMixin, UserMixin, db.Model): def is_following_corpus(self, corpus): return corpus in self.followed_corpora - def generate_follow_corpus_token(self, corpus_id, expiration=7): + def generate_follow_corpus_token(self, corpus_id, role, expiration=7): now = datetime.utcnow() payload = { 'exp': expiration, 'iat': now, 'iss': current_app.config['SERVER_NAME'], - 'sub': corpus_id + 'sub': corpus_id, + 'role': role } return jwt.encode( payload, @@ -816,9 +817,10 @@ class User(HashidMixin, UserMixin, db.Model): return False corpus_id = payload.get('sub') corpus = Corpus.query.get_or_404(corpus_id) + role = CorpusFollowerRole.query.filter_by(name=payload.get('role')).first() if corpus is None: return False - return True + return {'corpus': corpus, 'role': role} def to_json_serializeable(self, backrefs=False, relationships=False, filter_by_privacy_settings=False): json_serializeable = { diff --git a/app/static/js/RessourceDisplays/CorpusDisplay.js b/app/static/js/RessourceDisplays/CorpusDisplay.js index d42fa20c38e6ef00386c73a15d1873ed40662b7f..4e8e8a9a53db0d49d31fc9a59d4f1d8acb572674 100644 --- a/app/static/js/RessourceDisplays/CorpusDisplay.js +++ b/app/static/js/RessourceDisplays/CorpusDisplay.js @@ -124,13 +124,12 @@ class CorpusDisplay extends RessourceDisplay { let copyShareLinkButton = this.displayElement.querySelector('#copy-share-link-button'); let shareLinkInput = this.displayElement.querySelector('#share-link-input'); let shareLinkContainer = this.displayElement.querySelector('#share-link-container'); - // let permissionSelect = this.displayElement.querySelector('#permission-select'); + let roleSelect = this.displayElement.querySelector('#role-select'); let expirationDate = this.displayElement.querySelector('#expiration'); generateShareLinkButton.addEventListener('click', () => { - // Utils.generateCorpusShareLinkRequest(`${this.corpusId}`, permissionSelect.value, expirationDate.value) - Utils.generateCorpusShareLinkRequest(`${this.corpusId}`, expirationDate.value) + Utils.generateCorpusShareLinkRequest(`${this.corpusId}`, roleSelect.value, expirationDate.value) .then((shareLink) => { shareLinkContainer.classList.remove('hide'); shareLinkInput.value = shareLink; diff --git a/app/static/js/Utils.js b/app/static/js/Utils.js index f8dbf2d01719cc73a10c4843b3ca606fe9414335..865ea0d435eb6ed5edc0255b1243ea7a50462d23 100644 --- a/app/static/js/Utils.js +++ b/app/static/js/Utils.js @@ -757,11 +757,9 @@ class Utils { }); } - // static generateCorpusShareLinkRequest(corpusId, permission, expiration) { - static generateCorpusShareLinkRequest(corpusId, expiration) { + static generateCorpusShareLinkRequest(corpusId, role, expiration) { return new Promise((resolve, reject) => { - // const data = {permission: permission, expiration: expiration}; - const data = {expiration: expiration}; + const data = {role: role, expiration: expiration}; fetch(`/corpora/${corpusId}/generate-corpus-share-link`, {method: 'POST', headers: {Accept: 'text/plain'}, body: JSON.stringify(data)}) .then( (response) => { diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2 index 196faef2d596d7386019300619e8840b4640bc58..8495040333d661d400067108b0cbbf58df10af85 100644 --- a/app/templates/corpora/corpus.html.j2 +++ b/app/templates/corpora/corpus.html.j2 @@ -96,18 +96,18 @@ </div> <br> <p></p> - {# <div class="row"> + <div class="row"> <div class="col s4"> <div class="input-field"> - <select id="permission-select"> - <option value="view" selected>View</option> - <option value="contribute">Contribute</option> - <option value="administrate">Administrate</option> + <select id="role-select"> + {% for role in roles%} + <option value="{{role}}">{{role}}</option> + {% endfor %} </select> - <label>Permission</label> + <label>Role</label> </div> </div> - </div> #} + </div> <div class="row"> <div class="col s4"> <div class="input-field"> diff --git a/app/templates/corpora/public_corpus.html.j2 b/app/templates/corpora/public_corpus.html.j2 index 63744441d8d3dfc85f9eef2086a5b4f03975cc7b..17a7ae072afcdeeb01c97f756b697d680aa71ed5 100644 --- a/app/templates/corpora/public_corpus.html.j2 +++ b/app/templates/corpora/public_corpus.html.j2 @@ -11,7 +11,7 @@ <div class="row"> <div class="col s8 m9 l10"> {% if current_user.is_following_corpus(corpus) %} - <a class="action-button btn waves-effect waves-light" data-action="unfollow-request"><i class="material-icons left">add</i>Unfollow Corpus</a> + <a class="action-button btn waves-effect waves-light" data-action="unfollow-request"><i class="material-icons left outlined">close</i>Unfollow Corpus</a> {% endif %} {% if corpus.status.name in ['BUILT', 'STARTING_ANALYSIS_SESSION', 'RUNNING_ANALYSIS_SESSION', 'CANCELING_ANALYSIS_SESSION'] and current_user.is_following_corpus(corpus) %} <a class="btn waves-effect waves-light" href="{{ url_for('corpora.analyse_corpus', corpus_id=corpus.id) }}">Analyze</a> @@ -40,12 +40,52 @@ </div> </div> </div> + <div class="card"> + <div class="card-content"> + <span class="card-title" id="files">Corpus Owner</span> + <div class="row"> + <div class="col s12"> + <table> + <tr> + <td style="width:10%; margin-top:25px;"> + {% if corpus.user.avatar %} + <img src="{{ url_for('users.profile_avatar', user_id=corpus.user.id) }}" alt="user-image" class="circle responsive-img"> + {% else %} + <img src="{{ url_for('static', filename='images/user_avatar.png') }}" alt="user-image" class="circle responsive-img"> + {% endif %} + </td> + <td></td> + <td> + <ul> + <li><b>{{ owner.username }}</b></li> + {% if owner.full_name %} + <li>{{ owner.full_name }}</li> + {% endif %} + {% if owner.show_email %} + <li></li><a href="mailto:{{ owner.email }}">{{ owner.email }}</a></li> + {% endif %} + </ul> + </td> + </tr> + </table> + {% if not current_user.is_following_corpus(corpus) %} + <br> + <p></p> + <a class="waves-effect waves-light btn-small">Request Corpus</a> + {% endif %} + </div> + </div> + </div> + </div> + + {% if current_user.is_following_corpus(corpus)%} <div class="card"> <div class="card-content"> <span class="card-title" id="files">Corpus files</span> - <div class="corpus-file-list no-autoinit" data-user-id="{{ corpus.user.hashid }}" data-corpus-id="{{ corpus.hashid }}"></div> + <div class="corpus-file-list no-autoinit" data-user-id="{{ owner.hashid }}" data-corpus-id="{{ corpus.hashid }}"></div> </div> </div> + {% endif %} </div> </div> </div>