Skip to content

Commit aecf71d

Browse files
committed
chg: [chat explorer] show message, open message in chat/subchannel/thread
1 parent afd0d6b commit aecf71d

11 files changed

+96
-31
lines changed

bin/lib/chats_viewer.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ def api_get_chats_selector():
786786
selector.append({'id': chat.get_global_id(), 'name': f'{chat.get_chat_instance()}: {chat.get_label()}'})
787787
return selector
788788

789-
def api_get_chat(chat_id, chat_instance_uuid, translation_target=None, nb=-1, page=-1, messages=True, heatmap=False):
789+
def api_get_chat(chat_id, chat_instance_uuid, translation_target=None, nb=-1, page=-1, messages=True, message=None, heatmap=False):
790790
chat = Chats.Chat(chat_id, chat_instance_uuid)
791791
if not chat.exists():
792792
return {"status": "error", "reason": "Unknown chat"}, 404
@@ -800,7 +800,7 @@ def api_get_chat(chat_id, chat_instance_uuid, translation_target=None, nb=-1, pa
800800
if translation_target not in Language.get_translation_languages():
801801
translation_target = None
802802
if messages:
803-
meta['messages'], meta['pagination'], meta['tags_messages'] = chat.get_messages(translation_target=translation_target, nb=nb, page=page)
803+
meta['messages'], meta['pagination'], meta['tags_messages'] = chat.get_messages(translation_target=translation_target, message=message, nb=nb, page=page)
804804
meta['messages'] = get_chat_object_messages_meta(meta['messages'])
805805
if heatmap:
806806
meta['years'] = chat.get_message_years()
@@ -849,7 +849,7 @@ def api_get_chat_participants(chat_type, chat_subtype, chat_id):
849849
meta['participants'] = chat_participants
850850
return meta, 200
851851

852-
def api_get_subchannel(chat_id, chat_instance_uuid, translation_target=None, nb=-1, page=-1):
852+
def api_get_subchannel(chat_id, chat_instance_uuid, translation_target=None, message=None, nb=-1, page=-1):
853853
subchannel = ChatSubChannels.ChatSubChannel(chat_id, chat_instance_uuid)
854854
if not subchannel.exists():
855855
return {"status": "error", "reason": "Unknown subchannel"}, 404
@@ -861,27 +861,27 @@ def api_get_subchannel(chat_id, chat_instance_uuid, translation_target=None, nb=
861861
meta['threads'] = get_threads_metas(meta['threads'])
862862
if meta.get('username'):
863863
meta['username'] = get_username_meta_from_global_id(meta['username'])
864-
meta['messages'], meta['pagination'], meta['tags_messages'] = subchannel.get_messages(translation_target=translation_target, nb=nb, page=page)
864+
meta['messages'], meta['pagination'], meta['tags_messages'] = subchannel.get_messages(translation_target=translation_target, message=message, nb=nb, page=page)
865865
meta['messages'] = get_chat_object_messages_meta(meta['messages'])
866866
return meta, 200
867867

868-
def api_get_thread(thread_id, thread_instance_uuid, translation_target=None, nb=-1, page=-1):
868+
def api_get_thread(thread_id, thread_instance_uuid, translation_target=None, message=None, nb=-1, page=-1):
869869
thread = ChatThreads.ChatThread(thread_id, thread_instance_uuid)
870870
if not thread.exists():
871871
return {"status": "error", "reason": "Unknown thread"}, 404
872872
# print(thread.get_obj_language_stats())
873873
meta = thread.get_meta({'chat', 'nb_messages', 'nb_participants'})
874874
# if meta['chat']:
875875
# meta['chat'] = get_chat_meta_from_global_id(meta['chat'])
876-
meta['messages'], meta['pagination'], meta['tags_messages'] = thread.get_messages(translation_target=translation_target, nb=nb, page=page)
876+
meta['messages'], meta['pagination'], meta['tags_messages'] = thread.get_messages(translation_target=translation_target, message=message, nb=nb, page=page)
877877
meta['messages'] = get_chat_object_messages_meta(meta['messages'])
878878
return meta, 200
879879

880880
def api_get_message(message_id, translation_target=None):
881881
message = Messages.Message(message_id)
882882
if not message.exists():
883883
return {"status": "error", "reason": "Unknown uuid"}, 404
884-
meta = message.get_meta({'barcodes', 'chat', 'content', 'files-names', 'forwarded_from', 'icon', 'images', 'language', 'link', 'parent', 'parent_meta', 'qrcodes', 'reactions', 'thread', 'translation', 'user-account'}, translation_target=translation_target)
884+
meta = message.get_meta({'barcodes', 'chat', 'container', 'content', 'files-names', 'forwarded_from', 'icon', 'images', 'language', 'link', 'parent', 'parent_meta', 'qrcodes', 'reactions', 'thread', 'translation', 'user-account'}, translation_target=translation_target)
885885
if 'forwarded_from' in meta:
886886
chat = get_obj_chat_from_global_id(meta['forwarded_from'])
887887
meta['forwarded_from'] = chat.get_meta({'icon'})

bin/lib/objects/ChatSubChannels.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ def delete(self):
5555

5656
def get_link(self, flask_context=False):
5757
if flask_context:
58-
url = url_for('correlation.show_correlation', type=self.type, subtype=self.subtype, id=self.id)
58+
url = url_for('chats_explorer.objects_subchannel_messages', subtype=self.subtype, id=self.id)
5959
else:
60-
url = f'{baseurl}/correlation/show?type={self.type}&subtype={self.subtype}&id={self.id}'
60+
url = f'{baseurl}/chats/explorer/subchannel?subtype={self.subtype}&id={self.id}'
6161
return url
6262

6363
def get_svg_icon(self): # TODO

bin/lib/objects/ChatThreads.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ def delete(self):
4949

5050
def get_link(self, flask_context=False):
5151
if flask_context:
52-
url = url_for('correlation.show_correlation', type=self.type, subtype=self.subtype, id=self.id)
52+
url = url_for('chats_explorer.objects_thread_messages', subtype=self.subtype, id=self.id)
5353
else:
54-
url = f'{baseurl}/correlation/show?type={self.type}&subtype={self.subtype}&id={self.id}'
54+
url = f'{baseurl}/chats/explorer/thread?subtype={self.subtype}&id={self.id}'
5555
return url
5656

5757
def get_svg_icon(self): # TODO

bin/lib/objects/Chats.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def get_link(self, flask_context=False):
5050
if flask_context:
5151
url = url_for('chats_explorer.chats_explorer_chat', subtype=self.subtype, id=self.id)
5252
else:
53-
url = f'{baseurl}/correlation/show?type={self.type}&subtype={self.subtype}&id={self.id}'
53+
url = f'{baseurl}/chats/explorer/chat?subtype={self.subtype}&id={self.id}'
5454
return url
5555

5656
def get_origin_link(self):

bin/lib/objects/Messages.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ def get_meta(self, options=None, timestamp=None, translation_target=''):
265265
if options is None:
266266
options = set()
267267
meta = self.get_default_meta(tags=True)
268+
# original_id
269+
meta['_id'] = self.id.rsplit('/', 1)[-1]
268270

269271
# timestamp
270272
if not timestamp:
@@ -304,6 +306,8 @@ def get_meta(self, options=None, timestamp=None, translation_target=''):
304306
meta['user-account'] = self.get_user_account(meta=True)
305307
if not meta['user-account']:
306308
meta['user-account'] = {'id': 'UNKNOWN'}
309+
if 'container' in options:
310+
meta['container'] = self.get_container()
307311
if 'chat' in options:
308312
meta['chat'] = self.get_chat_id()
309313
if 'thread' in options:
@@ -345,7 +349,16 @@ def get_meta(self, options=None, timestamp=None, translation_target=''):
345349
## Language ##
346350

347351
def get_root_obj(self):
348-
return self.get_objs_container(root=True)
352+
return self.get_objs_container(root=True).pop()
353+
354+
def get_container(self):
355+
thread = self.get_current_thread()
356+
if thread:
357+
return thread
358+
subchannel = self.get_subchannel()
359+
if subchannel:
360+
return subchannel
361+
return self.get_chat()
349362

350363
def get_objs_container(self, root=False):
351364
objs_containers = set()

bin/lib/objects/abstract_chat_object.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ def set_info(self, info):
128128
def get_nb_messages(self):
129129
return r_object.zcard(f'messages:{self.type}:{self.subtype}:{self.id}')
130130

131+
def get_message_page(self, message, nb):
132+
rank = r_object.zrank(f'messages:{self.type}:{self.subtype}:{self.id}', f'message::{message}')
133+
if not rank:
134+
return -1
135+
return int(rank/ nb) + 1
136+
131137
def _get_messages(self, nb=-1, page=-1):
132138
if nb < 1:
133139
messages = r_object.zrange(f'messages:{self.type}:{self.subtype}:{self.id}', 0, -1, withscores=True)
@@ -273,7 +279,7 @@ def get_message_meta(self, message, timestamp=None, translation_target='', optio
273279
meta = message.get_meta(options=options, timestamp=timestamp, translation_target=translation_target)
274280
return meta
275281

276-
def get_messages(self, start=0, page=-1, nb=500, unread=False, options=None, translation_target='en'): # threads ???? # TODO ADD last/first message timestamp + return page
282+
def get_messages(self, start=0, page=-1, nb=500, message=None, unread=False, options=None, translation_target='en'): # threads ???? # TODO ADD last/first message timestamp + return page
277283
# TODO return message meta
278284
tags = {}
279285
messages = {}
@@ -282,12 +288,15 @@ def get_messages(self, start=0, page=-1, nb=500, unread=False, options=None, tra
282288
nb = int(nb)
283289
except TypeError:
284290
nb = 500
285-
if not page:
286-
page = -1
287-
try:
288-
page = int(page)
289-
except TypeError:
290-
page = 1
291+
if message:
292+
page = self.get_message_page(message, nb)
293+
else:
294+
if not page:
295+
page = -1
296+
try:
297+
page = int(page)
298+
except TypeError:
299+
page = 1
291300
mess, pagination = self._get_messages(nb=nb, page=page)
292301
for message in mess:
293302
timestamp = message[1]

var/www/blueprints/chats_explorer.py

+38-8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from lib import Language
2525
from lib import Tag
2626
from lib import module_extractor
27+
from lib.objects import ail_objects
2728

2829
# ============ BLUEPRINT ============
2930
chats_explorer = Blueprint('chats_explorer', __name__, template_folder=os.path.join(os.environ['AIL_FLASK'], 'templates/chats_explorer'))
@@ -93,15 +94,24 @@ def chats_explorer_chat():
9394
if target == "Don't Translate":
9495
target = None
9596
nb_messages = request.args.get('nb')
96-
page = request.args.get('page')
97-
chat = chats_viewer.api_get_chat(chat_id, instance_uuid, translation_target=target, nb=nb_messages, page=page, heatmap=True)
97+
mess = request.args.get('message')
98+
if mess:
99+
message = mess
100+
page = -1
101+
message_id = message.rsplit('/', 1)[-1]
102+
else:
103+
message = None
104+
message_id = None
105+
page = request.args.get('page')
106+
chat = chats_viewer.api_get_chat(chat_id, instance_uuid, translation_target=target, message=message, nb=nb_messages, page=page, heatmap=True)
98107
if chat[1] != 200:
99108
return create_json_response(chat[0], chat[1])
100109
else:
101110
chat = chat[0]
102111
languages = Language.get_translation_languages()
103112
return render_template('chat_viewer.html', chat=chat, bootstrap_label=bootstrap_label,
104113
ail_tags=Tag.get_modal_add_tags(chat['id'], chat['type'], chat['subtype']),
114+
message_id=message_id,
105115
translation_languages=languages, translation_target=target)
106116

107117
@chats_explorer.route("chats/explorer/messages/stats/week", methods=['GET'])
@@ -154,15 +164,24 @@ def objects_subchannel_messages():
154164
if target == "Don't Translate":
155165
target = None
156166
nb_messages = request.args.get('nb')
157-
page = request.args.get('page')
158-
subchannel = chats_viewer.api_get_subchannel(subchannel_id, instance_uuid, translation_target=target, nb=nb_messages, page=page)
167+
mess = request.args.get('message')
168+
if mess:
169+
message = mess
170+
page = -1
171+
message_id = message.rsplit('/', 1)[-1]
172+
else:
173+
message = None
174+
message_id = None
175+
page = request.args.get('page')
176+
subchannel = chats_viewer.api_get_subchannel(subchannel_id, instance_uuid, translation_target=target, message=message, nb=nb_messages, page=page)
159177
if subchannel[1] != 200:
160178
return create_json_response(subchannel[0], subchannel[1])
161179
else:
162180
subchannel = subchannel[0]
163181
languages = Language.get_translation_languages()
164182
return render_template('SubChannelMessages.html', subchannel=subchannel,
165183
ail_tags=Tag.get_modal_add_tags(subchannel['id'], subchannel['type'], subchannel['subtype']),
184+
message_id=message_id,
166185
bootstrap_label=bootstrap_label, translation_languages=languages, translation_target=target)
167186

168187
@chats_explorer.route("/chats/explorer/thread", methods=['GET'])
@@ -175,14 +194,24 @@ def objects_thread_messages():
175194
if target == "Don't Translate":
176195
target = None
177196
nb_messages = request.args.get('nb')
178-
page = request.args.get('page')
179-
thread = chats_viewer.api_get_thread(thread_id, instance_uuid, translation_target=target, nb=nb_messages, page=page)
197+
mess = request.args.get('message')
198+
if mess:
199+
message = mess
200+
page = -1
201+
message_id = message.rsplit('/', 1)[-1]
202+
else:
203+
message = None
204+
message_id = None
205+
page = request.args.get('page')
206+
thread = chats_viewer.api_get_thread(thread_id, instance_uuid, translation_target=target, message=message, nb=nb_messages, page=page)
180207
if thread[1] != 200:
181208
return create_json_response(thread[0], thread[1])
182209
else:
183210
meta = thread[0]
184211
languages = Language.get_translation_languages()
185-
return render_template('ThreadMessages.html', meta=meta, bootstrap_label=bootstrap_label, translation_languages=languages, translation_target=target)
212+
return render_template('ThreadMessages.html', meta=meta, bootstrap_label=bootstrap_label,
213+
message_id=message_id,
214+
translation_languages=languages, translation_target=target)
186215

187216
@chats_explorer.route("/chats/explorer/participants", methods=['GET'])
188217
@login_required
@@ -286,12 +315,13 @@ def objects_message():
286315
else:
287316
message = message[0]
288317
languages = Language.get_translation_languages()
318+
container_url = ail_objects.get_obj_from_global_id(message['container']).get_link(flask_context=True)
289319
extracted = module_extractor.extract(current_user.get_user_id(), 'message', '', message['id'], content=message['content'])
290320
extracted_matches = module_extractor.get_extracted_by_match(extracted)
291321
message['extracted'] = extracted
292322
message['extracted_matches'] = extracted_matches
293323
return render_template('ChatMessage.html', meta=message, bootstrap_label=bootstrap_label,
294-
translation_languages=languages, translation_target=target,
324+
translation_languages=languages, translation_target=target, container_url=container_url,
295325
modal_add_tags=Tag.get_modal_add_tags(message['id'], object_type='message'))
296326

297327
@chats_explorer.route("/objects/message/translate", methods=['POST'])

var/www/templates/chats_explorer/SubChannelMessages.html

+3
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ <h5 class="mx-5 text-secondary">This week:</h5>
179179
"order": [[ 3, "desc" ]]
180180
});
181181
{% endif %}
182+
{% if message_id %}
183+
document.location.hash = '#{{ message_id }}';
184+
{% endif %}
182185
});
183186

