Tag: Development

Наркомансое группирование по годам — Django

Вот нудно мне сгруппировать новости по году, поле храниться как datetime.date.today. Почему то захотелось по наркоманить и пойти не стандартным способом=) В общем получился python код =)

Запихал все в шаблонный тег, ну и вот, что получилось:

@register.simple_tag
def list_year():
    import itertools
    news = News.objects.filter(status=1)
    years = [str(item.creation_date.year) for item in news]
    dates = list(enumerate(years, start=1))
    result = [key for key,group in itertools.groupby(dates, key=lambda x: x[1][:11])]
    result_html = ''
    for item in result:
        result_html += 'За <a href="?year=%s">%s</a> год<br />' % (item, item)
    result_html += '<br />'
    return result_html

Ошибки и заблуждения заказчиков при разработке корпоративного сайта

Ошибки и заблуждения заказчиков при разработке корпоративного сайта

Сайт — это отличный инструмент для решения задач, связанных с узнаваемостью бренда и повышением продаж. Казалось бы — закажи сайт, и проблема решена: потенциальные клиенты находят сайт компании через поисковую систему, знакомятся с услугами и товарами и покупают их.

Но зачастую всё бывает иначе. Сайт запущен, а клиентов не прибавляется. В то же время у конкурентов дела идут как нельзя лучше. Заказчик обвиняет во всем разработчиков сайта, обращается к новым разработчикам, сайт переделывается, но история повторяется. В чем же ошибка? Давайте разберемся.

Ошибки и заблуждения заказчиков при разработке корпоративного сайта

Ошибки на этапе проектирования сайта

1. Разработку сайта можно поручить своему системному администратору.
Каким бы не был ваш системный администратор способным кадром, как правило, результат из этой затеи получается плачевным. Профессиональный сайт сделать под силу лишь команде, состоящей из специалистов разных предметных областей — маркетолога, аналитика, проектировщика, дизайнера, верстальщика, программиста, копирайтера, специалиста по продвижению. Сможет ли ваш системный администратор заменить этих специалистов?

2. Я не хочу заполнять ваши многостраничные опросники и анкеты! Я могу сообщить вам название своей фирмы, ее вид деятельности, дать визитку с логотипом. Мне нужен «просто красивый сайт», что тут непонятного?
К сожалению, визитки, или даже корпоративного буклета недостаточно для разработки профессионального сайта. Разработка сайта подразумевает не только графическое оформление, но и проектирование структуры разделов, навигации, представление ваших товаров и услуг в наиболее понятном и привлекательном виде. Поэтому для всех будет лучше, если вы ответите на все вопросы студии, изложенные в опроснике, причем подойдете к этим ответам осознанно. Иначе у студии не будет исходного материала для того, чтобы создать сайт, который будет полезен вам и вашим клиентам.

3. Можно создать качественный сайт в короткие сроки и почти бесплатно — в сети много таких предложений!
Действительно, ваш сайт может появиться быстро и за небольшие деньги, но скорее всего он будет низкого качества. Разработка сайта — это работа нескольких специалистов, у которых за плечами не один год опыта и огромный багаж знаний всех тонкостей этой весьма специфичной работы. Оценивать работу каждого из них в пару тысяч рублей абсурдно. Задумайтесь, кто эти люди, которые Вам предложили создать сайт за такую сумму. Помните, скупой платит дважды!

4. Затраты на поддержку сайта несоизмеримо меньше, чем на его создание.
Если под поддержкой сайта понимать стабильное периодическое наполнение сайта, в том числе и поиск, подготовку новой информации, проведение кампаний по продвижению сайта, то затраты на поддержку могут быть значительно выше, чем на разработку. Заранее поинтересуйтесь, во сколько вам обойдется поддержка сайта.

Ошибки при разработке дизайна сайта
5. Самое главное на сайте — это отличный дизайн!
На самом деле дизайн сайта важен только его владельцу, посетителям же намного важнее быстро найти нужный товар или услугу и контакты вашего офиса. Качественный дизайн необходим лишь на промо-сайтах, где ставка делается на презентативность и «вау-эффект».
Поставьте себя на место клиента, будете ли вы обращать внимание на дизайн сайта, если вам нужно быстро найти компанию-подрядчика среди десятка предложений? Клиент скорее всего выберет ту компанию, чей сайт откроется в считанные секунды и с первого взгляда будет понятно, какие товары и услуги предлагает компания.

