Блог

Open Horizon

<p>Очень красивое видео.</p>
<p><iframe src="http://player.vimeo.com/video/41406753” width=”400” height=”300” frameborder=”0” allowfullscreen=”allowfullscreen”></iframe></p>

like it

Выбор шрифта

<p>Откройте картинку в новом окне.</p>
<p><a href=”/media/uploads/2018/11/09/1lyi6Fo.png”><img class=”alignnone size-medium wp-image-225” title=”Выбор шрифта” src=”/media/uploads/2018/11/09/1lyi6Fo.png” alt=”” style=”width: 100%;” /></a></p>

дизайн

Фильтр записей таблицы на jQuery

function filterforme() {
    v = $('#filterbox-input').val().toLowerCase();
    nowCount = 0;

    $('#listtable tbody tr').hide();
    $('#listtable tbody tr').filter(function(index) {
        b = ($(this).text().toLowerCase().indexOf(v) != -1) || (v == '') ? true : false;
        nowCount += b;
        return b;
    }).show();
    $('#countRecords').text(nowCount+' из '+fullCount);
}
$('#filterbox-input').keyup(function () {
    filterforme();
});
<div class="filterbox"><label for="filterbox-input">Фильтр</label><input type="text" value="" id="filterbox-input" name="filterbox-input"></input></div>
<table class="sort-table" id="listtable">
    <thead>
        <tr>
            <th>Код</th>
            <th>Наименование</th>
            <th>Описание</th>
            <th>Редактировать</th>
            <th>Удалить</th>
        </tr>
    </thead>
    <tbody>

        <tr>
            <td>И</td>
            <td>Используется</td>
            <td>СИ используется по назначению</td>
            <td align="center"><a href="/spravochnik/sostoyanie/edit/1/"><img title="редактировать" alt="редактировать" src="/media/static/images/system/pencil_16.png" /></a></td>
            <td align="center"><a href="/spravochnik/sostoyanie/delete/1/" onclick="return deleteQuest();"><img title="удалить" alt="удалить" src="/media/static/images/system/delete_16.png" /></a></td>
        </tr>

        <tr>
            <td>К</td>
            <td>Консервация</td>
            <td>СИ законсервировано, находится на длительном хранении</td>
            <td align="center"><a href="/spravochnik/sostoyanie/edit/2/"><img title="редактировать" alt="редактировать" src="/media/static/images/system/pencil_16.png" /></a></td>
            <td align="center"><a href="/spravochnik/sostoyanie/delete/2/" onclick="return deleteQuest();"><img title="удалить" alt="удалить" src="/media/static/images/system/delete_16.png" /></a></td>
        </tr>

        <tr>
            <td>Р</td>
            <td>Ремонт</td>
            <td>СИ находится в ремонте</td>
            <td align="center"><a href="/spravochnik/sostoyanie/edit/3/"><img title="редактировать" alt="редактировать" src="/media/static/images/system/pencil_16.png" /></a></td>
            <td align="center"><a href="/spravochnik/sostoyanie/delete/3/" onclick="return deleteQuest();"><img title="удалить" alt="удалить" src="/media/static/images/system/delete_16.png" /></a></td>
        </tr>

    </tbody>
</table>
<div class="countTable">Отображено записей: <span id="countRecords">0</span></div>

javascript

Свои сообщения об ошибках при валидации формы в Django

Думаю, вы хотите, чтобы ваши сообщения об ошибках в заполняемых формах были на том же языке, что и сам сайт. Один из простых способов - это добавить следующий код в соответствующий forms.py. Затем формы надо будет наследовать не от forms.Form, а от MyForm (обратите внимание, ExampleForm, в примере ниже, наследуется от него).

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        for k, field in self.fields.items():
            if 'required' in field.error_messages:
                field.error_messages['required'] = u'Это поле обязательно!'

class ExampleForm(MyForm):
    title = forms.CharField(max_length=100, required=True, label=u'Название')

Полный список error_messages для различных типов полей можно увидеть, если просмотреть этот раздел: https://docs.djangoproject.com/en/1.3/ref/forms/fields/#built-in-field-classes

Вот что есть на данный момент:

