Tag: Development

Редирект в urls.py (Django, RedirectView)

Порой нужно не создавая вьюшки прямо на входе перенаправить с запрошенного адреса на другой. Пример:

from django.conf.urls import patterns, url
from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^go-to-url/$', RedirectView.as_view(url='http://developtolive.com'), name='go-to-url'),
)

Наложение водяного знака в Django

Как я решил вопрос наложения водяного знака на изображение за 2 минуты.
Написал некую функцию которая и реализует наложение водяного знака с помощью модуля PIL:

import Image, ImageEnhance

def add_watermark(image, watermark, opacity=1, wm_interval=0):
    assert opacity >= 0 and opacity <= 1
    if opacity < 1:
        if watermark.mode != 'RGBA':
            self.watermark = watermark.convert('RGBA')
        else:
            watermark = watermark.copy()
        alpha = watermark.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        watermark.putalpha(alpha)

    layer = Image.new('RGBA', image.size, (0,0,0,0))
    for y in range(0, image.size[1], watermark.size[1]+wm_interval):
        for x in range(0, image.size[0], watermark.size[0]+wm_interval):
            layer.paste(watermark, (x, y))
    return Image.composite(layer,  image,  layer)

В моделе есть поле image, вот на него мы и накладываем водяной знак при любом сохранении объекта (это плохо — так не делайте, хотя бы по тому, что при каждом сохранении на изображение наложится повторно водяной знак, я это написал для наглядности). Вот этот сигнал и палит сохранение модели:

def prev_image(sender, instance, created, **kwargs):
    # Открываем водяной знак
    path_watermark = settings.STATIC_ROOT + '/watermark/logo.png'
    watermark_open = Image.open(path_watermark, 'r')

    # Открываем текущее изобразение изображение
    img_path = '/home/isite/data/django-apps/energy' + instance.image.url
    img_open = Image.open(img_path, 'r')

    # Накладываем водяной знак
    add_watermark(img_open, watermark_open, 0.3, 50).save(img_path)

signals.post_save.connect(prev_image, sender=Product)

Таблица. Математические символы и греческие буквы

