Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

среда, 10 октября 2012 г.

Применение классов при получении подробного решения онлайн

Задался Я целью сделать симплекс метод онлайн с подробным бесплатным решением.

Как известно, обычно, подробное решение должно быть разбито на шаги, чтобы стало ясно.

Чтобы было ясно и у меня в коде и чтобы не запутаться при написании такой сложной программы я ввел класс. Входящими параметрами в этот класс стали:
  • функция, для которой необходимо найти экстремум
  • этот экстремум является максимумом или минимумом
  • и система условий в симплекс-задаче в ввиде списка данных (python-словарей)
В __init__ (в конструкторе) инитятся какие-то глобальные вещи, например, свободные члены, искусственные переменные, преобразуются данные к удобным.

Далее, для каждого шага проверяется:
  • нужно ли выполнять соотв. шаг (в отдельном методе объекта данного класса).
  • В другом методе для данного шага выполняется преобразование входящих данных
  • записывается состояние (слепок) данных на каком-то шаге в свойство объекта класса. (Например, запоминаются данные после приведения системы условий к каноническому виду, как требует симплекс-метод)
  • Также в каком-то из методов для данного шага (на проверке или же преобразовании данных) - заполняются глобальные вещи, например, свободные переменные
 У нас всегда есть проходящие данные через все методы и куча слепков этих данных.

Далее полученный объект данного класса пихается в django-шаблон, где происходит вывод решения задачи симплекс методом простыми манипуляциями if и for.

Пример того, что получилось вы можете посмотреть по ссылке симлекс метод онлайн
(там есть текстовый пример, чтобы не скучали и видео пример)

воскресенье, 13 мая 2012 г.

Определение направление радиус-вектора от одной точки к другой точки

Допустим, у нас есть две точки, например, центр города и отель.

Нам нужно определить, в каком направлении нужно двигаться, чтобы при движении из центра города попасть в отель. Координаты центра города и отеля нам известны.
Для решения задачи:
  1. Ставим точку центра города на бумажке.
  2. Строим через эту точку вертикальную и горизонтальную линии (оси x и y координат)
  3. Строим конечную точку (отель)
  4. Определяем в какой зоне координат находится конечная точка (в --, ++, -+, +-)
  5. Далее определяем угол между осью x и y
  6. Смотрим чему равен угол, < 45 - 45/2, > 45 + 45/2 или находится между
Тем самым мы поймем в какой зоне находится наша точка - по северному, западному, южному, восточному направлению или северно-западному, северо-восточному, юго-западному, юго-восточному ли находится отель.

Код на языке python:

import math


def get_direction_name((lng_city, lat_city), (lng_hotel, lat_hotel)):
    direction = get_direction((lng_city, lat_city), (lng_hotel, lat_hotel))
    name = dict(DIRECTIONS)[direction]
    return name


def get_direction((lng_city, lat_city), (lng_hotel, lat_hotel)):

    diff_lat = lat_hotel - lat_city
    diff_lng = lng_hotel - lng_city

    if math.fabs(diff_lng) > 180:
        diff_lng -= 360*diff_lng/math.fabs(diff_lng)


    is_mm = (diff_lat < 0) and (diff_lng < 0) and 1 or 0
    is_pp = (diff_lat > 0) and (diff_lng > 0) and 1 or 0
    is_mp = (diff_lat > 0) and (diff_lng < 0) and 1 or 0
    is_pm = (diff_lat < 0) and (diff_lng > 0) and 1 or 0

    if diff_lng:
        arg = math.fabs(diff_lat/diff_lng)
        degree = math.atan(arg)*180/math.pi
    else:
        degree = 90

    on_diagonal = 45 - 45.0/2 < degree < 45 + 45.0/2 and 1 or 0
    below_diagonal = degree < 45 - 45.0/2 and 1 or 0
    above_diagonal = degree > 45 + 45.0/2 and 1 or 0

    print is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal

    direction_key = '{0}-{1}-{2}-{3}-{4}-{5}-{6}'.format(
        is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal,
    )
    direction = _direction_map[direction_key]
    return direction