required - показывается, если данное поле обязательно;
max_length - если превышено максимальное количество символов в символьном поле / в случае с файлами - длина имени файла;
min_length - если символов меньше, чем должно быть, в символьном поле;
invalid_choice - если выбран невозможный choice;
invalid - при неправильном email’е и прочем неправильном вводе данных;
max_value - если превышено числовое значение;
min_value - если значение меньше минимального числового ограничения;
max_digits - если превышено количество цифр в числе;
max_decimal_places - если превышено количество цифр после запятой;
max_whole_digits - если превышено количество цифр до запятой;
missing - если файл не найден;
empty - если файл пустой;
invalid_image - если изображение повреждено;
invalid_list  - если неправильный список choice’ов;
invalid_link - для URLField - вызывается, если данного url не существует.

Основано на примере с http://stackoverflow.com/questions/1481771/django-override-default-form-error-messages

django

CSRF token missing or incorrect (django)

После переноса сайта с хостинга jino на webfaction, при попытке отправки любой формы возникала ошибка “CSRF token missing or incorrect”. Т.е. даже залогиниться на сайт было невозможно (авторизация через админку работала нормально и на сайте после я этого был авторизован).

CSRF - это уязвимость, когда пользователи, переходя по обычной ссылке, запускают хакерский скрипт, который может от их имени передать какую-либо форму на абсолютно другой сайт (например, оставить от их имени комментарий на одном из форумов или еще что-нибудь). Сам хакер не сможет получить результат перехода по ссылке. Собственно, это и отличает CSRF от XSS (http://www.securitylab.ru/analytics/292473.php).

Все описания этой ошибки ссылаются на документацию - https://docs.djangoproject.com/en/dev/ref/contrib/csrf/, либо советом добавлять во всех формах {% csrf_token %} в темплейтах (у меня он везде добавлен) и проверить, есть ли в settings.py в MIDDLEWARE_CLASSES пункт 'django.middleware.csrf.CsrfViewMiddleware'. Это все было. И не помогало.

Выход нашел, когда сравнил MIDDLEWARE_CLASSES от вебфакшна и джино.

webfaction:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

jino:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

Поменяв на джиновские миддлвары - все запустилось и заработало нормально. Т.е., получилось, что ‘django.middleware.csrf.CsrfViewMiddleware’, в моем случае, не должна была быть в списке. Хотя, возможно, что после ее удаления, джанго просто не показывает ошибку, а уязвимость осталась. По крайней мере, на данный момент, проблему это решило. При следующей встрече, постараюсь решить эту проблему правильней, на данный момент знаний по этой теме не хватает.

django

Как оформить ИП - по шагам

Теперь я индивидуальный предприниматель. После того, как вручную оформил все документы, осознал, насколько легкие деньги получают организации, занимающиеся “помощью в организации ИП и ООО”. Ведь они берут в 4-5 раз больше, чем если все делать самому! Оформление занимает от силы 2 часа вашего времени!

Итак, по шагам, что я делал.

  1. Конечно, готовился. Почитал статьи на хабре, просто полазил по инету, в частности по сайту УФНС - nalog.ru. Хоть в налоговой и доступно объяснили, но советую хоть что-то почитать, прежде чем идти. Взял с собой паспорт. Если есть ИНН, то его тоже нужно взять. Больше ничего не понадобилось.

  2. Пришел в налоговую, сказал, что хочу оформить ИП. Также сказал, что у меня нет ИНН - дали бланк заполнить. Бланк на организацию ИП лучше распечатать дома (я так и сделал) - Скачать бланк Р21001.

  3. Отправили платить госпошлину в размере 800 рублей. Сходил до банка, заполнил заявление (пример в налоговой дадут), заплатил, пришел обратно с бумагой об оплате, которую дали в банке.

  4. Сказал, что хочу еще УСН, опять же дали заявление, заполнил его (дело пары минут). Это все. Сказали, что позвонят, когда документы будут готовы.

  5. Ровно через две недели с утра позвонили, в тот же день приехал и забрал документы.

В итоге - моего времени потрачено часа 2, в налоговой все на отлично объяснили - что, когда и куда. Объяснили точно не хуже, чем вам бы объяснили в “помогающей” организации.
Заплатил всего 800 рублей, вместо 2.5-3 т.р.

Не забудьте сделать расчетный счет в любом банке (просто позвоните и вам все объяснят - какие документы необходимо подготовить).

бизнес

Мастер фотошопа 146 левела %_%

<p><iframe src="http://player.vimeo.com/video/36092192?portrait=0” width=”400” height=”225” frameborder=”0” allowfullscreen=”allowfullscreen”></iframe></p>
<p><a href= of GAEA - Flowing Meditation</a> from <a href="http://vimeo.com/jessenewman”>Jesse Michael Newman</a> on <a href="http://vimeo.com“>Vimeo</a>.</p>
<p>Кстати, использовался Adobe After Effect.</p>

like it

One Piece AMV

<p>Досмотрел до последней вышедшей на данный момент серии ванписа, пересмотрел OVA, спешлы и мувики. Имхо, один из лучших аниме-сериалов. Захотелось выложить пару любимых AMV по нему :)</p>
<p><strong>AKROSS Con 2007 narutomaniac Mugiwara’s alt</strong></p>
<p><object style=”height: 390px; width: 640px;” width=”300” height=”150”><param name=”movie” value="http://www.youtube.com/v/KCTJlrtbB8s?version=3&feature=player_detailpage” /><param name=”allowFullScreen” value=”true” /><param name=”allowScriptAccess” value=”always” /><embed src="http://www.youtube.com/v/KCTJlrtbB8s?version=3&feature=player_detailpage” type=”application/x-shockwave-flash” allowfullscreen=”allowfullscreen” allowscriptaccess=”always” width=”640” height=”360” /></object></p>
<p><strong>One Piece Caramelldansen</strong></p>
<p><object style=”height: 390px; width: 640px;” width=”300” height=”150”><param name=”movie” value="http://www.youtube.com/v/dpMFjSNOpeU?version=3&feature=player_embedded” /><param name=”allowFullScreen” value=”true” /><param name=”allowScriptAccess” value=”always” /><embed src="http://www.youtube.com/v/dpMFjSNOpeU?version=3&feature=player_embedded” type=”application/x-shockwave-flash” allowfullscreen=”allowfullscreen” allowscriptaccess=”always” width=”640” height=”360” /></object></p>

