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> |
|
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