Описание символа Обозначение 10-ный код 16-ный код Вид
курсивное f &fnof; &#402; &#x192; ƒ
прописная альфа &Alpha; &#913; &#x391; Α
прописная бета &Beta; &#914; &#x392; Β
прописная гамма &Gamma; &#915; &#x393; Γ
прописная дельта &Delta; &#916; &#x394; Δ
прописной эпсилон &Epsilon; &#917; &#x395; Ε
прописная дзета &Zeta; &#918; &#x396; Ζ
прописная эта &Eta; &#919; &#x397; Η
прописная тета &Theta; &#920; &#x398; Θ
прописная иота &Iota; &#921; &#x399; Ι
прописная каппа &Kappa; &#922; &#x39A; Κ
прописная ламбда &Lambda; &#923; &#x39B; Λ
прописная мю &Mu; &#924; &#x39C; Μ
прописная ню &Nu; &#925; &#x39D; Ν
прописная кси &Xi; &#926; &#x39E; Ξ
прописной омикрон &Omicron; &#927; &#x39F; Ο
прописная пи &Pi; &#928; &#x3A0; Π
прописная ро &Rho; &#929; &#x3A1; Ρ
прописная сигма &Sigma; &#931; &#x3A3; Σ
прописная тау &Tau; &#932; &#x3A4; Τ
прописная ипсилон &Upsilon; &#933; &#x3A5; Υ
прописная фи &Phi; &#934; &#x3A6; Φ
прописная хи &Chi; &#935; &#x3A7; Χ
прописная пси &Psi; &#936; &#x3A8; Ψ
прописная омега &Omega; &#937; &#x3A9; Ω
строчная альфа &alpha; &#945; &#x3B1; α
строчная бета &beta; &#946; &#x3B2; β
строчная гамма &gamma; &#947; &#x3B3; γ
строчная дельта &delta; &#948; &#x3B4; δ
строчная эпсилон &epsilon; &#949; &#x3B5; ε
строчная дзета &zeta; &#950; &#x3B6; ζ
строчная эта &eta; &#951; &#x3B7; η
строчная тета &theta; &#952; &#x3B8; θ
строчная иота &iota; &#953; &#x3B9; ι
строчная каппа &kappa; &#954; &#x3BA; κ
строчная ламбда &lambda; &#955; &#x3BB; λ
строчная мю &mu; &#956; &#x3BC; μ
строчная ню &nu; &#957; &#x3BD; ν
строчная кси &xi; &#958; &#x3BE; ξ
строчный омикрон &omicron; &#959; &#x3BF; ο
строчная пи &pi; &#960; &#x3C0; π
строчная ро &rho; &#961; &#x3C1; ρ
строчная сигма конечная &sigmaf; &#962; &#x3C2; ς
строчная сигма &sigma; &#963; &#x3C3; σ
строчная тау &tau; &#964; &#x3C4; τ
строчная ипсилон &upsilon; &#965; &#x3C5; υ
строчная фи &phi; &#966; &#x3C6; φ
строчная хи &chi; &#967; &#x3C7; χ
строчная пси &psi; &#968; &#x3C8; ψ
строчная омега &omega; &#969; &#x3C9; ω
символ строчная тета &thetasym; &#977; &#x3D1; ϑ
ипсилон с крючком &upsih; &#978; &#x3D2; ϒ
символ пи &piv; &#982; &#x3D6; ϖ
маркер списка &bull; &#8226; &#x2022;
многоточие &hellip; &#8230; &#x2026;
знак прим &prime; &#8242; &#x2032;
знак двойной прим &Prime; &#8243; &#x2033;
надчеркивание &oline; &#8254; &#x203E;
дробная черта &frasl; &#8260; &#x2044;
рукописная P &weierp; &#8472; &#x2118;
мнимая часть числа &image; &#8465; &#x2111;
действительная часть числа &real; &#8476; &#x211C;
торговая марка &trade; &#8482; &#x2122;
алеф &alefsym; &#8501; &#x2135;
стрелка влево &larr; &#8592; &#x2190;
стрелка вверх &uarr; &#8593; &#x2191;
стрелка вправо &rarr; &#8594; &#x2192;
стрелка вниз &darr; &#8595; &#x2193;
стрелка влево-вправо &harr; &#8596; &#x2194;
возврат каретки &crarr; &#8629; &#x21B5;
двойная стрелка влево &lArr; &#8656; &#x21D0;
двойная стрелка вверх &uArr; &#8657; &#x21D1;
двойная стрелка вправо &rArr; &#8658; &#x21D2;
двойная стрелка вниз &dArr; &#8659; &#x21D3;
двойная стрелка влево-вправо &hArr; &#8660; &#x21D4;
квантор всеобщности &forall; &#8704; &#x2200;
знак дифференциала &part; &#8706; &#x2202;
квантор существования &exist; &#8707; &#x2203;
пустое множество &empty; &#8709; &#x2205;
набла &nabla; &#8711; &#x2207;
принадлежит множеству &isin; &#8712; &#x2208;
не принадлежит множеству &notin; &#8713; &#x2209;
является членом &ni; &#8715; &#x220B;
n-арное произведение &prod; &#8719; &#x220F;
n-арная сумма &sum; &#8721; &#x2211;
знак минус &minus; &#8722; &#x2212;
оператор звездочка &lowast; &#8727; &#x2217;
радикал &radic; &#8730; &#x221A;
пропорционально &prop; &#8733; &#x221D;
бесконечность &infin; &#8734; &#x221E;
угол &ang; &#8736; &#x2220;
логическое И &and; &#8743; &#x2227;
логическое ИЛИ &or; &#8744; &#x2228;
пересечение &cap; &#8745; &#x2229;
объединение &cup; &#8746; &#x222A;
интеграл &int; &#8747; &#x222B;
следовательно &there4; &#8756; &#x2234;
оператор тильда &sim; &#8764; &#x223C;
приблизительно равно &cong; &#8773; &#x2245;
асимптотически равно &asymp; &#8776; &#x2248;
не равно &ne; &#8800; &#x2260;
тождественно равно &equiv; &#8801; &#x2261;
меньше или равно &le; &#8804; &#x2264;
больше или равно &ge; &#8805; &#x2265;
подмножество &sub; &#8834; &#x2282;
надмножество &sup; &#8835; &#x2283;
не подмножество &nsub; &#8836; &#x2284;
подмножество или равно &sube; &#8838; &#x2286;
надмножество или равно &supe; &#8839; &#x2287;
прямая сумма &oplus; &#8853; &#x2295;
векторное произведение &otimes; &#8855; &#x2297;
перпендикулярно &perp; &#8869; &#x22A5;
оператор точка &sdot; &#8901; &#x22C5;
левый верхний угол &lceil; &#8968; &#x2308;
правый верхний угол &rceil; &#8969; &#x2309;
левый нижний угол &lfloor; &#8970; &#x230A;
правый нижний угол &rfloor; &#8971; &#x230B;
левая угловая скобка &lang; &#9001; &#x2329;
правая угловая скобка &rang; &#9002; &#x232A;
ромб &loz; &#9674; &#x25CA;
пики &spades; &#9824; &#x2660;
трефы &clubs; &#9827; &#x2663;
червы &hearts; &#9829; &#x2665;
бубны &diams; &#9830; &#x2666;