NORTH_EAST = 'north-east'
NORTH_WEST = 'north-west'
SOUTH_EAST = 'south-east'
SOUTH_WEST = 'south-west'
NORTH = 'north'
SOUTH = 'south'
EAST = 'east'
WEST = 'west'

DIRECTIONS = [
   (NORTH_EAST, _(u'северо-восток')),
   (NORTH_WEST, _(u'северо-запад')),
   (SOUTH_EAST, _(u'юго-восток')),
   (SOUTH_WEST, _(u'юго-запад')),
   (NORTH, _(u'север')),
   (SOUTH, _(u'юг')),
   (EAST, _(u'восток')),
   (WEST, _(u'запад')),
]

# Key: is_pp-is_mm-is_pm-is_mp-on_diagonal-below_diagonal-above_diagonal
_direction_map = {
    '1-0-0-0-1-0-0': NORTH_EAST,
    '1-0-0-0-0-1-0': EAST,
    '1-0-0-0-0-0-1': NORTH,
    '0-1-0-0-1-0-0': SOUTH_WEST,
    '0-1-0-0-0-1-0': WEST,
    '0-1-0-0-0-0-1': SOUTH,
    '0-0-1-0-1-0-0': SOUTH_EAST,
    '0-0-1-0-0-1-0': EAST,
    '0-0-1-0-0-0-1': SOUTH,
    '0-0-0-1-1-0-0': NORTH_WEST,
    '0-0-0-1-0-1-0': WEST,
    '0-0-0-1-0-0-1': NORTH,
}

суббота, 10 декабря 2011 г.

django import excel

This publication is present of django system for import data from excel:

Use this step by step for rapid start use wih django application:

1. Follow to page https://github.com/satels/django-import-excel and push the button Watch
2.Download this project https://github.com/satels/django-import-excel/zipball/master
3. Unpack, following to the folder and run pip install -e . or python setup.py install
4. In settings.py:

INSTALLED_APPS = [
     ...
     'import_excel',
     ...
]

5. So, for example, you need  import the data from excel for model


class Book(models.Model):

    name = models.CharField(max_length=255)
    author = models.CharField(max_length=255)


The excel file contains the data

name | author
Tom Sawyer | Mark Twain
The Sands of Mars | Arthur C. Clarke

To do is, create this form:

from django.db import transaction
from import_excel.forms import ImportExcelForm


class BookImportForm(ImportExcelForm):

    @transaction.autocommit
    def update_callback(self, request, converted_items):
         for book_item in converted_items[:1]:
              name = book_item[0]
              author = book_item[1]
              Book.objects.create(name=name, author=author)


Далее, в urls.py:

urlpatterns = patterns('',
      url(r'^/books/import-from-excel/$', permission_required('books.add_book')(import_excel), {
             'FormClass': BookImportForm, 'next_url': '/books/', 'with_good': True, 'template_name': 'import_excel/import_excel.html',
      }, name='book-import-excel'),
),


We see this in import book form , next_url - the url of page for redirect after succefull import request, with_good - it means, what must pre moderate data from excel file, also you must set template_name, if you have custom template (copy file from import_excel/templates/import_excel/import_excel.html)

P.S. permission_required for django admin zone

django импорт excel

Появилась очень удобная система для импорта данных из excel в django:

Чтобы начать использовать это приложение django в своем проекте:

1. Переходим на страницу https://github.com/satels/django-import-excel и нажимаем кнопку Watch
2.Скачиваем проект себе https://github.com/satels/django-import-excel/zipball/master
3. Распаковываем, переходим в папку и запускаем pip install -e . или же python setup.py install
4. В settings.py:

INSTALLED_APPS = [
     ...
     'import_excel',
     ...
]

