diff --git a/app/corpora/events.py b/app/corpora/events.py index 9ee6896655dbba9b5cfbfebbe926afbf4492b14c..907bcc939ae04976abc2fbfe0a85dc6f9a01ba6a 100644 --- a/app/corpora/events.py +++ b/app/corpora/events.py @@ -2,6 +2,7 @@ from datetime import datetime from flask import current_app, request from flask_login import current_user from socket import gaierror +from werkzeug.utils import secure_filename from .. import db, socketio from ..decorators import socketio_login_required from ..socketio_events import socketio_sessions @@ -43,24 +44,12 @@ def init_corpus_analysis(corpus_id): if corpus.status == 'prepared': corpus.status = 'start analysis' db.session.commit() - event = 'user_{}_patch'.format(corpus.user_id) - jsonpatch = [{'op': 'replace', 'path': '/corpora/{}/status'.format(corpus.id), 'value': corpus.status}] # noqa - room = 'user_{}'.format(corpus.user_id) - socketio.emit(event, jsonpatch, room=room) socketio.start_background_task(corpus_analysis_session_handler, current_app._get_current_object(), corpus_id, current_user.id, request.sid) def corpus_analysis_session_handler(app, corpus_id, user_id, session_id): - def change_corpus_status(status): - corpus.status = status - db.session.commit() - event = 'user_{}_patch'.format(corpus.user_id) - jsonpatch = [{'op': 'replace', 'path': '/corpora/{}/status'.format(corpus.id), 'value': corpus.status}] # noqa - room = 'user_{}'.format(corpus.user_id) - socketio.emit(event, jsonpatch, room=room) - with app.app_context(): ''' Setup analysis session ''' corpus = Corpus.query.get(corpus_id) @@ -71,7 +60,8 @@ def corpus_analysis_session_handler(app, corpus_id, user_id, session_id): if retry_counter == 0: response = {'code': 408, 'desc': None, 'msg': 'Request Timeout'} # noqa socketio.emit('corpus_analysis_init', response, room=request.sid) # noqa - change_corpus_status('stop analysis') + corpus.status = 'stop analysis' + db.session.commit() return socketio.sleep(3) client = cqi.CQiClient('cqpserver_{}'.format(corpus_id)) @@ -80,12 +70,14 @@ def corpus_analysis_session_handler(app, corpus_id, user_id, session_id): payload = {'code': connect_status, 'msg': cqi.api.specification.lookup[connect_status]} # noqa except cqi.errors.CQiException as e: handle_cqi_exception('corpus_analysis_init', e, session_id) - change_corpus_status('stop analysis') + corpus.status = 'stop analysis' + db.session.commit() return except gaierror: response = {'code': 500, 'desc': None, 'msg': 'Internal Server Error'} # noqa socketio.emit('corpus_analysis_init', response, room=session_id) - change_corpus_status('stop analysis') + corpus.status = 'stop analysis' + db.session.commit() return corpus_analysis_clients[session_id] = client if corpus_id in corpus_analysis_sessions: @@ -102,7 +94,7 @@ def corpus_analysis_session_handler(app, corpus_id, user_id, session_id): if client.status == 'running': client.status = 'abort' while client.status != 'ready': - socketio.sleep(0.1) + socketio.sleep(0.3) try: client.disconnect() except cqi.errors.CQiException: @@ -111,7 +103,8 @@ def corpus_analysis_session_handler(app, corpus_id, user_id, session_id): corpus_analysis_sessions[corpus_id].remove(session_id) if not corpus_analysis_sessions[corpus_id]: corpus_analysis_sessions.pop(corpus_id, None) - change_corpus_status('stop analysis') + corpus.status = 'stop analysis' + db.session.commit() @socketio.on('corpus_analysis_meta_data') @@ -127,24 +120,23 @@ def corpus_analysis_get_meta_data(corpus_id): db_corpus.last_edited_date.isoformat() client = corpus_analysis_clients.get(request.sid) if client is None: - response = {'code': 424, 'desc': 'No client found for this session', - 'msg': 'Failed Dependency'} + response = {'code': 424, 'desc': None, 'msg': 'Failed Dependency'} socketio.emit('corpus_analysis_meta_data', response, room=request.sid) return # check if client is busy or not if client.status == 'running': client.status = 'abort' while client.status != 'ready': - socketio.sleep(0.1) + socketio.sleep(0.3) # get meta data from corpus in cqp server client.status = 'running' try: - client_corpus = client.corpora.get('CORPUS') - metadata['corpus_properties'] = client_corpus.attrs['properties'] - metadata['corpus_size_tokens'] = client_corpus.attrs['size'] + cwb_corpus = client.corpora.get('CORPUS') + metadata['corpus_properties'] = cwb_corpus.attrs['properties'] + metadata['corpus_size_tokens'] = cwb_corpus.attrs['size'] - text_attr = client_corpus.structural_attributes.get('text') - struct_attrs = client_corpus.structural_attributes.list( + text_attr = cwb_corpus.structural_attributes.get('text') + struct_attrs = cwb_corpus.structural_attributes.list( filters={'part_of': text_attr}) text_ids = range(0, (text_attr.attrs['size'])) texts_metadata = {} @@ -162,15 +154,10 @@ def corpus_analysis_get_meta_data(corpus_id): # write some metadata to the db db_corpus.current_nr_of_tokens = metadata['corpus_size_tokens'] db.session.commit() - event = 'user_{}_patch'.format(db_corpus.user_id) - jsonpatch = [{'op': 'replace', 'path': '/corpora/{}/current_nr_of_tokens'.format(db_corpus.id), 'value': db_corpus.current_nr_of_tokens}] # noqa - room = 'user_{}'.format(db_corpus.user_id) - socketio.emit(event, jsonpatch, room=room) # emit data payload = metadata - response = {'code': 200, 'desc': 'Corpus meta data', 'msg': 'OK', - 'payload': payload} + response = {'code': 200, 'desc': None, 'msg': 'OK', 'payload': payload} socketio.emit('corpus_analysis_meta_data', response, room=request.sid) except cqi.errors.CQiException as e: payload = {'code': e.code, 'desc': e.description, 'msg': e.name} @@ -185,14 +172,13 @@ def corpus_analysis_get_meta_data(corpus_id): def corpus_analysis_query(query): client = corpus_analysis_clients.get(request.sid) if client is None: - response = {'code': 424, 'desc': 'No client found for this session', - 'msg': 'Failed Dependency'} + response = {'code': 424, 'desc': None, 'msg': 'Failed Dependency'} socketio.emit('corpus_analysis_query', response, room=request.sid) return if client.status == 'running': client.status = 'abort' while client.status != 'ready': - socketio.sleep(0.1) + socketio.sleep(0.3) client.status = 'running' try: corpus = client.corpora.get('CORPUS') @@ -248,7 +234,7 @@ def corpus_analysis_get_match_with_full_context(payload): if client.status == 'running': client.status = 'abort' while client.status != 'ready': - socketio.sleep(0.1) + socketio.sleep(0.3) client.status = 'running' try: corpus = client.corpora.get('CORPUS') @@ -295,13 +281,15 @@ def export_corpus(corpus_id): # delete old corpus archive if it exists/has been build before if corpus.archive_file is not None and os.path.isfile(corpus.archive_file): os.remove(corpus.archive_file) - zip_name = corpus.title - zip_path = os.path.join(current_user.path, 'corpora', zip_name) - corpus.archive_file = os.path.join(corpus.path, zip_name) + '.zip' + archive_file_base_name = '[corpus]_' + secure_filename(corpus.title) + corpus.archive_file = archive_file_base_name + '.zip' db.session.commit() - shutil.make_archive(zip_path, 'zip', corpus.path) - shutil.move(zip_path + '.zip', corpus.archive_file) - socketio.emit('export_corpus_' + str(corpus.id), room=request.sid) + shutil.make_archive( + os.path.join(corpus.creator.path, 'corpora', archive_file_base_name), + 'zip', + corpus.path + ) + socketio.emit('export_corpus_{}'.format(corpus.id), room=request.sid) def handle_cqi_exception(event, exception, room): diff --git a/app/corpora/views.py b/app/corpora/views.py index 32b20702fa1a297048dace0efb706ca8af56e88e..0c5b9cfe5fb0ab99d6e72af918dddf9a48e7231c 100644 --- a/app/corpora/views.py +++ b/app/corpora/views.py @@ -131,11 +131,12 @@ def download_corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) if not (corpus.creator == current_user or current_user.is_administrator()): abort(403) - # TODO: Check what happens here - dir = os.path.dirname(corpus.archive_file) - filename = os.path.basename(corpus.archive_file) - return send_from_directory(as_attachment=True, directory=dir, - filename=filename, mimetype='zip') + return send_from_directory( + as_attachment=True, + directory=os.path.join(corpus.creator.path, 'corpora'), + filename=corpus.archive_file, + mimetype='zip' + ) @corpora.route('/<int:corpus_id>/analyse')