Таблица. Специальные символы

Описание символа Обозначение 10-ный код 16-ный код Вид
кавычка &quot; &#34; &#x22; «
амперсант &amp; &#38; &#x26; &
левая угловая скобка &lt; &#60; &#x3C; <
правая угловая скобка &gt; &#62; &#x3E; >
лигатура OE &OElig; &#338; &#x152; Œ
лигатура oe &oelig; &#339; &#x153; œ
S с птичкой &Scaron; &#352; &#x160; Š
s с птичкой &scaron; &#353; &#x161; š
Y с диерезой &Yuml; &#376; &#x178; Ÿ
циркумфлекс &circ; &#710; &#x2C6; ˆ
малая тильда &tilde; &#732; &#x2DC; ˜
короткий пробел &ensp; &#8194; &#x2002;
длинный пробел &emsp; &#8195; &#x2003;
узкий пробел &thinsp; &#8201; &#x2009;
разделитель нулевой ширины &zwnj; &#8204; &#x200C;
соединитель нулевой ширины &zwj; &#8205; &#x200D;
указатель слева направо &lrm; &#8206; &#x200E;
указатель справа налево &rlm; &#8207; &#x200F;
короткое тире &ndash; &#8211; &#x2013;
длинное тире &mdash; &#8212; &#x2014;
открывающая одинарная кавычка &lsquo; &#8216; &#x2018;
закрывающая одинарная кавычка &rsquo; &#8217; &#x2019;
нижняя одинарная кавычка &sbquo; &#8218; &#x201A;
открывающая двойная кавычка &ldquo; &#8220; &#x201C;
закрывающая двойная кавычка &rdquo; &#8221; &#x201D;
нижняя двойная кавычка &bdquo; &#8222; &#x201E;
кинжал &dagger; &#8224; &#x2020;
двойной кинжал &Dagger; &#8225; &#x2021;
знак промилле &permil; &#8240; &#x2030;
открывающая угловая кавычка &lsaquo; &#8249; &#x2039;
закрывающая угловая кавычка &rsaquo; &#8250; &#x203A;
евро &euro; &#8364; &#x20AC;

Таблица. Символы латиницы