6. Нарисуйте мне 3 варианта дизайна, а я выберу один!
Чтобы нарисовать дизайн, требуется немалое время дизайнеров, которое должно быть оплачено. Бесплатно рисовать несколько вариантов как правило согласны только непрофессионалы. Но это не означает, что они выполнят свою работу плохо. Любая веб-студия имеет портфолио, по которому вы можете сразу оценить ее уровень и принять решение, работать с этой студией или нет. Профессионалы своего дела обычно создают один вариант дизайна, чему предшествует разработка и утверждение дизайн-концепции будущего сайта. При таком подходе исключается необходимость выполнять несколько вариантов дизайна

7. Я посижу вместе с вашим дизайнером и мы вместе сделаем то, что я хочу.
Заблуждение состоит в том, что заказчик всегда уверен, что он самый лучший дизайнер. Заказчик способен изменить первоначальный дизайн до неузнаваемости, превратив главную страницу сайта в мигающую новогоднюю ёлку. Поэтому, чтобы сайт не стал заложником фантазий заказчика и решал поставленные перед ним бизнес-задачи, перед отрисовкой дизайна нужно сначала разработать и утвердить дизайн-концепцию и прототипы основных страниц. В этом случае сидеть заказчику вместе с дизайнером не придется.

8. Возьмите за основу наш логотип на нашей визитке (бланке, листовке и т.д.) и сделайте дизайн сайта.
Для создания любого графического макета необходимы изображения в электронном виде высокого качества, либо в векторном формате. Если таковых нет, не удивляйтесь, если вас попросят доплатить за оцифровку исходных материалов.

Ошибки на этапе передачи контента

9. У нас нет контента для сайта. Придумайте тексты сами, а мы, если что подкорректируем.
Для того чтобы создать качественный контент для вашего сайта, нужно иметь четкое представление о вашей деятельности. Как правило, эту часть работы заказчик не хочет выполнять, либо у него нет времени. Поверьте, если вы четко не скажете «мы занимаемся тем-то и тем-то», то этого за вас не сделает никто.

10. Возьмите контент с такого-то сайта.
Многие заказчики считают, что можно скопировать информацию с сайтов конкурентов и разместить ее слово в слово у себя на сайте. Раз товары и услуги одни и те же, зачем же изобретать велосипед? Потенциальному клиенту действительно будет безразлично происхождение контента, а вот поисковому серверу будет понятно, что содержание краденное, и ничего хорошего это сайту не принесет. При таком подходе сложно попасть на первые страницы выдачи поисковых систем, а значит, вы будете теряеть значительную часть потенциальных клиентов.

11. Разработчики сайта обязаны знать, чем занимается компания заказчика и легко должны отличить фото нашей последней модели станка СДВ-12 от уже устаревшего СДВ-11А.
К сожалению это не так, для того, чтобы не допустить курьезных ситуаций, заказчику необходимо потратить время на сортировку и обработку информации.

12. Свой будущий сайт мы легко наполним сами!
Если речь идет о крупном корпоративном сайте, то подсчитайте, сколько может уйти времени на сбор информации, обработку изображений и их размещение. Сможете ли вы выделить сотрудника на столь продолжительное время?

Заблуждения относительно поискового продвижения сайта

13. После запуска сайта он сразу будет посещаем и приносить доход.
Это не всегда так. Для привлечения людей на сайт необходимо постоянно следить за актуальностью информации на сайте, проводить мероприятия по привлечению людей на сайт, а это требует немалых усилий и времени.

14. Сайт достаточно один раз наполнить контентом.
Поисковые системы устроены так, что сайтам с часто обновляемой информацией отдается большее предпочтение. Информация имеет тенденцию терять свою актуальность. Не стоит удивляться, если позиции сайта в поисковых системах будут снижаться. Делайте сайт интересным, периодически обновляйте контент, и новые посетители не заставят себя ждать.

15. Сайт можно продвинуть на первую страницу поисковика за месяц.
Это заблуждение возникло из-за пестрых рекламных объявлений, которые предлагают вывести сайт в десятку за короткий срок. Как правило, быстрый взлет опасен полным удалением сайта из поисковой системы. Не покупайтесь на рекламу!

16. Мой сайт на первом месте в поисковике. Можно разрывать контракт на продвижение сайта.
Сайт не может бесконечно долго занимать лидирующие позиции в выдаче поисковиков. Конкуренты не дремлют. Нужно постоянно проводить комплекс работ по мониторингу сайтов конкурентов, поддерживать свой сайт на лидирующих позициях.

