Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 13Sep

    Развел небольшой холивар на своем любимом блоге.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 07Aug

    Хоть и старенькое, но полезненькое.
    Основатель Pinax James Tauber. Рассказывает о своем детище. Pinax – это сборная солянка джанго апов для ускорения разработки. Апы в основном с уклоном на социальность. Вобщем упомянутые апы в любом случае стоят вашего внимания.

    PyCon 2009

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 01Aug

    Lazy Crazy Coder’s blog from Alexander Artemenko.

    Для себя отметил пару ссылок оттуда.

    Python testing tools

    Big list of Django tips (and some python tips too) – статья не новая, но есть еще очень актуальные вещи.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 01Aug

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

    Оставил себе таск на выходные порытся и тут. Обо всем напишу тут.

    PS: первое, к чему бы я сразу это прикрутил – это отсылка мыла. Ее всегда полезно отложить :)

    Всем удачных выходных.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , , , , ,

  • 31Jul

    398725Задача. У вас есть две таблици, связаны друг с другом как OneToOne. Но в админке их не удобно править раздельно. Хочется это делать в одном месте. К примеру возьмем профайл и юзер. Хотя мне кажется, что профайлы в джанго — это как кость в горле. Из-за них объединение присоединение больших приложений типа формов или блогов превращается в целый геморой. Но свои соображения и идеи по этому поводу я освещу в отдельно статье.

    1. Вывод записей. Решается просто вы добавляете в админ-моделе ( не знаю, как правильно назвать этот элемент джанги, ваш наследник от admin.ModelAdmin ) функцию

    1. def user_name(self,obj):
    2.         user = obj.user
    3.         return u'%s %s' %(user.first_name,user.last_name)
    4. user_name.short_description = u'Имя'

    и в list_display строку с именем этой функции

    2. Поиск. Тут все просто. В search_fields добавляем user__username
    3. Фильтры. Возможно вы мне подскажите, но у меня не получилось добавить поле из связной таблици в качестве фильтра. Поэтому я просто использую в админке как «основную» – ту таблицу, в которой поля будут использоваться в качестве фильтров. Надо будет залезть в исходники с грязными ногами и выяснить, что за лажа.

    4. Редактирование. Создаем отдельно форму и добавляем в ней новые поля, и переопределяем инициализацию и сохранение.

    1. class ProfileForm(forms.ModelForm):
    2.     first_name = forms.CharField(max_length=30,label=u'Имя')
    3.     last_name = forms.CharField(max_length=30,label=u'Фамилия')
    4.    
    5.     def __init__(self,*args,**kwargs):
    6.         super(ProfileForm,self).__init__(*args,**kwargs)
    7.         user = pr.user
    8.         self.initial.update({
    9.                 'first_name':user.first_name,
    10.                 'last_name':user.last_name
    11.             })
    12.        
    13.     def save(self,*args,**kwargs):
    14.         user = self.instance.user
    15.         user.first_name = self.cleaned_data['first_name']
    16.         user.last_name = self.cleaned_data['last_name']
    17.         user.save()
    18.         return super(ProfileForm,self).save(*args,**kwargs)
    19.        
    20.     class Meta:
    21.         model = M.StatusChatProfile

    Форму передаем нашей админ-моделе.
    С формой есть маленькая проблемка, на которую я наступил. В момент, когда вызывается super(…).save(…) фактическое сохрание данных еще не происходит. И это необходимо учитывать, в случае, если его “таблица напарник” при сохранении изменяет в нем же какие либо поля. Данные в этом случае перетрутся.

    Спасибо за внимание. Вам успехов и удачного дня.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]
  • 29Jul

    только что наткнулся на этот “АП”, хотя на самом деле – это такой сборничек маленьких полезных функций и пары декораторов. В принфипе ничего сверхестественного. Но смотреть всем обязательно.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 24Jun

    Пока мой ноут еще жив, а читатели делают ставки, я решил перед сном еще расковырять django-debug-tolbar.

    По сути все панели построены на хаках. Т.е. В архитектуре самого движка не закладывалась такая фишка. Т.е. К примеру берут класс BaseCache для из модуля django.core.cache.backends.base делают на его основе наследника, который делает тоже самое, только еще и считает. И заменяют полученный класс в модуле. Т.е. теперь там лежит «тулбарный» класс, и джанго для своей кухни будет брать его, а он уже будет делать свои «темные делишки».

    Я для своего csvlog выкавырял оттуда только sql. Теперь я могу еще и вести лог всех запросов, проходящих в вашем апе, и говорить, сколько времени они съели. Сделал сразу компонентную структуру, почти как у этого самого тулбара, так что если что можете отключать.

    А хак этот выглядит совсем не сложно:

    1. from django.db.backends import util
    2. import time
    3. from csvlog.middleware import glog
    4. class DatabaseStatTracker(util.CursorDebugWrapper):
    5.     def execute(self, sql, params=()):
    6.         start = time.time()
    7.         try:
    8.             return self.cursor.execute(sql, params)
    9.         finally:
    10.             stop = time.time()
    11.             glog.dbg(['__SQL__',stop-start,sql,unicode(params)])
    12. util.CursorDebugWrapper = DatabaseStatTracker

    Да, и я не тестил, но очень сильно подозреваю, что теперь кто-то из них двоих не сможет считать сюелины, и скорее всего тот, чей ап идет позже в INSTALLED_APPS.

    PS: Забыл предварительно проверить свободное место на винте. Бедняга должен умереть свободным.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 22Jun

    Исправил много мелких багов, но надо уже написать нормальную доку. Есть еще идея, взять кусочки из джанго тулбара и к примеру дать возможность выводить все СЮЛ запросы.

    Кроме того, сейчас пишу еще одно приложения – простое для принятия платежей. Хотя, получилась довольно универсальная фишка. Так вот в нем я использую эти логи, но есть вероятность, хотя и маленькая, но есть, что комуто логи эти будут не подуше, поетому я еще и заглушку сделал. Такие заглушки можно писать для взаимодейстивя между джанго приложений.

    В папку с аппом добовляем файлик extapp.py

    1. __all__ = ['glog']
    2. from django.conf import settings
    3. if 'csvlog' in  settings.INSTALLED_APPS:
    4.     from csvlog import glog
    5. else:
    6.     class glog():
    7.         @staticmethod
    8.         def get_log_func(self,*args):
    9.             return lambda *args:None
    10.     for n in ['err','imp','inf','log','trc','dbg']:
    11.         setattr(glog,n,staticmethod(lambda *args:None))

    проверяет есть ли апп, если нет, то пишем для него заглушку. А везде в коде просто юзаем

    1. from extapp import glog

    I love Python!

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 17Jun

    Когда делая выборку из объекта родителя и хочется получать объекты наследники, то я использую такой финт

    1. from django.db import models
    2.  
    3. class MBase(models.Model):
    4.     field1 = models.CharField(max_length=10)
    5.     field2 = models.CharField(max_length=10)
    6.     classname = models.CharField(max_length=10)
    7.     def save(self,*args,**kwargs):
    8.         self.classname = self.__class__.__name__.lower()
    9.         super(MBase,self).save(*args,**kwargs)
    10.     @property
    11.     def rel_obj(self):
    12.         return getattr(self, self.classname)
    13.    
    14. class MFirst(MBase):
    15.     myf1 = models.CharField(max_length=10)
    16.    
    17. class MSecond(MBase):
    18.     myf2 = models.CharField(max_length=10)

    А в коде выходит примерно следующее

    1. In [11]: M.MBase.objects.get(id=3)
    2. Out[11]: <MBase: MBase object>
    3.  
    4. In [12]: M.MBase.objects.get(id=3).rel_obj
    5. Out[12]: <MFirst: MFirst object>
    6.  
    7. In [13]: M.MBase.objects.get(id=3).rel_obj.myf1
    8. Out[13]: u'Hi1'

    PS: Чтоб не мучаться, можно вынести функционал в абстрактную модель.

    1. class RelatedBase(models.Model):
    2.     childclassname = models.CharField(max_length=20,editable=False)
    3.     def save(self,*args,**kwargs):
    4.         if not self.childclassname:
    5.             self.childclassname = self.__class__.__name__.lower()
    6.         super(RelatedBase,self).save(*args,**kwargs)
    7.     @property
    8.     def rel_obj(self):
    9.         return getattr(self, self.childclassname)
    10.     class Meta:
    11.         abstract=True

    а все базовые классы уже будут от нее наследоваться

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 07Jun

    django
    Хоть выкраить лишнюю минутку было более чем сложно. Последние две недели у меня Django-NonStop.

    Все основаное на идее, которую я описывал ранее.

    Вот, вчера ночью таки закончил. На самом деле я это штуку реализовал уже давно, просто захотелось упаковать в более продажный вид, ну и по случаю добавил там рюшечек всяких прикольных

    В репозитарии лежит пример использования этого приложения вместе с апом. Так что можете просто открыть settings.py и глянуть, какие поля в настройках необходимо добавить. Не стандартные поля помечены ##ADD

    Что под капотом?

    Возможность логить. (В шоке?)

    1. from django.http import HttpResponse
    2. from csvlog import glog
    3. def somelog(request):
    4.     glog('executin log by default name')
    5.     glog.err('ERR, some error hapend')
    6.     glog.imp('IMP, some important information')
    7.     glog.inf('INF, some information')
    8.     glog.log('LOG, some log')
    9.     glog.trc('TRC, some trace')
    10.     glog.dbg('DBG, debug information')
    11.     return HttpResponse('OK')

    И вы можете сами указывать какие данные из стека вы хотели бы сторить. Настройка представляет собой набор ссылок на функции.
    Автоматом сторятся данные реквеста и респонса. Точна также вы можете задавать какие куски этих объектов идут к вам в лог.

    Также под ваш лог, автомат создаётся объект в моделях csvlog.models.LogDump. И вы можете импортировать в него данные из логов и работать с ними через вашу ORM. Пожалуй это основной плюс.

    1. python manage.py log_to_base log.csv

    Ну и маленькая рюшечка в нагрузку. Баг репортинг.

    Все несловленные вами эксепшены, ловятся ей, и сторятся в базу. Я когда узнал, сколько всего можно то от ексепшена то узнать, я не был уверен, что мне базы то хватит. А пользователю выводится предложение еще и обматерить вас, ну т.е. оставить свой баг репорт.

    Проект очень, очень нуждается в жесткой критике.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

« Previous Entries   Next Entries »

Recent Posts

Recent Comments

  • похоже, опчатка...
  • JSONotEncode - Это JSON Not Encode? Не сразу это понял )...
  • В чем фишка этого маневра-дублирования?loads = json.l...
  • Очень понравилось!...
  • Если данные простые, я чаще всего пихаю их в ту же таблиц...