5. Итак, например, нам надо импортировать данные из excel для модели


class Book(models.Model):

    name = models.CharField(max_length=255)
    author = models.CharField(max_length=255)


Файл excel же содержит данные

name | author
Мастер и Маргарита | Михаил Булгаков
И дольше века длится день | Чингиз Айтматов

Для этого создаем форму

from django.db import transaction
from import_excel.forms import ImportExcelForm



class BookImportForm(ImportExcelForm):

    @transaction.autocommit
    def update_callback(self, request, converted_data):
         for book_item in converted_data[1:]:
              name = book_item[0]
              author = book_item[1]
              Book.objects.create(name=name, author=author)


Далее, в urls.py:

urlpatterns = patterns('',
      url(r'^/books/import-from-excel/$', permission_required('books.add_book')(import_excel), {
             'FormClass': BookImportForm, 'next_url': '/books/', 'with_good': True, 'template_name': 'import_excel/import_excel.html',
      }, name='book-import-excel'),
),


Видим здесь мы указываем форму для загрузки книг, next_url - страницу для перехода после успешной загрузки, with_good - это значит, что надо подтвердить загружаемые данные с предварительным просмотром, также вы можете указывать template_name, если захотите задать свой (скопируйте файл из import_excel/templates/import_excel/import_excel.html)

четверг, 22 сентября 2011 г.

Расширение возможностей distance_of_time_in_words

В некоторых случаях `distance_of_time_in_words` возвращает строку, которая плохо подходит по смыслу в контекст. Например, эта функция выглядит естественно для того, чтобы сообщить, что какой-то объект datetime был изменен или должен быть изменен:

- "Вылет задерживается на 2 часа 13 минут".
- "Вы приземлились в Екатеринбурге, переведите свои часы на 2 часа вперед".
- "Заявка будет выполнена на 2 часа 15 минут позже".

При использовании оригинальной функции мы получим:

- "Вылет задерживается на через 2 часа 13 минут".
- "Вы приземлились в Екатеринбурге, переведите свои часы на через 2 часа".
- "Заявка будет выполнена на через 2 часа 15 минут".

Предлагаемый подход позволяет просто отнаследоваться от класса DistanceCounter и переопределить `format_result_str`, например, так.

class DistanceCounter(dt.DistanceCounter):
def format_result_str(self, in_future, result_str):
suffix = in_future and u'позже' or u'раньше'
return u'%s %s' % (result_str, suffix)


Обратная совместимость полностью сохраняется.


Коммит в https://github.com/satels/pytils Update: Коммит похоже заберет автор pytils к себе в репозиторий

понедельник, 19 сентября 2011 г.

nginx security link в python

Генерирование секретной строки для модуля nginx security_link в python

import base64
import hashlib

base64.b64encode(hashlib.md5("SECRET").digest()).replace('+', '-').replace('/', '_').replace("=", "")

понедельник, 12 сентября 2011 г.

Парсер сайтов на python для сайта афишы

Есть такой прикольный парсер сайтов на python - называется scrapy

Ссылка: http://scrapy.org - там есть прекрасный пример для старта.

Если кому-то что-то не понятно, то пишите вопросы в комментариях - я обязательно отвечаю.

Я использовал его для получения новых мероприятий и мест для сайта http://ekafisha.ru - сайт афишы в Екатеринбурге. Посмотрите туда, видно что эта система прекрасно работает.

суббота, 9 июля 2011 г.

django-qiwi. Платежная система на django - киви. SOAP-сервер

Итак, как же установить и запустить платежную систему qiwi на django. Делаем все по шагам и у вас получится.
Здесь не рассматриваются шаги по регистрации в системе qiwi. Здесь рассматривается техническая часть (Хотелось бы только сказать, что в кабинете qiwi нужно включить soap)

Скачиваем и устанавливаем приложение

  1. Скачиваем отсюда https://github.com/satels/django-qiwi/zipball/master
  2. Распаковываем
  3. Устанавливаем
    python setup.py install