Описание символа Обозначение 10-ный код 16-ный код Вид
неразрывный пробел &nbsp; &#160; &#xA0;
перевернутый восклицательный знак &iexcl; &#161; &#xA1; ¡
цент &cent; &#162; &#xA2; ¢
фунт стерлингов &pound; &#163; &#xA3; £
знак денежной единицы &curren; &#164; &#xA4; ¤
йена &yen; &#165; &#xA5; ¥
вертикальная черта &brvbar; &#166; &#xA6; ¦
параграф &sect; &#167; &#xA7; §
диереза &uml; &#168; &#xA8; ¨
знак авторского права &copy; &#169; &#xA9; ©
показатель женского рода &ordf; &#170; &#xAA; ª
открывающая двойная угловая кавычка &laquo; &#171; &#xAB; «
знак отрицания &not; &#172; &#xAC; ¬
мягкий перенос &shy; &#173; &#xAD; ­
охраняемый знак &reg; &#174; &#xAE; ®
надчеркивание &macr; &#175; &#xAF; ¯
градус &deg; &#176; &#xB0; °
плюс-минус &plusmn; &#177; &#xB1; ±
вторая степень &sup2; &#178; &#xB2; ²
третья степень &sup3; &#179; &#xB3; ³
острое ударение &acute; &#180; &#xB4; ´
знак микро &micro; &#181; &#xB5; µ
конец абзаца &para; &#182; &#xB6;
средняя точка &middot; &#183; &#xB7; ·
седиль &cedil; &#184; &#xB8; ¸
единица в верхнем индексе &sup1; &#185; &#xB9; ¹
показатель мужского рода &ordm; &#186; &#xBA; º
закрывающая двойная угловая кавычка &raquo; &#187; &#xBB; »
одна четвертая &frac14; &#188; &#xBC; ¼
одна вторая &frac12; &#189; &#xBD; ½
три четверти &frac34; &#190; &#xBE; ¾
перевернутый вопросительный знак &iquest; &#191; &#xBF; ¿
A с тупым ударением &Agrave; &#192; &#xC0; À
A с острым ударением &Aacute; &#193; &#xC1; Á
A с циркумфлексом &Acirc; &#194; &#xC2; Â
A с тильдой &Atilde; &#195; &#xC3; Ã
A с диерезой &Auml; &#196; &#xC4; Ä
A с кружком &Aring; &#197; &#xC5; Å
лигатура AE &AElig; &#198; &#xC6; Æ
C с седилем &Ccedil; &#199; &#xC7; Ç
E с тупым ударением &Egrave; &#200; &#xC8; È
E с острым ударением &Eacute; &#201; &#xC9; É
E с циркумфлексом &Ecirc; &#202; &#xCA; Ê
E с диерезой &Euml; &#203; &#xCB; Ë
I с тупым ударением &Igrave; &#204; &#xCC; Ì
I с острым ударением &Iacute; &#205; &#xCD; Í
I с циркумфлексом &Icirc; &#206; &#xCE; Î
I с диерезой &Iuml; &#207; &#xCF; Ï
ETH &ETH; &#208; &#xD0; Ð
N с тильдой &Ntilde; &#209; &#xD1; Ñ
O с тупым ударением &Ograve; &#210; &#xD2; Ò
O с острым ударением &Oacute; &#211; &#xD3; Ó
O с циркумфлексом &Ocirc; &#212; &#xD4; Ô
O с тильдой &Otilde; &#213; &#xD5; Õ
O с диерезой &Ouml; &#214; &#xD6; Ö
знак умножения &times; &#215; &#xD7; ×
O перечеркнутое &Oslash; &#216; &#xD8; Ø
U с тупым ударением &Ugrave; &#217; &#xD9; Ù
U с острым ударением &Uacute; &#218; &#xDA; Ú
U с циркумфлексом &Ucirc; &#219; &#xDB; Û
U с диерезой &Uuml; &#220; &#xDC; Ü
Y с острым ударением &Yacute; &#221; &#xDD; Ý
THORN &THORN; &#222; &#xDE; Þ
двойное s &szlig; &#223; &#xDF; ß
a с тупым ударением &agrave; &#224; &#xE0; à
a с острым ударением &aacute; &#225; &#xE1; á
a с циркумфлексом &acirc; &#226; &#xE2; â
a с тильдой &atilde; &#227; &#xE3; ã
a с диерезой &auml; &#228; &#xE4; ä
a с кружком &aring; &#229; &#xE5; å
лигатура ae &aelig; &#230; &#xE6; æ
c с седилем &ccedil; &#231; &#xE7; ç
e с тупым ударением &egrave; &#232; &#xE8; è
e с острым ударением &eacute; &#233; &#xE9; é
e с циркумфлексом &ecirc; &#234; &#xEA; ê
e с диерезой &euml; &#235; &#xEB; ë
i с тупым ударением &igrave; &#236; &#xEC; ì
i с острым ударением &iacute; &#237; &#xED; í
i с циркумфлексом &icirc; &#238; &#xEE; î
i с диерезой &iuml; &#239; &#xEF; ï
eth &eth; &#240; &#xF0; ð
n с тильдой &ntilde; &#241; &#xF1; ñ
o с тупым ударением &ograve; &#242; &#xF2; ò
o с острым ударением &oacute; &#243; &#xF3; ó
o с циркумфлексом &ocirc; &#244; &#xF4; ô
o с тильдой &otilde; &#245; &#xF5; õ
o с диерезой &ouml; &#246; &#xF6; ö
знак деления &divide; &#247; &#xF7; ÷
o перечеркнутое &oslash; &#248; &#xF8; ø
u с тупым ударением &ugrave; &#249; &#xF9; ù
u с острым ударением &uacute; &#250; &#xFA; ú
u с циркумфлексом &ucirc; &#251; &#xFB; û
u с диерезой &uuml; &#252; &#xFC; ü
y с острым ударением &yacute; &#253; &#xFD; ý
thorn &thorn; &#254; &#xFE; þ
y с диерезой &yuml; &#255; &#xFF; ÿ

