Как стать автором
Поиск
Написать публикацию
Обновить

Первое знакомство с satchmo

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

Первым выбор пал на opencart, потому что я уже имел с ним дело и скажу честно дело мне это не понравилось. Нет, продукт сам по себе вроде бы неплох, но напрочь убило отсутствие orm. Не люблю я писать sql запросы. 21 век как никак. Дело я имел с ним году в 2011 поэтому полез на официальный сайт, почитал. Ничего не изменилось. Закрыл.

Посмотрел краем глаза битрикс. Можно было бы взять. Но там платные лицензии. Тоже закрыл.

Посмотрел джумлу. Не помню почему. Просто закрыл. Не мое.

Т.к. я являюсь большим поклонником python, но без опыта разработки на нем, зато с большим желанием углубиться в него, начал смотреть в его сторону.

Посмотрел список в этом посте

Выбирал как блондинка ноутбук. «По цвету».
Посмотрел демки, где есть. В общем выбрал satchmo.

Начал копать в его сторону. Для начала взял себе vps под centos 6.4. Я поклонник rpm дистрибутивов. Дело привычки.

Паралельно со мной мой товарищ lightsgoout пытал джанго хостинг поэтому реализацию настроек можно посмотреть в его статье.

После настройки сервера настала пора установки satchmo.

Поставил как было написано на сайте.
pip install -r http://bitbucket.org/chris1610/satchmo/raw/tip/scripts/requirements.txt
pip install -e hg+http://bitbucket.org/chris1610/satchmo/#egg=satchmo
cd /path/to/new/store
python clonesatchmo.py
sudo touch /etc/uwsgi/vassals/my_store.ini

При заходе на страницу сайта выпадала ошибка отсутствия тега {% endthumbnail %} где-то в шаблонах. Сайт не работал.
Выяснил что в requirements.txt в пакете sorl-thumbnail не стоит версия, а по умоланию ставится последний пакет. На момент релиза satchmo 0.9.2 последней версия thumbnail не требовала закрытия тега в шаблоне {% endthumbnail %}. На момент моих телодвижейний уже вышла новая версия пакета, требующего закрытие тега. Хотел сам изменить все шаблоны и сделать пулл реквест, но бог помиловал. Я полез на багтрекет и нашел там уже исправленный этот баг.
Из багтрекера узнал номер камита с исправлением. Pulled in with 2448. Добавил в свой requirements.txt строку

-e hg+http://bitbucket.org/chris1610/satchmo/@639ba035cc021f6b41d62c3853ae7f54565b7034#egg=Satchmo

Удалил satchmo и заново установил через requirements.txt
pip uninstall satchmo
pip install -r requirements.txt
.
Не забываем релоад
sudo touch /etc/uwsgi/vassals/my_store.ini

И как ни странно сайт заработал.
Сайт имеет ноль дизайна, что скорее правильно чем неправильно, к примеру все выше описанные решения на php идут с каким-то оформлением и возможностью его быстрой смены. Вернемся к этому позже.
Скрин первого запуска


И тут возникла первая проблема. Не отображается ни одна картинка на сайте.
Как я выше уже сказал, я поклонник python, но опыта написания на нем не очень много. Полез ковыряться. Лог веб сервера писал только что No such file or directory на любую картинку.Скажу честно времени потратил много. Научился пользоваться дебагером в Pycharm. Нашел ошибку (текст уже не помню, а лог не сохранился, да, и оказывается я не обратил внимание что все ошибки satchmo пишет в sathcmo.log в корне проекта), но суть в была в том что PIL не могу обработать изображения .jpg, нужны кодеки(или как это называется). Поставил.
sudo yum install -y libjpeg-devel

Ура. Картинки появились.

Пошел дальше. Из админки добавление продукта происходит парой кликов мыши.
Было несколько проблем с локализацией. Точнее кривой перевод. Исправил. Пулл реквест сразу приняли(еще бы. всего 2 буквы поправил в камите :).

Настало дело урашать сайт. С эстетикой у меня очень туго. Я могу критиковать. Сказать сдесь плохо, а сдесь хорошо. Но сделать Красиво сам не могу. Ну нет фантазии.
В гугле ничего по теме шаблоны для satchmo не нашел.
Решил уже купить что-нибудь. Через гугл же вышел на сайт http://3wshop.ru. Шаблонов много, так же есть возможность заказать адаптацию верстки под нужную cms. Но есть большое НО! Цена! 140$ за шаблон я не готов отдать. Видел сайты где есть шаблоны и по 7$ но там выбор не большой. Поэтому пришлось пойти на преступление. Сайт предоставляет демо варианты шаблонов для просмотра. Открыв понравившийся шаблон в демо режиме, я скопировал css, js, и основу разбивки страниц.