Или же все одним шагом
pip install -e git://github.com/satels/django-qiwi.git#egg=django-qiwi

Делаем установки django-qiwi в ваш проект.

В settings.py django-проекта
INSTALLED_APPS = [
    ...
    'django_qiwi',
    ...
]

#qiwi soap
QIWI_APP = 'qiwi'
QIWI_LOGIN = '12345'
QIWI_PASSWORD = 'SecretPAroli'
QIWI_SOAP_SERVER = ('0.0.0.0', 17555)

Здесь вы указываете QIWI_APP backend-приложение (app), который будет обрабатывать ваши объекты счетов и платежей (про это ниже)
Про логин и пароль все ясно.
Далее, QIWI_SOAP_SERVER - здесь указывается хост и порт, на которых будет запускаться qiwi soap сервер для обработки оповещений со стороны QIWI.

Интегрируем с вашей системой платежей (счета, платежи)

  1. Прикручиваем форму для создания платежа (Мы сообщаем QIWI о создании счета)
  2. Делаем Backend-приложение (QIWI сообщает нам - удачно или нет прошел платеж)

Форма создания платежа

Вот как обрабатывается у меня создания платежа
from django_qiwi import get_status_text
from django_qiwi.soap.client import Client as QiwiClient
...
                client = QiwiClient()
                code = client.createBill(
                    phone=client_phone,
                    amount=sum,
                    comment=comment,
                    txn=invoice.id,
                    lifetime=datetime.now() + timedelta(1),
                )
                if code in [0, 50]:
                    return redirect(invoice.get_qiwi_url())
                else:
                    messages.error(request,
                       MESSAGE_QIWI_ERROR % get_status_text(code)
                    )
                    buy_denial_by_invoice(invoice)
...

Видно, что создаем платеж и оповещаем через soap - оповещаем друзей роботов из QIWI,
при удачном исходе - код 0 или 50 - переадресуем клиента на страницу с инструкцией, как оплатить, или же сообщаем о ошибке и отменяем платеж.

Что же такое указано в QIWI_APP?

Теперь, как же будет нас оповещать qiwi о удачном платеже. Будет через backend, который мы создали и указали в переменной QIWI_APP
Указан пакет в вашем проекте django. Структура такая:
qiwi
    __init__.py
или такая
qiwi.py
Содержание qiwi примерно такое будет у вас (Я взял из своего проекта)
from discounts.utils import buy_denial_by_invoice, buy_paided_by_invoice
from django.conf import settings
from django_qiwi.soap.client import Client as QiwiClient
from invoices.models import Invoice
import datetime
import logging


def update_bill(txn, status):
    client = QiwiClient()
    response = client.checkBill(txn)
    code = response['status']
    amount = response['amount']
    amount = float(amount)
    invoices = Invoice.objects.filter(
        id=txn, status=Invoice.STATUS.nopaid, type='qiwi',
    )
    if invoices.exists():
        invoice = invoices[0]
        if code == 60:
            buy_paided_by_invoice(invoice, amount)
            ret = 0
        elif code in [150, 160, 161]:
            buy_denial_by_invoice(invoice)
            ret = 0
        else:
            ret = -1
    else:
        ret = 210
    logging.basicConfig(filename=settings.QIWI_LOG_FILE, level=logging.DEBUG)
    dt = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    message = 'date: %s, txn: %s, code: %s, amount: %s, ret:%s' % (
        dt, txn, code, amount, ret
    )
    logging.debug(message)
    return ret

Т.е. вот здесь проверяется при оповещении о платеже - есть ли неоплаченный платеж, то если есть, то оплачиваем его, если пришло оповещение о оплаченном платеже или же не оплачиваем.
Такж же можем сообщить, что платежа не существует

Запускаем тесты

