Архивы: Март 2014

Простая капча на PHP

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

Создаем сам файл captcha.php, где и будет формироваться сама картинка с капчей. Для работы скрипта необходимо включить расширение php GD и шрифт comic.ttf (можете использовать свои шрифты)

Содержимое captcha.php:

<?php 

// Задаем список символов, используемых в капче 
$capletters = 'ABCDEFGKIJKLMNOPQRSTUVWXYZ123456789';  
// Длина капчи 7 знаков 
$captlen = 7;  

// Устанавливаем размеры изображения 
$capwidth = 120; $capheight = 20;  

// Подключаем шрифт 
$capfont = 'font/comic.ttf';  

 // Размер нашего текста 
$capfontsize = 14; 

// Переопределяем HTTP заголовок, чтобы контент нашего  
// скрипта представлял собой не текст, а изображение 
header('Content-type: image/png');  

// Формируется изображение с указанными ранее размерами 
$capim = imagecreatetruecolor($capwidth, $capheight);  

// Устанавливаем необходимость применения альфа канала (прозрачности) 
imagesavealpha($capim, true);  

// Устанавливаем цвет фона, в нашем случае - прозрачный 
$capbg = imagecolorallocatealpha($capim, 0, 0, 0, 127); 

// Устанавливаем цвет фона изображения 
imagefill($capim, 0, 0, $capbg);  

// Задаем начальное значение капчи 
$capcha = ''; 

// Запускаем цикл заполнение изображения 
for ($i = 0; $i < $captlen; $i++){ 

// Из нашего списка берем «рендомный» символ и добавляем в капчу 
$capcha .= $capletters[rand(0, strlen($capletters)-1) ];  

// Вычисление положения символа по X оси 
$x = ($capwidth - 20) / $captlen * $i + 10; 

// Добавим «рендомности» в это положение. 
$x = rand($x, $x+5);  

// Находим положение по Y оси 
$y = $capheight - ( ($capheight - $capfontsize) / 2 );  

// Укажем случайный цвет для символа. 
$capcolor = imagecolorallocate($capim, rand(0, 100), rand(0, 100), rand(0, 100) );  

// Наклон для символа 
$capangle = rand(-25, 25);  

// Рисуем созданный символ, применяя все описанные параметры 
imagettftext($capim, $capfontsize, $capangle, $x, $y, $capcolor, $capfont, $capcha[$i]); 

} // Закрываем цикл 

// Создаем переменную, куда будет сохранена капча,  
// с ней будет сравниваться введенный пользователем текст 
session_start(); 

$_SESSION['capcha'] = $capcha; 

imagepng($capim); // Выводим картинку. 

imagedestroy($capim); // Очищаем память. 

?>

В файле проверки формы (капчи), примерно такое

<?php 
// Проверяем если капча была введена 
if ( isset($_POST['capcha']) ) {
	$code = $_POST['capcha']; // Получаем переданную капчу. 
	session_start(); 

	// Сравниваем введенную капчу с сохраненной в переменной в сессии 
	if(isset($_SESSION['capcha']) && strtoupper($_SESSION['capcha']) == strtoupper($code)) {
		echo 'Капча введена правильно';
	}else{
		echo 'Капча введена не верно';
	}
	
	// Удаляем капчу из сессии 
	unset($_SESSION['capcha']);

	exit();
}
?>

В форму необходимо добавить нашу капчу:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	<img src="captcha.php" width="120" height="20" /><br />
	Введите капчу: <input type="text" name="capcha" /><br />
	<input type="submit" value="Отправить" />
</form>

Выводит записи журнала действий пользователей в административной части в Django

Задача: вывести записи журнала действий пользователей в административной части в Django
Решение: Сама модель логирования в Django вот такая LogEntry и находится в django.contrib.admin.models. Все что нудно сделать это обычным способом вывести модель в админке.
В файле admin.py

# -*- coding: utf-8 -*-
from django.contrib import admin
from django.contrib.admin.models import LogEntry

class LogEntryAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'action_time', 'user', 'content_type', 'object_id', 'object_repr', 'action_flag', 'change_message')
    list_filter = ('content_type',)
    search_fields = ['user__username',]
    date_hierarchy = 'action_time'
admin.site.register(LogEntry, LogEntryAdmin)

Удаление файла при удалении записи в модели в Django

Сигнал который удаляет физически файл с диска при удалении объекта в модели.

from django.db.models.signals import post_delete
from django.dispatch import receiver

@receiver(post_delete, sender=Photo)
def photo_post_delete_handler(sender, **kwargs):
    photo = kwargs['instance']
    storage, path = photo.original_image.storage, photo.original_image.path
    storage.delete(path)

Русский бутстрап

Только сегодня наткнулся на официальном сайте bootstrap на ссылку русской версии. Вот линк http://www.oneskyapp.com/docs/bootstrap/ru