При прикручивании этого добра на satchmo возникли некоторые проблемы. Некоторые элементы, как например левое меню категорий, формируются непосредственно в коде python и выводятся одной переменной.
Например метод отображения всех категорий
def recurse_for_children(current_node, parent_node, active_cat, show_empty=True):
    child_count = current_node.child.active().count()

    if show_empty or child_count > 0 or current_node.product_set.count() > 0:
        li_id = 'category-%s' % current_node.id
        li_attrs = {'id': li_id }
        temp_parent = SubElement(parent_node, 'li', li_attrs)
        attrs = {'href': current_node.get_absolute_url()}
        link = SubElement(temp_parent, 'a', attrs)
        link.text = current_node.translated_name()

        if child_count > 0:
            new_parent = SubElement(temp_parent, 'ul')
            children = current_node.child.active()
            for child in children:
                recurse_for_children(child, new_parent, active_cat)

def category_tree(id=None):
    """
    Creates an unnumbered list of the categories.

    Example::

        <ul>
            <li>Books
                <ul>
                <li>Science Fiction
                    <ul>
                    <li>Space stories</li>
                    <li>Robot stories</li>
                    </ul>
                </li>
                <li>Non-fiction</li>
                </ul>
        </ul>
    """
    active_cat = None
    if id:
        try:
            active_cat = Category.objects.active().get(id=id)
        except Category.DoesNotExist:
            active_cat = None
    # We call the category on every page so we will cache
    # The actual structure to save db hits
    lang = get_language()
    current_site = Site.objects.get_current()
    cache_key = "cat-%s-%s" % (current_site.id, lang)
    existing_tree = cache.get(cache_key, None)
    if existing_tree is None:
        root = Element("ul")
        for cats in Category.objects.root_categories():
            recurse_for_children(cats, root, active_cat)
        existing_tree = root
        cache.set(cache_key, existing_tree)
    # If we have an active cat, search through and identify it
    # This search is less expensive than the multiple db calls
    if active_cat:
        active_cat_id = "category-%s" % active_cat.id
        for li in existing_tree.getiterator("li"):
            if li.attrib["id"] == active_cat_id:
                link = li.find("a")
                link.attrib["class"] = "current"
                break
    return tostring(existing_tree, 'utf-8')


или
Получение свойств продукта
def get_configurable_product_options(request, id):
    """Used by admin views"""
    cp = get_object_or_404(ConfigurableProduct, product__id=id)
    options = ''
    for og in cp.option_group.all():
        for opt in og.option_set.all():
            options += '<option value="%s">%s</option>' % (opt.id, str(opt))
    if not options:
        return '<option>No valid options found in "%s"</option>' % cp.product.slug
    return http.HttpResponse(options, mimetype="text/html")



В код cms лезть я не хотел поэтому исправлял все с помощью css.

На некоторых страницах надо было подключить некоторый функционал(например на некоторых страницах нет по умолчанию пагинации). Для этого необходимо переопределить метод обработки определенного урла.

Нужно использовать satchmo_utils.urlhelper.replace_urlpattern
Например я добавлял пагинацию на страницу с товарами любой категории.
Сначала создал метод category_view во view localsite
def category_view(request, slug, parent_slugs='', template='product/category.html'):
    """Display the category, its child categories, and its products.

    Parameters:
     - slug: slug of category
     - parent_slugs: ignored
    """

    if request.method == "GET":
        currpage = request.GET.get('page', 1)
    else:
        currpage = 1

    try:
        category = Category.objects.get_by_site(slug=slug)
        products = list(category.active_products())
        sale = find_best_auto_discount(products)

    except Category.DoesNotExist:
        return bad_or_missing(request, _('The category you have requested does not exist.'))

    child_categories = category.get_all_children()

    count = config_value('PRODUCT','NUM_PAGINATED')

    paginator = Paginator(products, count)

    try:
        paginator.validate_number(currpage)
    except InvalidPage:
        return bad_or_missing(request, _("Invalid page number"))

    page = paginator.page(currpage)
    min_in_page = (count * (page.number - 1) + 1)
    max_in_page = min_in_page + (len(page.object_list) - 1)

    ctx = {
        'category': category,
        'child_categories': child_categories,
        'sale': sale,
        'products': page.object_list,
        'page_obj': page,
        'paginator': paginator,
        'min_in_page': min_in_page,
        'max_in_page': max_in_page
    }

    index_prerender.send(Product, request=request, context=ctx, category=category, object_list=products)
    return render_to_response(template, context_instance=RequestContext(request, ctx))

Далее переопредел стандартный метод на url категории на свой таким способом в своем локальном urls.py
from satchmo_store.urls import urlpatterns
from satchmo_utils.urlhelper import replace_urlpattern

replacement = url(
    r'^(?P<parent_slugs>([-\w]+/)*)?(?P<slug>[-\w]+)/$',
    'localsite.views.category_view',
    {},
    'satchmo_category')

replace_urlpattern(urlpatterns, replacement)


ps.
В целом cms satchmo очень порадовала. Из коробки можно получить достаточно большой функционал, все более или менее настраиваемо, ну а что нельзя настроить можно и дописать. Чем я иногда и занимаюсь изучая python и django.

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

На php на том же opencart с sql запросами я бы сделал сайт гораздо быстрее, но как же можно обойти стороной python с его столь притягательной магией.

Не нашел на хабре статей про satchmo, вот и решил поделиться своим очень небольшим опытом.
Код лежит на гитхабе. Может кому пригодится.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.