##// END OF EJS Templates
Image search in every image view, using context menu
neko259 -
r1812:f2a9c571 default
parent child Browse files
Show More
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -581,3 +581,6 b' msgstr "\xd0\x9c\xd0\xb0\xd0\xba\xd1\x81\xd0\xb8\xd0\xbc\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xbe\xd0\xb5 \xd0\xba\xd0\xbe\xd0\xbb\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe \xd1\x84\xd0\xb0\xd0\xb9\xd0\xbb\xd0\xbe\xd0\xb2 %(max_files)s."'
581 msgid "Moderation"
581 msgid "Moderation"
582 msgstr "Модерация"
582 msgstr "Модерация"
583
583
584 msgid "Duplicates search"
585 msgstr "Поиск дубликатов"
586
@@ -4,8 +4,11 b' from django.contrib.staticfiles import f'
4 from django.contrib.staticfiles.templatetags.staticfiles import static
4 from django.contrib.staticfiles.templatetags.staticfiles import static
5 from django.core.files.images import get_image_dimensions
5 from django.core.files.images import get_image_dimensions
6 from django.template.defaultfilters import filesizeformat
6 from django.template.defaultfilters import filesizeformat
7 from django.core.urlresolvers import reverse
8 from django.utils.translation import ugettext_lazy as _, ungettext_lazy
7
9
8 from boards.utils import get_domain, cached_result
10 from boards.utils import get_domain, cached_result
11 from boards import settings
9
12
10
13
11 FILE_STUB_IMAGE = 'images/file.png'
14 FILE_STUB_IMAGE = 'images/file.png'
@@ -74,11 +77,13 b' class AbstractViewer:'
74 return True
77 return True
75
78
76 def get_view(self):
79 def get_view(self):
77 return '<div class="image">'\
80 return '<div class="image" id="file{}">'\
78 '{}'\
81 '{}'\
79 '<div class="image-metadata"><a href="{}" download >{}, {}</a></div>'\
82 '<div class="image-metadata"><a href="{}" download >{}, {}</a>'\
80 '</div>'.format(self.get_format_view(), self.file.url,
83 ' <a class="file-menu" href="#">🔍 </a></div>'\
81 self.file_type, filesizeformat(self.file.size))
84 '</div>'.format(self.hash, self.get_format_view(), self.file.url,
85 self.file_type, filesizeformat(self.file.size))\
86 + self._build_context_menu(self.get_context_menu())
82
87
83 def get_format_view(self):
88 def get_format_view(self):
84 image_name = PLAIN_FILE_FORMATS.get(self.file_type, self.file_type)
89 image_name = PLAIN_FILE_FORMATS.get(self.file_type, self.file_type)
@@ -95,6 +100,26 b' class AbstractViewer:'
95 '<img class="url-image" src="{}" width="{}" height="{}"/>'\
100 '<img class="url-image" src="{}" width="{}" height="{}"/>'\
96 '</a>'.format(self.file.url, static(image), w, h)
101 '</a>'.format(self.file.url, static(image), w, h)
97
102
103 def get_context_menu(self):
104 items = []
105 items.append({
106 'name': 'duplicates',
107 'label': _('Duplicates search'),
108 'url': reverse('feed') + '?image_hash=' + self.hash,
109 })
110
111 return items
112
113 def _build_context_menu(self, items):
114 if not items:
115 return ''
116
117 cm_items = []
118 for item in items:
119 cm_items.append(('{}: {{name: "{}", callback: function(key, opt) {{window.location="{}";}}}}')\
120 .format(item['name'], item['label'], item['url']))
121 return '<script>$.contextMenu({{trigger: "left", selector: "#file{} .file-menu", items: {{ {} }} }});</script>'.format(self.hash, ', '.join(cm_items))
122
98
123
99 class VideoViewer(AbstractViewer):
124 class VideoViewer(AbstractViewer):
100 @staticmethod
125 @staticmethod
@@ -158,6 +183,24 b' class ImageViewer(AbstractViewer):'
158 str(pre_height), str(width), str(height),
183 str(pre_height), str(width), str(height),
159 full=self.file.url, image_meta=metadata)
184 full=self.file.url, image_meta=metadata)
160
185
186 def get_context_menu(self):
187 items = super().get_context_menu()
188
189 image_url = settings.get('External', 'ImageSearchHost') + self.file.url
190
191 items.append({
192 'name': 'google',
193 'label': 'Google',
194 'url': 'https://www.google.com/searchbyimage?image_url={}'.format(image_url),
195 })
196 items.append({
197 'name': 'iqdb',
198 'label': 'iqdb',
199 'url': 'http://iqdb.org/?url={}'.format(image_url)
200 })
201
202 return items
203
161
204
162 class UrlViewer(AbstractViewer):
205 class UrlViewer(AbstractViewer):
163 @staticmethod
206 @staticmethod
@@ -190,6 +233,9 b' class UrlViewer(AbstractViewer):'
190 '<img class="url-image" src="{}" width="{}" height="{}"/>' \
233 '<img class="url-image" src="{}" width="{}" height="{}"/>' \
191 '</a>'.format(self.url, image, w, h)
234 '</a>'.format(self.url, image, w, h)
192
235
236 def get_context_menu(self):
237 return []
238
193 @cached_result()
239 @cached_result()
194 def _find_image_for_domains(self, domain):
240 def _find_image_for_domains(self, domain):
195 """
241 """
@@ -24,8 +24,6 b''
24 {{ image.get_view }}
24 {{ image.get_view }}
25 <div class="gallery_image_metadata">
25 <div class="gallery_image_metadata">
26 {{ image.get_size.0 }}x{{ image.get_size.1 }}
26 {{ image.get_size.0 }}x{{ image.get_size.1 }}
27 {% image_actions image.file.url %},
28 [<a href="{% url 'feed' %}?image_hash={{ image.hash }}">{{ site_name }}</a>]
29 <br />
27 <br />
30 <a href="{{ post.get_absolute_url }}">>>{{ post.id }}</a>
28 <a href="{{ post.get_absolute_url }}">>>{{ post.id }}</a>
31 </div>
29 </div>
@@ -19,17 +19,6 b' HTML4_SINGLETS =('
19
19
20 register = template.Library()
20 register = template.Library()
21
21
22 actions = [
23 {
24 'name': 'google',
25 'link': 'https://www.google.com/searchbyimage?image_url={}',
26 },
27 {
28 'name': 'iqdb',
29 'link': 'http://iqdb.org/?url={}',
30 },
31 ]
32
33
22
34 @register.simple_tag(name='post_url')
23 @register.simple_tag(name='post_url')
35 def post_url(*args, **kwargs):
24 def post_url(*args, **kwargs):
@@ -40,18 +29,6 b' def post_url(*args, **kwargs):'
40 return post.get_absolute_url()
29 return post.get_absolute_url()
41
30
42
31
43 @register.simple_tag(name='image_actions')
44 def image_actions(*args, **kwargs):
45 image_link = args[0]
46 host = settings.get('External', 'ImageSearchHost')
47 if host.endswith('/'):
48 host = host[:-1]
49 image_link = settings.get('External', 'ImageSearchHost') + image_link
50
51 return ', '.join([IMG_ACTION_URL.format(
52 action['link'].format(image_link), action['name']) for action in actions])
53
54
55 @register.inclusion_tag('boards/post.html', name='post_view', takes_context=True)
32 @register.inclusion_tag('boards/post.html', name='post_view', takes_context=True)
56 def post_view(context, post, *args, **kwargs):
33 def post_view(context, post, *args, **kwargs):
57 kwargs['perms'] = context['perms']
34 kwargs['perms'] = context['perms']
General Comments 0
You need to be logged in to leave comments. Login now