diff --git a/app/corpora/routes.py b/app/corpora/routes.py index ecfc1e84384bd1d95fa8fbacf6389164722b9906..1c669f61cfacebce85b9a286f350f1bc0a59d34e 100644 --- a/app/corpora/routes.py +++ b/app/corpora/routes.py @@ -68,17 +68,24 @@ def disable_corpus_is_public(corpus_id): @bp.route('/<hashid:corpus_id>/follow/<token>') @login_required def follow_corpus(corpus_id, token): - try: + corpus = Corpus.query.get_or_404(corpus_id) + try: payload = jwt.decode( - token, - current_app.config['SECRET_KEY'], - algorithms=['HS256'], - issuer=current_app.config['SERVER_NAME'], - options={'require': ['iat', 'iss', 'sub']} - ) + token, + current_app.config['SECRET_KEY'], + algorithms=['HS256'], + issuer=current_app.config['SERVER_NAME'], + # options={'require': ['exp', 'iat', 'iss', 'sub']} + options={'require': ['exp', 'iat', 'iss']} + ) except jwt.PyJWTError: - return False - return redirect(url_for('.corpus', corpus_id=corpus_id)) + abort(410) + # permission = payload.get('sub') + if not current_user.is_following_corpus(corpus): + current_user.follow_corpus(corpus) + db.session.commit() + flash(f'You are following {corpus.title} now', category='corpus') + return redirect(url_for('corpora.corpus', corpus_id=corpus_id)) @bp.route('/<hashid:corpus_id>/followers/<hashid:follower_id>/unfollow', methods=['POST']) @@ -167,6 +174,9 @@ 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') + print(corpus.user) + print(current_user) + print(current_user.is_following_corpus(corpus)) if corpus.user == current_user or current_user.is_administrator(): return render_template( 'corpora/corpus.html.j2', @@ -188,15 +198,15 @@ def corpus(corpus_id): @login_required def generate_corpus_share_link(corpus_id): data = request.get_json('data') - permission = data['permission'] - expiration = data['expiration'] - corpus = Corpus.query.get_or_404(corpus_id) + # permission = data['permission'] + exp_data = data['expiration'] + expiration = datetime.strptime(exp_data, '%b %d, %Y') now = datetime.utcnow() payload = { 'exp': expiration, 'iat': now, - 'iss': current_app.config['SERVER_NAME'], - 'sub': permission + 'iss': current_app.config['SERVER_NAME'] + # 'sub': permission } token = jwt.encode( payload, diff --git a/app/static/js/RessourceDisplays/CorpusDisplay.js b/app/static/js/RessourceDisplays/CorpusDisplay.js index fd342dd4bcbedb51450edeef8e38a67e82e3cbc3..d42fa20c38e6ef00386c73a15d1873ed40662b7f 100644 --- a/app/static/js/RessourceDisplays/CorpusDisplay.js +++ b/app/static/js/RessourceDisplays/CorpusDisplay.js @@ -31,6 +31,7 @@ class CorpusDisplay extends RessourceDisplay { this.setStatus(corpus.status); this.setTitle(corpus.title); this.setNumTokens(corpus.num_tokens); + this.setShareLink(); } onPatch(patch) { @@ -117,4 +118,29 @@ class CorpusDisplay extends RessourceDisplay { new Date(creationDate).toLocaleString("en-US") ); } + + setShareLink() { + let generateShareLinkButton = this.displayElement.querySelector('#generate-share-link-button'); + 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 expirationDate = this.displayElement.querySelector('#expiration'); + + + generateShareLinkButton.addEventListener('click', () => { + // Utils.generateCorpusShareLinkRequest(`${this.corpusId}`, permissionSelect.value, expirationDate.value) + Utils.generateCorpusShareLinkRequest(`${this.corpusId}`, expirationDate.value) + .then((shareLink) => { + shareLinkContainer.classList.remove('hide'); + shareLinkInput.value = shareLink; + }); + }); + + copyShareLinkButton.addEventListener('click', () => { + shareLinkInput.select(); + navigator.clipboard.writeText(shareLinkInput.value); + app.flash(`Copied!`, 'success'); + }); + } } diff --git a/app/static/js/Utils.js b/app/static/js/Utils.js index 80340d6c764dd6fc3714434cf2b6eb96e5407145..354f0f630eb57c19302808198a3bf00f3d1ed459 100644 --- a/app/static/js/Utils.js +++ b/app/static/js/Utils.js @@ -778,9 +778,11 @@ class Utils { }); } - static generateCorpusShareLinkRequest(corpusId, permission, expiration) { + // static generateCorpusShareLinkRequest(corpusId, permission, expiration) { + static generateCorpusShareLinkRequest(corpusId, expiration) { return new Promise((resolve, reject) => { - const data = {permission: permission, expiration: expiration}; + // const data = {permission: permission, expiration: expiration}; + const data = {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 0e982d70beaec70c4b40492ea6cbf1e937cc5423..196faef2d596d7386019300619e8840b4640bc58 100644 --- a/app/templates/corpora/corpus.html.j2 +++ b/app/templates/corpora/corpus.html.j2 @@ -96,7 +96,7 @@ </div> <br> <p></p> - <div class="row"> + {# <div class="row"> <div class="col s4"> <div class="input-field"> <select id="permission-select"> @@ -107,7 +107,7 @@ <label>Permission</label> </div> </div> - </div> + </div> #} <div class="row"> <div class="col s4"> <div class="input-field"> @@ -119,8 +119,18 @@ <div class="row"> <div class="col s12"> <a class="action-button btn waves-effect waves-light" id="generate-share-link-button">Generate Share Link</a> - <div id="share-link"></div> - <a class="action-button btn-small waves-effect waves-light hide" id="copy-share-link-button">Copy</a> + </div> + <div class="col s12 hide" id="share-link-container"> + <p></p> + <br> + <div class="row"> + <div class="col s1"> + <a class="action-button btn-small waves-effect waves-light" id="copy-share-link-button">Copy</a> + </div> + <div class="col s11"> + <input id="share-link-input" readonly> + </div> + </div> </div> </div> </div> @@ -142,30 +152,5 @@ {{ super() }} <script> let corpusDisplay = new CorpusDisplay(document.querySelector('#corpus-display')); - let generateShareLinkButton = document.querySelector('#generate-share-link-button'); - let copyShareLinkButton = document.querySelector('#copy-share-link-button'); - let shareLink = document.querySelector('#share-link'); - let permissionSelect = document.querySelector('#permission-select'); - let expirationDate = document.querySelector('#expiration'); - - - generateShareLinkButton.addEventListener('click', () => { - Utils.generateCorpusShareLinkRequest('{{ corpus.hashid }}', permissionSelect.value, expirationDate.value) - .then((corpusShareLink) => { - console.log(corpusShareLink); - let shareLinkElement = document.createElement('input'); - shareLinkElement.value = corpusShareLink; - shareLinkElement.setAttribute('readonly', ''); - shareLink.appendChild(shareLinkElement); - copyShareLinkButton.classList.remove('hide'); - }); - }); - - copyShareLinkButton.addEventListener('click', () => { - let shareLinkElement = document.querySelector('#share-link input'); - shareLinkElement.select(); - document.execCommand('copy'); - app.flash(`Copied!`, 'success'); - }); </script> {% endblock scripts %} diff --git a/app/templates/corpora/public_corpus.html.j2 b/app/templates/corpora/public_corpus.html.j2 index 94b3524cee745f0e591636003d62d43e504c3d8a..63744441d8d3dfc85f9eef2086a5b4f03975cc7b 100644 --- a/app/templates/corpora/public_corpus.html.j2 +++ b/app/templates/corpora/public_corpus.html.j2 @@ -61,13 +61,13 @@ let unfollowRequestElement = document.querySelector('.action-button[data-action="unfollow-request"]'); unfollowRequestElement.addEventListener('click', () => { return new Promise((resolve, reject) => { - fetch('{{ url_for("corpora.unfollow_corpus", corpus_id=corpus.id) }}', {method: 'POST', headers: {Accept: 'application/json'}}) + fetch('{{ url_for("corpora.current_user_unfollow_corpus", corpus_id=corpus.id) }}', {method: 'POST', headers: {Accept: 'application/json'}}) .then( (response) => { if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 404) {app.flash('Not Found', 'error'); reject(response);} resolve(response); - window.location.href = '{{ url_for("corpora.corpus", corpus_id=corpus.id) }}'; + window.location.href = '{{ url_for("main.dashboard") }}'; }, (response) => { app.flash('Something went wrong', 'error');