Пример #1
0
    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()
Пример #2
0
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
Пример #3
0
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,
        })
Пример #4
0
    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))
Пример #5
0
    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)
Пример #6
0
    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
Пример #7
0
    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))
Пример #8
0
    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)
        }