def handle(self, *args, **options): translation.activate('ru') subdomains_query = Region.objects.filter(subdomain=True).exclude(static_url=';') if options['subdomain']: subdomain = subdomains_query.get(slug=options['subdomain']).slug elif options['root_domain']: subdomain = None else: subdomains = [None] + list(subdomains_query.values_list('slug', flat=True).order_by('slug')) index = cache.get('sitemap-subdomain-index', 0) if index >= len(subdomains): index = 0 print '%d of %d' % (index + 1, len(subdomains)) subdomain = subdomains[index] index += 1 cache.set('sitemap-subdomain-index', index, None) sitemaps = {'ru': [], 'uk': []} for sitemap_class in sitemap_section_classes: sitemap_obj = sitemap_class(subdomain) section_sitemaps = sitemap_obj.generate() for language, pathes in section_sitemaps.items(): sitemaps[language].extend(pathes) for language, pathes in sitemaps.items(): xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': [default_storage.url(path) for path in pathes]}) subdomain_path = 'sitemaps/%s%s.xml' % (subdomain or 'mesto', {'ru': '', 'uk': '-uk'}[language]) overwrite(subdomain_path, ContentFile(xml)) print 'created', subdomain_path update_index()
def update_index(): subdomain_index_file_re = re.compile(r'^(%s)(-(?P<language>uk))?\.xml$' % '|'.join( Region.objects.filter(subdomain=True).exclude(static_url=';').values_list('slug', flat=True) )) domain_file_re = re.compile(r'^mesto(-(?P<language>uk))?-(%s)(-\d+)?\.xml$' % '|'.join( [sitemap_class.section_name for sitemap_class in sitemap_section_classes] )) sitemaps = {'ru': [], 'uk': []} dirs, files = default_storage.listdir('sitemaps') for file_ in files: path = 'sitemaps/%s' % file_ # сильно устаревший sitemap (бывает при отключении у региона поддомена) if (datetime.datetime.now() - default_storage.get_modified_time(path)).days > 7: default_storage.delete(path) else: subdomain_index_file_match = subdomain_index_file_re.match(file_) if subdomain_index_file_match: language = subdomain_index_file_match.group('language') or 'ru' sitemaps[language].append(path) domain_file_match = domain_file_re.match(file_) if domain_file_match: language = domain_file_match.group('language') or 'ru' sitemaps[language].append(path) for language, pathes in sitemaps.items(): xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': [default_storage.url(path) for path in pathes]}) index_path = 'sitemaps/mesto%s.xml' % {'ru': '', 'uk': '-uk'}[language] overwrite(index_path, ContentFile(xml)) print 'updated', index_path
def rotate_ad_photo(request): if request.method == 'POST': if 'photo_id' in request.POST: photo_id = int(request.POST['photo_id']) photo = Photo.objects.get(id=photo_id, basead__ad__user=request.user) old_path = photo.image.name else: if 'image_name' in request.POST: old_name = request.POST['image_name'] # должно приходить имя файла, а не путь к файлу, иначе - подозрительно if os.path.basename(old_name) == old_name: old_path = u'%s/%s' % (settings.AJAX_UPLOAD_DIR, old_name) else: raise Exception('Suspicious image filename') else: return HttpResponseBadRequest() # новое имя файла (и, следовательно, превью) позволяет обойти проблему с кешированием в CDN new_name = 'u%d_rotated_%s.jpg' % (request.user.id, uuid.uuid4().hex) new_path = u'%s/%s' % (settings.AJAX_UPLOAD_DIR, new_name) old_image = Image.open(default_storage.open(old_path)) rotated_image = old_image.transpose(Image.ROTATE_270) overwrite(new_path, save_to_jpeg_content(rotated_image)) thumbnailer = ajax_upload.UploadThumbnailer( new_path, ajax_upload.AD_THUMBNAILER_PARAMETERS) thumbnailer.create() thumbnail_url = thumbnailer.get_url(None) return JsonResponse({ 'new_name': new_name, 'new_thumbnail_url': thumbnail_url, })
def generate(self): self.start_time = time.time() try: tmpfile = NamedTemporaryFile(delete=False) import csv with open(tmpfile.name, 'wb') as csvfile: csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC) csvwriter.writerow([ 'ID', 'ID2', 'Item title', 'Final URL', 'Image URL', 'Item subtitle', 'Item description', 'Item category', 'Price', 'Sale price', 'Contextual keywords', 'Item address', 'Tracking template', 'Custom parameter' ]) for item in self.iterate_items(): row = [ item.id, '', '%s %s' % (item.addr_street, item.addr_house), item.get_absolute_url(), item.get_first_photo().smart_thumbnail("md"), '', '', item.deal_type, u"%d UAH" % item.price_uah, '', '', item.address, '', '' ] for key, value in enumerate(row): if isinstance(value, basestring): row[key] = unicode(value).encode('utf8') csvwriter.writerow(row) # копируем файл в storage filename = 'export/%s.csv' % self.name overwrite(filename, tmpfile) tmpfile.close() os.unlink(tmpfile.name) info = { 'comment': self.comment, 'properties': len(self.rendered_items), 'link': default_storage.url(filename), 'time': datetime.now(), } export_info = cache.get('export_status', {}) export_info[self.name] = info cache.set('export_status', export_info, 7 * 24 * 3600) except: print '%-15s EXCEPTION' % self.name traceback.print_exc() else: print '%-15s %7.2f sec %7d ads' % (self.name, time.time() - self.start_time, len(self.rendered_items))
def render_to_storage(self, template, context, output): # создаем временный файл и в него рендерим шаблон tmpfile = NamedTemporaryFile(delete=False) # возвращаемый лоадером django_jinja.backend.Template не умеет выполнять поточный рендеринг, # используется его атрибут - низкоуровневый шаблон django_jinja.base.Template(jinja2.Template) backend_template = get_template(template) backend_template.template.stream(context).dump(tmpfile, encoding='utf-8') # копируем файл в storage overwrite(output, tmpfile) tmpfile.close() os.unlink(tmpfile.name) return default_storage.url(output)
def generate(self): sitemaps = {'ru': [], 'uk': []} for chunk_number, chunk_urls in enumerate(self.iterate_urls_by_chunk(), start=1): xml = loader.render_to_string(self.template_name, {'urlset': self.make_urls_dict(chunk_urls)}) path = self.make_path('ru', chunk_number) overwrite(path, ContentFile(xml)) print 'created', path sitemaps['ru'].append(path) # костыль для дублирования sitemaps с укр. адресами if self.translate_to_uk: xml_uk = xml.replace('%s/' % settings.MESTO_PARENT_HOST, '%s/uk/' % settings.MESTO_PARENT_HOST) uk_path = self.make_path('uk', chunk_number) overwrite(uk_path, ContentFile(xml_uk)) print 'created', uk_path sitemaps['uk'].append(uk_path) return sitemaps
def generate(self): self.start_time = time.time() try: template_filename = self.template or ('%s.jinja.xml' % self.name) backend_template = get_template('export/%s' % template_filename) context = { 'feed': self, 'now': datetime.now(), } filename = 'export/%s.xml' % self.name # создаем временный файл и в него рендерим шаблон tmpfile = NamedTemporaryFile(delete=False) # возвращаемый лоадером django_jinja.backend.Template не умеет выполнять поточный рендеринг, # используется его атрибут - низкоуровневый шаблон django_jinja.base.Template(jinja2.Template) backend_template.template.stream(context).dump(tmpfile, encoding='utf-8') # копируем файл в storage overwrite(filename, tmpfile) tmpfile.close() os.unlink(tmpfile.name) info = { 'comment': self.comment, 'properties': len(self.rendered_items), 'link': default_storage.url(filename), 'time': datetime.now(), } export_info = cache.get('export_status', {}) export_info[self.name] = info cache.set('export_status', export_info, 7 * 24 * 3600) except: print '%-15s EXCEPTION' % self.name traceback.print_exc() else: print '%-15s %7.2f sec %7d ads' % (self.name, time.time() - self.start_time, len(self.rendered_items))
def upload_complete(self, request, filename): original_image_path = super(StorageBackend, self).upload_complete(request, filename)['path'] image = Image.open(default_storage.open(original_image_path)) # ранее, "нормализованное" изображение перезаписывалось в первоначальный файл # для формата изображений MPO на Windows в таком случае генерировалось WindowsError: [Error 32] # кроме того, после "нормализации" меняется формат (логично поменять и расширение), # а оригинал пусть хранится на случай отладки normalized_image_path = '%s.normalized.jpg' % original_image_path overwrite(normalized_image_path, save_to_jpeg_content(normalize_image(image))) thumbnailer = UploadThumbnailer(normalized_image_path, self.thumbnailer_parameters) thumbnailer.create() # if you want to "try/except" exceptions, return {"success": None} return { "path": thumbnailer.get_url(None), "fileName": os.path.basename(normalized_image_path) }