like it

Johnny Neon ‘Hearts’

<p><iframe src="http://player.vimeo.com/video/37123607?title=0&byline=0&portrait=0” width=”400” height=”225” frameborder=”0” allowfullscreen=”allowfullscreen”></iframe></p>
<p><a href= Neon ‘Hearts’</a> from <a href="http://vimeo.com/davemeinert”>Dave Meinert</a> on <a href="http://vimeo.com“>Vimeo</a>.</p>

like it

Подключение TinyMCE в админку django

Для того, чтобы в админке подключить WYSIWYG-редактор TinyMCE необходимо проделать следующие операции.

  1. Скачиваем сам редактор TinyMCE: http://www.tinymce.com/download/download.php и заливаем на сервер (со стороннего url работать не будет).

  2. Устанавливаем django-tinymce (обязательно должен быть версии 1.5.1a2 или выше, в стабильной на момент написания статьи версии 1.5 он имеет баг, из-за которого не хочет работать без напильника):

pip install django-tinymce
  1. В settings.py вашего проекта записываем записываем следующие переменные:
TINYMCE_JS_URL = 'tiny_mce/tiny_mce.js'
TINYMCE_JS_ROOT = 'tiny_mce'
TINYMCE_DEFAULT_CONFIG = {'theme': "advanced", 'theme_advanced_toolbar_location' : "top", 'height': '400'}

TINYMCE_JS_URL - путь к tiny_mce.js - например, http://mysite.com/tinymce/tiny_mce.js (крайне желательно писать без домена, он здесь дан только для того, чтобы было понятно, относительно чего происходит запрос)

TINYMCE_JS_ROOT - путь к корневой папке, где лежит tiny_mce.js - например, http://mysite.com/tinymce/ (крайне желательно писать без домена)

TINYMCE_DEFAULT_CONFIG - конфигурация по умолчанию, подробности см. в официальной документации TinyMCE.

Также, в INSTALLED_APPS надо дописать 'tinymce':

INSTALLED_APPS = (
    ...
    'tinymce',
    ...
)
  1. В модель, в которой хотим включить редактор TinyMCE импортируем tinymce:
from tinymce import models as tinymce_models

Для самого класса модели пишем следующее

class MyModel(models.Model):
    myField = tinymce_model.HTMLField()

Т.е. мы заменяем models.TextField() на tinymce_model.HTMLField() в необходимых местах.

  1. В urls.py проекта добавляем (r'^tinymce/',include('tinymce.urls')):
urlpatterns = patterns('myproject.views',
    ...
    (r'^tinymce/', include('tinymce.urls')),
    (r'^admin/', include(admin.site.urls)),
)

Источники:
1. http://seobacks.ru/tinymce-django.html
2. http://django-tinymce.googlecode.com/svn/tags/release-1.5/docs/.build/html/index.html

django