Стандартные шрифты Windows

На веб‑страницах имеет смысл использовать только те шрифты, которые установлены на компьютерах пользователей. Вот перечень таких шрифтов.

Шрифт Семейство Windows Office Образец шрифта
(текст)
Arial sans‑serif 3.1, 95, NТ 3.5 97 Образец шрифта
Arial Black sans‑serif 95, 2000 97 Образец шрифта
Arial Narrow sans‑serif 4.3 Образец шрифта
Arial Unicode MS sans‑serif 2000 Образец шрифта
Book Antiqua serif 98 4.3 Образец шрифта
Bookman Old Style serif 4.3 Образец шрифта
Calibri sans‑serif Vista 2007 Образец шрифта
Cambria serif Vista 2007 Образец шрифта
Candara sans‑serif Vista 2007 Образец шрифта
Century serif 2000 Образец шрифта
Century Gothic sans‑serif 95 4.3 Образец шрифта
Comic Sans MS cursive 95, 2000 97 Образец шрифта
Consolas monospace Vista 2007 Образец шрифта
Constantia serif Vista 2007 Образец шрифта
Corbel sans‑serif Vista 2007 Образец шрифта
Courier New monospace 3.1, 95, NT 3.5 97 Образец шрифта
Franklin Gothic Medium sans‑serif XP 97 Образец шрифта
Garamond serif 97 Образец шрифта
Georgia serif 95, 2000 97 Образец шрифта
Impact sans‑serif 95, 2000 4.3 Образец шрифта
Lucida Console monospace 95, NT 3.5 Образец шрифта
Lucida Sans Unicode sans‑serif 95, NT 3.5 Образец шрифта
Microsoft Sans Serif sans‑serif 2000 Образец шрифта
Mistral cursive 97 Образец шрифта
Monotype Corsiva cursive 4.3 Образец шрифта
Palatino Linotype serif 2000 2003 Образец шрифта
Segoe Print cursive Vista 2007 Образец шрифта
Segoe Script cursive Vista 2007 Образец шрифта
Segoe UI sans‑serif Vista 2007 Образец шрифта
Sylfaen serif XP Образец шрифта
Tahoma sans‑serif 98, 2000 97 Образец шрифта
Times New Roman serif 3.1, 95, NT 3.5 97 Образец шрифта
Trebuchet MS sans‑serif 95, 2000 97 Образец шрифта
Verdana sans‑serif 95, 2000 97 Образец шрифта

ImageField и JPG(JPEG) изображение в Django