184187
function toggle_sidebar(){

var/www/templates/chats_explorer/ThreadMessages.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,9 @@
196196
$(document).ready(function(){
197197
$("#page-Decoded").addClass("active");
198198
$("#nav_chat").addClass("active");
199-
199+
{% if message_id %}
200+
document.location.hash = '#{{ message_id }}';
201+
{% endif %}
200202
});
201203

202204
function toggle_sidebar(){

var/www/templates/chats_explorer/block_message.html

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
}
2323
</style>
2424

25-
<div class="chat-message-left pb-1">
25+
<div class="chat-message-left pb-1" id="{{ message['_id'] }}">
2626
<div>
2727
<a href="{{ url_for('chats_explorer.objects_user_account')}}?subtype={{ message['user-account']['subtype'] }}&id={{ message['user-account']['id'] }}">
2828
<img src="{% if message['user-account']['icon'] %}{{ url_for('objects_image.image', filename=message['user-account']['icon'])}}{% else %}{{ url_for('static', filename='image/ail-icon.png') }}{% endif %}"
@@ -199,7 +199,12 @@ <h4 class="text-secondary mb-0">
199199
</div>
200200

201201
<a class="btn btn-light btn-sm text-secondary px-1" href="{{ url_for('correlation.show_correlation')}}?type={{ message['type'] }}&subtype={{ message['subtype'] }}&id={{ message['id'] }}"><i class="fas fa-project-diagram"></i></a>
202-
<a class="btn btn-light btn-sm text-secondary px-1" href="{{ message['link'] }}"><i class="fas fa-eye"></i></a>
202+
{% if container_url %}
203+
<a class="btn btn-light btn-sm text-secondary px-1" href="{{ container_url }}&message={{ message['id'] }}"><i class="fas fa-eye"></i></a>
204+
{% else %}
205+
<a class="btn btn-light btn-sm text-secondary px-1" href="{{ message['link'] }}"><i class="fas fa-eye"></i></a>
206+
{% endif %}
207+
203208
</div>
204209
</div>
205210
</div>

var/www/templates/chats_explorer/chat_viewer.html

+3
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ <h5>Messages by year:</h5>
201201
"order": [[ 5, "desc" ]]
202202
});
203203
{% endif %}
204+
{% if message_id %}
205+
document.location.hash = '#{{ message_id }}';
206+
{% endif %}
204207
});
205208

206209
function toggle_sidebar(){

0 commit comments

Comments
 (0)