А теперь подытожим
При грамотном подходе можно создать качественный сайт с оптимальным соотношением составляющих цена, качество, время.

  • Проанализируйте сложившуюся ситуацию на рынке, подумайте о перспективах развития компании на ближайшие годы. Задумайтесь, какие задачи должен решать ваш будущий сайт
  • Запомните — корпоративный сайт делается для ваших клиентов, а не для вас самих, ваших коллег и друзей. Вы должны сформировать четкое представление о том, кто ваши клиенты и чего они хотят.
  • С первого взгляда на сайт должно быть понятно, какие товары и услуги предлагает ваша компания. Поверьте, в век, когда людям дорога каждая секунда, мало кто будет читать длинный текст о компании, всматриваться в фото директора и читать его приветственную речь на главной странице сайта.
  • При подготовке информации для сайта учтите, что копирование материалов с других сайтов может негативно повлиять на дальнейшее продвижение сайта в поисковиках. Пишите уникальные тексты!
  • После запуска сайта не пытайтесь раскрашивать заголовки и текст во все цвета радуги, делать текст мигающим и прочие глупости — это всё признаки дилетантства и снижает уровень доверия к вашему сайту.
  • При продвижении сайта учтите, что оно должно быть плавным и постепенным. Не пользуйтесь услугами горе-продвиженцев, которые обещают продвинуть сайт в считанные дни на первые позиции, иначе это может обернуться полным крахом вашего сайта.
Я надеюсь, что мои советы помогут Вам правильно спланировать свой будущий сайт и сделать правильный выбор подрядчика для разработки сайта.

Оформление шаблонного тега

Многие боятся лесть в дебри шаблонов и фильтров в  Django. А они же так просто создаются. Вот пример примитивного тега с получением в теге request объекта:

@register.inclusion_tag('new/userinfo.html', takes_context = True)
def address(context):
    request = context['request']
    address = request.session['address']
    return {'address':address}

Format DateTime in Django Admin

If you are trying to format a DateTimeField() field in the Django admin you may find it harder than you think. You would think that the DATE_FORMAT and DATETIME_FORMAT in settings.py would apply to the admin BUT it only applies to date formatting in the template.

At present there is no easy way to format the date but the following example of one method of how to do it:

class News(models.Model):
    headline = models.CharField(max_length=100)
    date = models.DateTimeField()
    article = models.TextField()
    published = models.BooleanField()

class NewsAdmin(admin.ModelAdmin):
    list_display = ('headline', 'format_date', 'published')

    def format_date(self, obj):
        return obj.date.strftime('%d %b %Y %H:%M')
    format_date.short_description = 'Date'

Шаблонные теги и фильты django

Приведу небольшой список шаблонных тегов и фильтров django которые я использую чаще всего в разрабатываемых мной проектых.

Шаблонные теги Django

{% firstof %}

{% firstof var1 var2 var3 %}
Эквивалентен
{% if var1 %}
{{ var1 }}
{% else %}{% if var2 %}
{{ var2 }}
{% else %}{% if var3 %}
{{ var3 }}
{% ensif %}
Если все значение False можно указать строковый литерал по умолчанию {% firstof var1 var2 var3 «not var» %}

{% for %}

forloop.counter — Текущая итерация с 1
forloop.counter0 — Текущая итерация с 0
forloop.revcounter — Количество оставшихся интераций до конца цикла с 1
forloop.revcounter0 — Количество оставшихся интераций до конца цикла с 0
forloop.first — True, если это первая итерация
forloop.last — True, если это последняя итерация

{% empty %} — отображаеться если массив пуст или не найтен в контексте

{% ifchanged %}

Проверяет изменилось ли значение по сравнению с предыдущей интерацией. Используется внутри цикла.

{% ifequal %}

Выводит содержимое блока если оба аргумента равны

{% ifnotequal %}

Аналогичен {% ifequal %}, но проверяет различие аргументов

Шаблонные фильтры


{% now %}

Выводит текущую дату

{% spaceless %}

Удаляет пробельные символы между html тегами (пробелы, табуляция, новая строка)

add

прибавляет агрумент к значению

{{ value|add:»2″ }}

addslashes

Вставляет символы слеша перед ковыяками

capfirst

Переводит первый символ в верхний регистр

center

Центрирует значение в поле заданной ширины

cut

Удаляет все значения из заданной строки

date

Формирует дату согласно заданной строке формата

default

Если поданное на вход фильтра значение равно False, взять значение аргумента