При каждом последующем изменении кода - запускаем тесты, чтобы точно ничего не отвалилось при оплате у клиента
Создаем подмену для QIWI - мы будем отсылать оповещения ему о создании платежа
#coding:utf-8
from django_qiwi.soap import server
from settings import QIWI_PASSWORD, QIWI_LOGIN
from threading import Thread
import SOAPpy
import qiwi

class QiwiProviderThread(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.setDaemon(True)
        self.server = self._createSOAPServer()
        self.data = {}
        self.paid = False

    def _createSOAPServer(self):
        server = SOAPpy.SOAPServer(('localhost', 77877))

        def createBill(login, password, user, amount, comment, txn, lifetime, alarm, create):
            if not all([login==QIWI_LOGIN, password==QIWI_PASSWORD]):
                return 150
            if len(user) != 10:
                return 150
            try:
                amount = float(amount)
            except:
                return 150
            if amount > 15000:
                return 242
            if alarm not in [0, 1, 2]:
                return 150
            if create not in [0, 1]:
                return 150
            self.data = {
                'user': user,
                'amount': amount,
                'comment': comment,
                'txn': txn,
                'lifetime': lifetime,
                'alarm': alarm,
                'create':create,
                'date': datetime.now().strftime("%d.%m.%Y %H:%M:%S")
            }
            return 50

        def checkBill(login, password, txn):
            if txn != self.data['txn']:
                return 210
            res = dict(self.data, **{
                'status': self.paid and 60 or 52
            })
            return res

        server.registerFunction(createBill)
        server.registerFunction(checkBill)
        return server

    def run(self):
        self.server.serve_forever()

    def stop(self):
        self.server.shutdown()
        del self.server
        self.join()

    def bayWithQiwi(self, txn, amount):

        lifetime = self.data['lifetime']

        if datetime.strptime(lifetime, '%d.%m.%Y %H:%M:%S') < datetime.now():
            raise ValueError(u'Нельзя оплатить. Срок оплаты прошел')

        self.paid = True
        self.data['amount'] = str(amount)

        qiwi.update_bill(txn=txn, status=60)

- запускается поток, который запускает подмену soap серверу системы. Даже есть подмена клиенту, который пошел оплачивать через терминал QIWI! (bayWithQiwi). Сам тест
class QiwiBayTest(test.TestCase, _InvoiceTest, _BayTest, _QiwiTest):

    def setUp(self):
        super(QiwiBayTest, self)._setUp()
        self.qiwi_provider = QiwiProviderThread()
        self.qiwi_provider.start()
        initial = self.default_initial
        self.default_initial = dict(initial, **{'payment_method': 'qiwi'})

    def tearDown(self):
        super(QiwiBayTest, self)._tearDown()
        self.qiwi_provider.stop()

    def testBayWithQiwiAmountLessThenPrice(self):
        """Оплачиваем скидку через QIWI, но кладем меньшую сумму, чем надо"""
        response = self._postData(self.default_initial)
        invoice = self._assertExistQiwiInvoice()
        self._assertFollowToQiwiInvoicePage(response, invoice)
        amount = self.discount.price_paid*0.8
        self.qiwi_provider.bayWithQiwi(invoice.id, amount)
        self._refreshUser()
        invoice = self._getRefreshedInvoice(invoice)
        self._assertParentInvoiceNoPaid(invoice)
        self._assertUserBalance(amount + self.initial_sum)
        invoice.delete()

    def testBayWithQiwiAmountGreateThenPrice(self):
        """Оплачиваем скидку через QIWI, но кладем большую сумму, чем надо"""
        data = self.default_initial
        response = self._postData(data)
        invoice = self._assertExistQiwiInvoice()
        self._assertFollowToQiwiInvoicePage(response, invoice)
        amount = self.discount.price_paid*data['number'] - self.initial_sum
        self.qiwi_provider.bayWithQiwi(invoice.id, amount)
        self._refreshUser()
        invoice = self._getRefreshedInvoice(invoice)
        self._assertParentInvoicePaid(invoice)
        self._assertUserBalance(0.0)
        invoice.delete()

    def testBayWithQiwiAndBalanceGreateThenPrice(self):
        """Оплачиваем скидку через QIWI, при этом баланс на счете большой"""
        data = self.default_initial
        sum = self.discount.price_paid*data['number']
        update_balance(self.user, sum)
        balance_before = self.user.get_profile().get_balance()
        response = self._postData(data)
        invoice = self._assertExistQiwiInvoice()
        self._assertFollowToQiwiInvoicePage(response, invoice)
        amount = self.initial_sum
        self.qiwi_provider.bayWithQiwi(invoice.id, amount)
        self._refreshUser()
        invoice = self._getRefreshedInvoice(invoice)
        self._assertParentInvoicePaid(invoice)
        self._assertUserBalance(balance_before + amount - sum)
        invoice.delete()

    def testSomeErrorOnQiwiProvider(self):
        """Ошибка на сервере QIWI, например, превышена сумма платежа(> 15000)"""
        data = dict(self.default_initial, **{
            'number': int(16000.0/self.discount.price_paid)
        })
        response = self._postData(data)
        self._assertFollowToBayPage(response)
        self._assertCountMessages(response, 1)
        invoice = self._assertExistQiwiInvoice()
        self._assertParentInvoiceDenial(invoice)

    def _assertExistQiwiInvoice(self):
        return self._assertExistInvoiceByType('qiwi')
Не забудьте в файле test_settings.py (настройках settings.py для тестов) указать примерно такое from settings import * QIWI_SOAP_ISHOP_URL = 'http://localhost:77877' QIWI_SOAP_SERVER = ('localhost', 17777) А потом запускать так ./manage.py test --settings="test_settings.py"

Запускаем сервер soap для взаимодействия с qiwi

Чтобы просто попробовать, как работает - запускаем так: python manage.py run_qiwi_soap В продакшн версии нужно запускать подобное через sv (что такое sv): Используем файл из приложения django_qiwi: https://github.com/satels/django-qiwi/blob/master/qiwi_soap_server.sh.example Далее, создаем /etc/service/qiwi_soap_server/run и делаем его исполняемым, копируем содержание файла qiwi_soap_server.sh.example в него

Запускаем
sv u qiwi_soap_server

Все должно работать. Пишите комментарии

суббота, 25 июня 2011 г.

Ускорение тестов в django

Если у вас имеется проект django, в котором имеется порядка 100 тестов с созданием 100 объектов, то можно использовать для ускорения тестов модуль для django:
https://gist.github.com/1044215 - там в doc-комментарии написано как применять
В нашем проекте тест ускорился в 20 раз

пятница, 3 июня 2011 г.

Работа с doc, pdf, odt, html в django

Иногда нам нужно формировать документы динамически в django проекте.
Хотелось бы иметь общий формат документа, из которого можно было бы в легкую переводить в doc (word), pdf, html форматы.
В проекте django-webodt был выбран формат ODF.
Описание проекта из README:
django-webodt - это django модуль для создания документов различных форматов из формата Open Document Templates.
Django-webodt поддерживает виртуально все форматы через backend приложения. Есть позитивный опыт создания PDF, HTML, RDF and MS Word (.doc) документов.

Конверсия документов производится с помощью внешних приложений, где приложения работают в django-webodt через backend's

ooffice: Используется опенофис для конвертирования в различные форматы. Опен офис должен быть запущен как демон.

abiword: легковесный конвертер, но результат выглядит не очень красиво для сложных документов (проверено на практике)

googledocs: используется бесплатный сервис Google. Имеются вроде как ограничения в ресурсах, а также нужно регистрироваться в Google.


Итак, что нужно делать, чтобы начать работать с django-webodt:
  1. Установка:
    pip install django-webodt

  2. В settings.py проекта django:
    INSTALLED_APPS = (
    ...
    'webodt',
    )
  3. Для примера - используем abiword
    WEBODT_CONVERTER = 'webodt.converters.abiword.AbiwordODFConverter'

  4. Укажем, где искать шаблоны odt
    WEBODT_TEMPLATE_PATH = '.../webodt/templates/'

  5. Укажем, где искать шаблоны odt
    WEBODT_TEMPLATE_PATH = '.../webodt/templates/'

  6. Использование
    $ ./manage.py shell
    >>> from django.template import Context
    >>> import webodt
    >>> template = webodt.ODFTemplate('test.odt')
    >>> context = dict(user='John Doe', balance=10.05)
    >>> document = template.render(Context(context))

    Документ
    >>> document
    <open file '/tmp/tmpL0AKCV.odt', mode 'rb' at 0xa7c39ec>

    Это реальный файл
    >>> document.__class__
    <class 'webodt.ODFDocument'>
    >>> import os
    >>> os.path.isfile(document.name)
    True
    >>> document.close()
    >>> os.path.isfile(document.name)
    False
    Установите delete_on_close=False в render, чтобы документ не удалялся

  7. Пример конвертирования в pdf:
    >>> document = template.render(Context(context))
    >>> from webodt.converters import converter
    >>> conv = converter()
    >>> pdf = conv.convert(document, format='pdf')
    >>> pdf
    <open file '/tmp/tmpYuAhhN.pdf', mode 'r' at 0xa7c3dfc>

Недавно мы сделали, чтобы можно было редактировать шаблоны-документы прямо в libreoffice (но включать бекенд под название опен офис надо) - раньше надо было править content.xml внутри odt.
Только надо быть внимательнее с тегами, такими как if - вставлять их под одним тегом, чтобы структура файла xml не нарушилась и документ не сломался.
Также скоро появится коммит, чтобы можно было вставлять цикл, подобный for прямо тоже как при обычном редактировании odt-файла в libreoffice.

Итак, чтобы использовать openoffice бакенд - используем команду в shell
soffice '-accept=socket,host=127.0.0.1,port=2002;urp;StarOffice.NamingService' -headless
, в это в settings.py проекта django для настройки
OOFFICE_SERVER = ('127.0.0.1', 2002)
WEBODT_CONVERTER = 'webodt.converters.openoffice.OpenOfficeODFConverter'


Для использования сервиса google:
WEBODT_CONVERTER = 'webodt.converters.googledocs.GoogleDocsODFConverter'


Постоянная ссылка на документацию:http://packages.python.org/django-webodt/

Update: Если хотим получить документ html без скачивания, то передаем параметр inline=True в render_to_response:
render_to_response(..., inline=True)
Update 2: Заместо soffice лучше использовать libreoffice.

вторник, 5 апреля 2011 г.

Из datetime в timestamp и обратно

Для python  версии 2:

Из datetime в timestamp
import datetime
import time
dt = datetime.datetime.now() # datetime, из которой переводим в timestamp
print time.mktime(dt.timetuple()) # Вот, а это timestamp

Из timestamp в datetime
import datetime
timestamp = 1301990622 # timestamp, из которого переводим
print datetime.datetime.fromtimestamp(timestamp) # Результат будет требующийся datetime
 

Для python3 (спасибо, Илья Петраш):

from datetime import datetime
timestamp = datetime.today().timestamp()
print(timestamp) 

пятница, 7 января 2011 г.

Решение системы уравнений методом Гаусса на python

Для решения системы линейных уравнений методом Гаусса использовался numpy
Ссылка на сервис (там приводится также и пример)

четверг, 12 августа 2010 г.

Запуск очень простого файлового сервера на python

Т.к. сервер очень простой, то и строка для запуска очень простая:
python -m SimpleHTTPServer 8000

среда, 12 мая 2010 г.

Простые числа в python (prime number in python)

В python можно реализовать с помощью функции простые числа (возвращает список простых чисел (list of prime number))
#encoding:utf8
import math

def get_simple_list(n):
 a = dict([(i, True) for i in range(2, n+1)])
 q = math.floor(math.sqrt(n))
 for i in range(2, q+1):
  if a[i]:
   j = i**2
   while j <= n:
    a[j] = False
    j += i
 return set([p for p, flag in a.items() if flag]) 

А пример реализации простых чисел (prime numbers) в javascript можно найти в исходном коде по ссылке Calculator prime numbers

вторник, 27 апреля 2010 г.

Рекурсивное получения всех файлов в python

Получить рекурсивно названия всех файлов, начиная с заданной рутовой в python:

import os
import sys
fileList = []
rootdir = sys.argv[1]
for root, subFolders, files in os.walk(rootdir):
    for file in files:
        fileList.append(os.path.join(root,file))
print fileList

среда, 24 марта 2010 г.

Обновление-синхронизация модели и базы в Django

Обновление (синхронизация) базы и модели в Django в стандартной комплектации нельзя произвести. Команда
python manage.py syncdb

только создает таблицы, но не обновляет при соотв. изменениях в модели. Приходится удалять таблицы и снова запускать вышеуказанную команду.
Но выход есть в использовании south (http://south.aeracode.org/):
  • Устанавливаем:
    sudo easy_install south
  • В INSTALLED_APPS добавляем:
    'south',
  • Допустим, чтобы синхронизовать добавленное поле title_small в articles.Article
    $ python manage.py schemamigration articles title_section --add-field Article.title_small
    $ python manage.py migrate articles
    Здесь title_section - это имя миграции

Организация импортов и списков eclipse python

В pydev eclipse организация (сортировка) по алфавиту импортов и списков (элементы перенесены на новую строку) делается с помощью сочетания клавиш Cntrl + Shift + O

понедельник, 22 марта 2010 г.

Компиляция python code в linux (ubuntu)

Иногда нужно из python кода получить бинарник (скомпилированный файл). У меня такая задача возникла на linux (в ubuntu)

Эту проблему легко решает библиотека на python, которая называется cx_Freeze (домашняя страница http://cx-freeze.sourceforge.net/)
Для установке в ubuntu запускаем в командной строке:

sudo apt-get install cx-freeze

На официальном сайте дается пример

cxfreeze hello.py --target-dir dist

где в hello.py рассмотрен самый простой случай:

print "Hello, World!"

Мне же нужен более сложный случай.
Возникали ошибки вроде такой

LookupError: unknown encoding: ascii

Я решил проблему так, как указано в документации

cxfreeze start.py --target-dir dist --include-module=encodings.utf_8,encodings.latin_1,encodings.ascii

Видно, что импортировал дополнительно модули encodings.utf_8,encodings.latin_1,encodings.ascii

google-adsense-parser

google adsense parser оказывается легко реализовать на python.
Надо использовать mechanize (mechanize - это библиотека на python, которая позволяет работать с web как browser. Только вот не знаю, можно ли использовать javascript)
Итак, сам код

import mechanize

root_url = 'https://www.google.com/adsense/login/en/'
email = "xxx"
passwd = "xxx"

br = mechanize.Browser()
home_page = br.open(root_url)
br.follow_link(text="Take me to my account.")
br.select_form(nr=0)
br['Email'] = email
br['Passwd'] = passwd
result_page = br.submit()

Видно, как мы с помощью этого браузера заходим на страницу https://www.google.com/adsense/login/en/ , далее, переходим по ссылке с текстом "Take me to my account.". На полученной странице логинимся и в переменной result_page уже хранится текст со страницы https://www.google.com/adsense/report/overview . Этот полученный текст можно парсить например с помощью BeautifulSoup

среда, 18 ноября 2009 г.

Быстрая почтовая отправка

вычитал:

Для всяческих тестирований можно по-быстрому запустить smtp-сервер

python -m smtpd -n -c DebuggingServer localhost:1025