|
1
|
|
|
from chat.models import Image |
|
2
|
|
|
from chat.tornado.constants import VarNames |
|
3
|
|
|
from chat.utils import extract_photo, get_max_key |
|
4
|
|
|
|
|
5
|
|
|
|
|
6
|
|
|
def process_images(images, message): |
|
7
|
|
|
if images: |
|
8
|
|
|
if message.symbol: |
|
9
|
|
|
replace_symbols_if_needed(images, message) |
|
10
|
|
|
new_symbol = get_max_key(images) |
|
11
|
|
|
if message.symbol is None or new_symbol > message.symbol: |
|
12
|
|
|
message.symbol = new_symbol |
|
13
|
|
|
db_images = save_images(images, message.id) |
|
14
|
|
|
if message.symbol: # fetch all, including that we just store |
|
15
|
|
|
db_images = Image.objects.filter(message_id=message.id) |
|
16
|
|
|
return prepare_img(db_images, message.id) |
|
17
|
|
|
|
|
18
|
|
|
|
|
19
|
|
|
def save_images(images, message_id): |
|
20
|
|
|
db_images = [] |
|
21
|
|
|
if images: |
|
22
|
|
|
db_images = [Image( |
|
23
|
|
|
message_id=message_id, |
|
24
|
|
|
img=extract_photo( |
|
25
|
|
|
images[k][VarNames.IMG_B64], |
|
26
|
|
|
images[k][VarNames.IMG_FILE_NAME] |
|
27
|
|
|
), |
|
28
|
|
|
symbol=k) for k in images] |
|
29
|
|
|
Image.objects.bulk_create(db_images) |
|
30
|
|
|
return db_images |
|
31
|
|
|
|
|
32
|
|
|
|
|
33
|
|
|
def replace_symbols_if_needed(images, message): |
|
34
|
|
|
# if message was edited user wasn't notified about that and he edits message again |
|
35
|
|
|
# his symbol can go out of sync |
|
36
|
|
|
order = ord(message.symbol) |
|
37
|
|
|
new_dict = [] |
|
38
|
|
|
for img in images: |
|
39
|
|
|
if img <= message.symbol: |
|
40
|
|
|
order += 1 |
|
41
|
|
|
new_symb = chr(order) |
|
42
|
|
|
new_dict.append({ |
|
43
|
|
|
'new': new_symb, |
|
44
|
|
|
'old': img, |
|
45
|
|
|
'value': images[img] |
|
46
|
|
|
}) |
|
47
|
|
|
message.content = message.content.replace(img, new_symb) |
|
48
|
|
|
for d in new_dict: # dictionary changed size during iteration |
|
49
|
|
|
del images[d['old']] |
|
50
|
|
|
images[d['new']] = d['value'] |
|
51
|
|
|
|
|
52
|
|
|
|
|
53
|
|
|
def prepare_img(images, message_id): |
|
54
|
|
|
""" |
|
55
|
|
|
:type message_id: int |
|
56
|
|
|
:type images: list[chat.models.Image] |
|
57
|
|
|
""" |
|
58
|
|
|
if images: |
|
59
|
|
|
return {x.symbol: x.img.url for x in images if x.message_id == message_id} |
|
60
|
|
|
|
|
61
|
|
|
|
|
62
|
|
|
def get_message_images(messages): |
|
63
|
|
|
ids = [message.id for message in messages if message.symbol] |
|
64
|
|
|
if ids: |
|
65
|
|
|
images = Image.objects.filter(message_id__in=ids) |
|
66
|
|
|
else: |
|
67
|
|
|
images = [] |
|
68
|
|
|
return images |
|
69
|
|
|
|
|
70
|
|
|
|
|
71
|
|
|
|