{{ value|default:»papapa» }}

default_if_none

если (и только если) значение равно None, взять значение аргумента

dictsort

принимает список словарей и возвращает его отсорированным по заданному в аргументе ключу

dictsortreversed

принимает список словарей и возвращает его отсорированным в обратном порядке по заданному в аргументе ключу

escape

экранирует html разметку

escapejs

Экранирует символыв строках, предназначенные в строках javascript

filesizeformat

предоставляет величину размера файла в привычном формате

first

возвращает первый элемент списка

fix_ampersands

заменяет символ эмперсанд компонентами &

floatformat

без аргумента округляет значение с плавующей точкой до одного знака с аргументом на количество знаков указанных в арзументе

get_digit

Возвращает запрошенную цифру из заданного целого числа

join

Объединяет значения из заданного списка, разделяя их указанной строкой

last

Возвращает последний элемент списка

length

Возвращает длину значения

length_is

Возвращает ТРУ если длина значения совпадает с аргументом

linebreaks

Заменяет символы перевода строки в обычном тексте подходяцими html тегами. Одиночным символ перевода строки BR А символ перевода строки за которой идет пустая строка заменяет тегом P

linebreaksbr

Заменят еревод строк тегом BR

linenumbers

Выводит текст с порядковыми номерами строк

ljust

выравнивает значение по левому в поле заданно ширины

в аргументе указываеться ширина

lower

Привести в нижний регистр

make_list

Возвращает значение, преобразованное в значение

pprint

применяеться для отладки

random

Возвращает случано выбранный элемент списка

removetags

Удаляет перечисленный через запятую html — теги

rjust

Выравнивает значени по правому краю в поле заданной ширины
Аргумент — ширина поля

slice

Возвращает фрагмент списка (Синтакси Python) {{ value|slice:»:2″ }}

slugify

Преобразует значение в нижний регистр, удаояет все символы, кроме букв цифр и символов подчеркивания и преобразует пробелы в дефисы. Кроме того удаляет пробельные символы в начале и конце.

striptags

Удаляет все html теги

time

Формирует время согласно заданной строке формата

title

Возвращает строку где кажное сово начинается с заглавной буквы

truncatewords

Обрезает строку после заданного числа слов

truncatewords_html

аналогичен truncatewords но учитывает html теги

unordered_list

Принимает вложенный список и возвращает маркированный html список

upper

Преобразует строку в верхний регистр

urlencode

Экранирует значение для вставки в URL

urlize

Преобразует адреса URL из простого текста в гиперсылки

urlizetrunc

Преобразует адреса URL из простого текста в гиперсылки, обрезая длинные

wordcount

Возвращает количество слов

wordwrap

Разбивает строку по границам слов на количество (указанному в аргументе) слов в строке.

Installing gettext on Snow Leopard

По одному из проектов понадобилась локализация проекта на языки. При формировании файла локализации django-admin makemessages -l ru меня посетила ошибка

Error: errors happened while running xgettext on __init__.py
/bin/sh: xgettext: command not found

Напомню, что операционка у меня Mac OS Snow Leopard. И я вообщем то не расстроился =) ведь  gettext довольно таки популярен, меня удивило то, что у меня стоит Xcode, а в нем есть данных зверек. Но опомнившись, что мак и есть юникс я тупо зашел на офф сайт и скачал дистрибутив gettext-0.18.1.1, а дальше уже тупо шаманим в консоли:

[akropotov@macbook ~]$ tar xzvf gettext-0.18.1.1.tar.gz
[akropotov@macbook ~]$ cd gettext-0.18.1.1
[akropotov@macbook ~]$ ./configure
[akropotov@macbook ~]$ make
[akropotov@macbook ~]$ sudo make install

Да и еще немного прокосячился я в том деле в начале=) но это уже просто писал в по пыхах. При локазизации создавайте каталог locale, а не пакет locale тоесть без файла инициализации __init__.py.

Удачного кодинга.

Ресайз изображений Bitrix

Ресайз изображений Bitrix

Встала задача делать миниатурки из изображений загруженных в анонсе и изображений загруженных в дополнительное свойство PHOTO.
В этом нам поможет CFile::ResizeImageGet. Синтаксис у него таков

array CFile::ResizeImageGet(
    mixed file,
    array arSize,
    const resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
    bool bInitSizes = false
);

