29 июл. 2008 г.

Идея для закрытого сервиса закладок

У меня появилась идея сделать сервис закрытых закладок, то есть противоположность сервису публичных закладок. Для меня это была б довольно полезная вещь.

Очень часто шлю своим друзьям и коллегам ссылки на статьи по интересной нам теме. Каждый раз мучаюсь при этом сомнениями по поводу удобства восприятия информации по почте. Андрюха дак вооще меня убъет скоро за то, что я ему ссылки почтой посылаю (у него на работе в Нефтегазе трафик платный).

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

В общем, идея создать более гибкий сервис для хранения закладок, сделать возможным (как и в гугл закладки + блокнот) публиковать записи с комментариями, но увеличть акцент на закрытость сервиса.

Даже название есть (Маша придумала): "Кротжмот.ру - сервис асоциальных закладок". По наалогии с "БобрДобр.ру - социальный сервис закладок Рунета". :)

Алиментной амнистии не будет!

"Правительство включило в перечень доходов, с которых производится удержание алиментов, суммы, выплачиваемые в возмещение вреда, причиненного здоровью, и компенсационные выплаты за счет средств федерального бюджета, бюджетов субъектов РФ и местных бюджетов гражданам, пострадавшим в результате радиационных или техногенных катастроф. Изменения зафиксированы в Постановлении Правительства РФ от 14.07.2008 №517."

72dengi.ru/newsline/2575.html

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

26 июл. 2008 г.

Отдел ФБР Малдера и Скалли учреждён для борьбы за нераскрываемость :)

Елена РАЗУМНАЯ на http://72afisha.ru/iview/81.html пишет о новом фильме X-Files:

...

А суть сюжета вот в чем: в северной части Вирджинии при странных обстоятельствах исчезают женщины. Потом в снегу, благодаря мистическим видениям бывшего священника (осужденного, кстати, за педофилию), были обнаружены человеческие останки. Полиция полагает, что эти свидетельства медицинских опытов как-то связаны с пропавшими женщинами, одна из которых – агент ФБР. И тогда местная полиция решает обратиться за помощью к агентам уже закрытого отдела паранормальных явлений ФБР Фоксу Малдеру и Дане Скалли, которым, как всегда, предстоит доказать, что истина где-то рядом.

Название «Хочу верить», на мой взгляд, просто идеально. Достоевщины в фильме много: главные герои постоянно раздумывают, куда им пойти, как поступить, ввязываться в новое расследование или нет... Чтобы справиться с происходящей ситуцией, действительно, остается только верить.

...

 

В погоне за красным словцом, получила довольное интересный метафорический оборот из которого следует, что единственной целью отдела паранормальных явлений ФБР. Смешно? Нет. Дело в том, что такими целями, на мой взгляд, озадачены 50% милицейского аппарата в России. Жаль, что они не вешают на окнах крестики из изаленты, имхо было б забавней.

11 июл. 2008 г.

Мы все умрём :)

Большие проблемы мельчайших организмов

Автор уверяет, что "количество зоопланктона уменьшилось на 73% за неполные 50 лет", а без него всей пищевой цепочке писец.

Как не надо верстать html.

Ну собственно вот:

image

Так верстать, друзья, не нужно!

Eric Holscher пишет о настройке Django и mod_wsgi

Необычным, в этом описании можно считать только подключение хэндлера:

import os, sys

sys.path.append('/home/eric/Python/PROJECT')

os.environ['DJANGO_SETTINGS_MODULE'] = 'PROJECT.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

В общем, советую ознакомиться.

 

Это кросс-пост из моего отдельного блога о джанго.

Настройки Django в context processor динамически

Вчера я писал о COMMON_MEDIA и ADMIN_MEDIA_PREFIX настройках в качестве context processor, а сегодня появился замечательный сниппет, который позволяет передавать записи из settings.py как context processor не парясь с написанием функций.

10 июл. 2008 г.

Django из коробки

14 проект на Django стал последней каплей :). Нет, серьезно слоган джанго: "не повторяйте себя!", так? Каждый раз создавая проект я скурпулезно переношу в него все свои старые наработки и только потом приступаю к написанию.

"Это плохо"- подумал я, и сделал seleton проект.

Посмотреть его можно тут: svn://std.tsogu.ru/skeleton.

Структура файлов пока что такая:

skeleton

  • skeletonapp
    • templates
      • 404.html
      • 500.html
      • base.html
      • index.html
    • __init__.py
    • models.py
    • urls.py
    • views.py
  • userapp
    • templates
      • index.html
    • __init__.py
    • models.py
    • urls.py
    • views.py
  • __init__.py
  • context_processors.py
  • manage.py
  • settings.py
  • snippets.py
  • urls.py

Наиболее интересные куски этих файлов я выложу ниже для, так сказать, обмена опытом и конструктивной критики (ага, дождаться б).

settings.py:

import os
working_dir = os.path.dirname(__file__)

 

MEDIA_ROOT = working_dir + '/media/'

TEMPLATE_DIRS = (
    working_dir + '/skeletonapp/templates/',
    working_dir + '/userapp/templates/',
)

...

ADMIN_MEDIA_ROOT = '/usr/local/lib/python/site-packages/django/contrib/admin/media/'

 

...

COMMON_MEDIA_URL = 'http://std.tsogu.ru/media/'

 

...

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "skeleton.context_processors.common_media_url",
    "skeleton.context_processors.admin_media_prefix",
    "skeleton.context_processors.trac",
)

...

## Информация о проекте в trac.std.tsogu.ru
TRAC_URL = 'http://trac.std.tsogu.ru/'
TRAC_COMPONENT_NAME = 'skeleton'
TRAC_VERSION = 'skeleton_ver1'
TRAC_MILESTONE = 'skeleton_ver2'
TRAC_OWNER = 'markeev'

...

AUTH_PROFILE_MODULE = "userapp.UserProfile"

Комментарии, по большей части, излишни. Добавлю только, что большая часть непонятных переменных используется в context processors (или как это будет по русски? :) ).

urls.py (в корне проекта):

(r'^media/(?P<path>.*)', 'django.views.static.serve', {'document_root':settings.MEDIA_ROOT,'show_indexes': True}),
(r'^adminmedia/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.ADMIN_MEDIA_ROOT, 'show_indexes': True}),

Известный косяк с потерей путей к админским css файлам лечится вышеобозначенными напильниками.

context_processors.py:

def common_media_url(request):
    from django.conf import settings
    return {
        'COMMON_MEDIA_URL': settings.COMMON_MEDIA_URL,
        }

def admin_media_prefix(request):
    from django.conf import settings
    return {
        'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX,
        }

def trac(request):
    from django.conf import settings
    try: username = request.username
    except: username = 'anonymous'
    return {
        'username': username,
        'TRAC_URL': settings.TRAC_URL,
        'TRAC_COMPONENT_NAME': settings.TRAC_COMPONENT_NAME,
        'TRAC_VERSION': settings.TRAC_VERSION,
        'TRAC_MILESTONE': settings.TRAC_MILESTONE,
        'TRAC_OWNER': settings.TRAC_OWNER,
        }

С первыми двумя функциями все ясно: передают в шаблон значения COMMON_MEDIA_URL и ADMIN_MEDIA_PREFIX.

Функция trac нужна для заполнения страниц с ошибками:

404.html:

{% extends "base.html" %}

{% block title %}404 - Запрошенная страница не найдена{% endblock %}

{% block content %}
<h1>404 - Запрошенная страница не найдена</h1>
<p>Страница не найдена. <a href="{{ TRAC_URL }}newticket?reporter={{username}}&component={{ TRAC_COMPONENT_NAME }}&milestone={{TRAC_MILESTONE}}&version={{TRAC_VERSION}}&owner={{TRAC_OWNER}}">Сообщить об ошибке!</a></p>
<p>Дополнительная информация на <a href="{{ TRAC_URL }}wiki/{{ TRAC_COMPONENT_NAME }}">странице проекта.</p>
{% endblock %}

snippets.py использую для хранения и использования понравившихся сниппетов. Например очень удобный 821:

from django.shortcuts import render_to_response

from django.template import RequestContext

def render_to(template_path):
    def decorator(func):
        def wrapper(request, *args, **kw):
            output = func(request, *args, **kw)
            if not isinstance(output, dict):
                return output
            return render_to_response(template_path, output,
                context_instance=RequestContext(request))
        return wrapper
    return decorator

 

Осталось только одно, про что я не рассказал - COMMON_MEDIA_URL. Параметр используется в шаблонах для подключения общих для всей информационной службы css и javascript фреймворков.