Кто то как и я столкнулся с такой проблемой, как загрузка изображений в django, но модель ImageField ругается на jpg изображения с криками, что это вовсе не изображение. Для лечения подобного поведения необходим пакет python-devel. Во всех системах он называется по разному а в некоторых он вовсе не поддерживается. В ubuntu он так и называется python-devel, а где то он зовется python-dev, во freebsd он звучит просто по наркомански=) можете сами убедиться make search. Но самое главное все это лечится.

Коры в django шаблоне

В одном из сайтов попросили внести некие изменения. Сайт работает на Django. По ходу работы открываю шаблон и наблюдаю просто веселую картину. Вот кусок того шаблона:

{% extends "base.html" %}

{% block title %}
	<title>«{{ name_site }}» | Каталог продукции</title>
{% endblock %}

{% block main_content %}
<div id="content" class="catalog">
<? @echo 'lalalal' ?>

	<div id="right_column">
		<table>
		<tr><td><a href="/media/upload/price.doc"><img src="/media/images/icon_download.gif?050509" alt="скачать"/></a></td><td><a href="/media/upload/price.doc?1" class="black"><b>Скачать прайс-лист</b></a></td></tr>
		<tr><td> </td><td><span class="grey">81 КБ, 01.04.2011</span></td></tr>
		</table>
		<div id="tara"><a href="/tara/">Тара</a></div>
		<div class="new_product">
			<div class="np_title">Новинки</div>

Если кто то еще не понял, то смотрим на 9 строку.

Резайл (Thumbnail) изображения в bitrix №2

Метод создает уменьшенную копию изображения sourcePath.

bool
CreateThumbnail( 
 string sourcePath,
 string previewPath,
 int maxWidth,
 int maxHeight
);
sourcePath Абсолютный путь к исходному изображению, для которого необходимо сделать уменьшенную копию.
previewPath Абсолютный путь к файлу, в который будет сохранена уменьшенная копия изображения.
maxWidth Максимальная ширина уменьшенного изображения.
maxHeight Максимальная высота уменьшенного изображения
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/wizard.php");

$success = CWizardUtil::CreateThumbnail($_SERVER["DOCUMENT_ROOT"]."/big.gif",$_SERVER["DOCUMENT_ROOT"]."/small.gif", 100, 100);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>

Переопределение методов save() или пишем сигнал post_save() — Django

Довольно часто возникает задача: при сохранении модели произвести те или иные действия с данными.
Вот типичная задача: при добавлении новости произвести рассылку подписавшимся на новости.

# Модель подписавшихся на рассылку
class Subscrib(models.Model):
    Список объектов

# Модель новостей
class News(models.Model):
    Список объектов

def go_subscrib(sender, instance, created, **kwargs):
    if created and instance.status == 1:
        title = instance.title.encode('utf-8') # у меня на одном из проектов ругался на кодировку
        for item in Subscrib.objects.all():
            to_email = item.email
            subject = 'Новая новость на сайте'
            html_content = '<p><i>Здравствуйте</i></p>'
            html_content += 'Новая новость: <a href="http://developtolive.com/news/%s/">%s</a>' % (instance.id, title)
            html_content +='<p><i>Отписаться от рассылки можно по <a href="http://developtolive.com/send/sub/no/?email=%s">ссылке</a></i></p>' % (item.id)
            html_content += '<p><i>Всего доброго.</i></p>'
            from_email = 'i@developtolive.com'
            msg = EmailMessage(subject, html_content, from_email, [to_email])
            msg.content_subtype = "html"
            msg.send()
signals.post_save.connect(go_subscrib, sender=News)

Или же вот такая задача: произвести рассылку при сохранении новости. Тогда мы переопределяем метод save() в модели News

# Модель новостей
class News(models.Model):
    Список объектов
    def save(self):
        for item in Subscrib.objects.all():
            to_email = item.email
            subject = 'Обновление новостей на сайте'
            html_content = '<a href="http://developtolive.com/news/%s/">%s</a>' % (self.id, self.title)
            from_email = 'i@developtolive.com'
            msg = EmailMessage(subject, html_content, from_email, [to_email])
            msg.content_subtype = "html"
            msg.send()
        super(News, self).save()