file — сомо изображение
arSize — массив с размерами для изображения
resizeType — тип масштабирования:
—— BX_RESIZE_IMAGE_EXACT — масштабирует в прямоугольник $arSize без сохранения пропорций
—— BX_RESIZE_IMAGE_PROPORTIONAL — масштабирует с сохранением пропорций, размер ограничивается $arSize
—— BX_RESIZE_IMAGE_PROPORTIONAL_ALT — масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшенна обработка вертикальных картинок.

Пример работы на свойстве PHOTO

$e=CIBlockElement::GetProperty($arResult["IBLOCK_ID"],$arResult['ID'],array(),array("CODE"=>"PHOTO"));
while($xx=$e->Fetch())
{	if($x=CFile::GetFileArray($xx['VALUE']))
	{	$y=CFile::ResizeImageGet(
			$xx['VALUE'],
			array("width" => 150, "height" => 150),
			BX_RESIZE_IMAGE_EXACT,
			false
		);
		$k=$xx["DESCRIPTION"];
		echo'<a href="'.$x['SRC'].'"><img src="'.$y["src"].'" alt="'.$k.'" title="'.$k.'"/></a>';
	}
}

Привер на превьюшке из анонса

$renderImage = CFile::ResizeImageGet($arElement["PREVIEW_PICTURE"], Array("width" => 114, "height" => 114), BX_RESIZE_IMAGE_EXACT, false);
echo '<img title="'.$arElement["NAME"].'" alt="'.$arElement["NAME"].'" src="'.$renderImage["src"].'" />';

Грамотный бизнес [Точка зрения]

Я завожу небольшую рубрику под названием [Точка зрения]. В ней я буду описывать мои точки зрения (взгяды) на разные вещи.

Первый мой взгяд падает на бизнес в моей сфере, а точнее web разработка.
Что нужно для грамотного построения работы для получения взаимной выгоды для всех кто в этом участвует. Оказывается все просто=) Просто найти сотрудников которые хотят работать и зарабатывать, а с другой стороны это опять таки и является проблемой. А разве трудно???? Нужен менеджер, который будет продавать и получать за это деньги, аналогично с программистом и дизайнеров. Ну и конечно же они должны знать что не поработав не покушаешь. В итоге можно самому работать=) Надо просто делать небольшую накруточку в карман.
По мне этого достаточно, чтобы бизнес в web сфере шел.

Динамический фильтр по свойству bitrix

Имеем информационный блог в котором определёно свойство-список «Производитель» со списком всех производителей продукций публикуемой в каталоге. На сайт подключаем компонент каталог и к нему прикрепляем наш информационный блок. В настройках выставляем в блоке «Настройки фильтра» в графе «Свойства:» пункт «Производитель». После сохранения у нас должна появиться страница с выводом каталога. При переходе в какую либо категории каталога появляется фильтр со списком наших производителей. Как известно в списке фильтрации будут присутствовать все производители которые есть в свойстве информационного блока, но зачем мне весь список производителей если на странице три продукта двух производителей. Ну конечно же незачем.

Задача:
доработайте окно выбора производителя, чтобы в выпадающем списке выводились только те производители, продукция которых присутствует на данной странице, с данными условиями поиска.

Решение:
В комплексном компоненте в инклуде компонента фильтра добавляем еще один элемент в котором будет храниться идентификатор раздела в котором находиться данный пользователь. В моем случае он называется «CN». Далее открываем на редактирование шаблон фильтрации предварительно скопировав его себе в шаблон или удобное Вам место. В нем я заменил содержимое элемента таблицы


#PHP CODE#
$rsItems = CIBlockElement::GetList(
	false,
	array(
		"IBLOCK_TYPE"=>$arParams["IBLOCK_TYPE"],
		"IBLOCK_ID"=>$arParams["IBLOCK_ID"],
		"IBLOCK_LID"=>SITE_ID,
		"ACTIVE"=>"Y",
		"SECTION_ID"=>$arParams["CN"],
	),
	array("PROPERTY_COMPANY"),
	false,
	array(
		"ID",
		"NAME",
		"PROPERTY_COMPANY",
	)
);
echo '<select name="arrFilter_pf[COMPANY]"><option value="">(все)</option>';
while($arItem = $rsItems->GetNext()){
	echo '<option value="'.$arItem['PROPERTY_COMPANY_ENUM_ID'].'">'.$arItem['PROPERTY_COMPANY_VALUE'].'</option>';
}
echo '</select>';

Вот так вот у меня теперь на страницы категории выводиться в список только те производители чей товар присутствует на странице.